{"version":3,"file":"index.mjs","sources":["../node_modules/three/build/three.module.js","../node_modules/ts-browser-helpers/dist/bundle.esm.js","../src/utils/browser-helpers.ts","../src/utils/shaders/simpleCameraHelpers.glsl","../src/utils/shaders/cameraHelpers.glsl","../src/utils/shaders/randomHelpers.glsl","../src/utils/shaders/defaultVertex.glsl","../src/utils/shaders/defaultFragment.glsl","../src/utils/shaders/voronoiNoise.glsl","../src/utils/shaders.ts","../node_modules/uiconfig.js/dist/index.mjs","../src/utils/ViewerTimeline.ts","../node_modules/stats.js/build/stats.min.js","../src/utils/GLStatsJS.ts","../src/utils/CustomContextMenu.ts","../src/utils/Dropzone.ts","../node_modules/three/examples/jsm/controls/OrbitControls.js","../src/three/controls/OrbitControls3.ts","../src/three/controls/TransformControls.js","../src/three/controls/PivotControls.ts","../src/three/controls/FirstPersonControls2.ts","../src/three/controls/PointerLockControls2.ts","../src/three/controls/DeviceOrientationControls2.ts","../src/three/controls/OrbitControls2.ts","../src/three/math/Box3B.ts","../src/three/utils/bbox.ts","../src/three/utils/cache.ts","../src/three/utils/conversion.ts","../src/three/utils/decorators.ts","../src/three/utils/encoding.ts","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../src/three/utils/misc.ts","../src/three/utils/texture.ts","../src/three/utils/const-mappings.ts","../src/three/utils/constants.ts","../src/three/utils/ObjectPicker.ts","../src/three/utils/gpu-instancing.ts","../node_modules/three/examples/jsm/shaders/HorizontalBlurShader.js","../node_modules/three/examples/jsm/shaders/VerticalBlurShader.js","../src/three/utils/HVBlurHelper.ts","../src/three/utils/snapObject.ts","../src/three/utils/MaterialPreviewGenerator.ts","../node_modules/three/examples/jsm/lines/LineSegmentsGeometry.js","../node_modules/three/examples/jsm/lines/LineMaterial.js","../node_modules/three/examples/jsm/lines/LineSegments2.js","../src/three/utils/ViewHelper2.ts","../src/three/utils/curve.ts","../src/three/utils/camera.ts","../src/utils/serialization.ts","../src/utils/shader-helpers.ts","../src/utils/gltf.ts","../node_modules/@repalash/popmotion/node_modules/tslib/tslib.es6.js","../node_modules/hey-listen/dist/hey-listen.es.js","../node_modules/@repalash/popmotion/dist/es/utils/clamp.mjs","../node_modules/@repalash/popmotion/dist/es/animations/utils/find-spring.mjs","../node_modules/@repalash/popmotion/dist/es/animations/generators/spring.mjs","../node_modules/@repalash/popmotion/dist/es/utils/progress.mjs","../node_modules/@repalash/popmotion/dist/es/utils/mix.mjs","../node_modules/style-value-types/dist/es/utils.mjs","../node_modules/style-value-types/dist/es/numbers/index.mjs","../node_modules/style-value-types/dist/es/numbers/units.mjs","../node_modules/style-value-types/dist/es/color/utils.mjs","../node_modules/style-value-types/dist/es/color/hsla.mjs","../node_modules/style-value-types/dist/es/color/rgba.mjs","../node_modules/style-value-types/dist/es/color/hex.mjs","../node_modules/style-value-types/dist/es/color/index.mjs","../node_modules/style-value-types/dist/es/complex/index.mjs","../node_modules/@repalash/popmotion/dist/es/utils/hsla-to-rgba.mjs","../node_modules/@repalash/popmotion/dist/es/utils/mix-color.mjs","../node_modules/@repalash/popmotion/dist/es/utils/inc.mjs","../node_modules/@repalash/popmotion/dist/es/utils/pipe.mjs","../node_modules/@repalash/popmotion/dist/es/utils/mix-complex.mjs","../node_modules/@repalash/popmotion/dist/es/utils/interpolate.mjs","../node_modules/@repalash/popmotion/dist/es/easing/utils.mjs","../node_modules/@repalash/popmotion/dist/es/easing/index.mjs","../node_modules/@repalash/popmotion/dist/es/animations/generators/keyframes.mjs","../node_modules/@repalash/popmotion/dist/es/animations/generators/decay.mjs","../node_modules/@repalash/popmotion/dist/es/animations/utils/detect-animation-from-options.mjs","../node_modules/framesync/dist/es/on-next-frame.mjs","../node_modules/framesync/dist/es/create-render-step.mjs","../node_modules/framesync/dist/es/index.mjs","../node_modules/@repalash/popmotion/dist/es/animations/utils/elapsed.mjs","../node_modules/@repalash/popmotion/dist/es/animations/index.mjs","../src/utils/animation.ts","../src/utils/camera-anim.ts","../src/utils/lerp.ts","../src/utils/color-encodings.ts","../src/utils/canvas-snapshot.ts","../src/utils/AnimationObject.ts","../src/utils/objectProcessor.ts","../src/assetmanager/import/DataUrlLoader.ts","../src/utils/TextSVG.ts","../src/viewer/AViewerPlugin.ts","../src/core/object/IObjectUi.ts","../src/core/geometry/iGeometryCommons.ts","../src/materials/MaterialExtender.ts","../src/ui/image-ui.ts","../src/core/material/IMaterialUi.ts","../src/core/material/threeMaterialPropList.ts","../src/core/material/UnlitMaterial.ts","../src/core/material/iMaterialCommons.ts","../src/plugins/pipeline/shaders/GBufferPlugin.mat.vert.glsl","../src/plugins/pipeline/shaders/GBufferPlugin.mat.frag.glsl","../src/core/material/ShaderMaterial2.ts","../src/plugins/pipeline/GBufferMaterial.ts","../src/utils/line-material.ts","../src/core/object/iObjectCommons.ts","../src/core/camera/CameraView.ts","../src/core/object/iCameraCommons.ts","../src/core/camera/PerspectiveCamera2.ts","../src/core/camera/OrthographicCamera2.ts","../src/core/material/ExtendedShaderMaterial.ts","../src/core/material/PhysicalMaterial.ts","../src/core/material/ObjectShaderMaterial.ts","../src/core/material/UnlitLineMaterial.ts","../src/core/material/LineMaterial2.ts","../src/core/material/LegacyPhongMaterial.ts","../src/core/object/Object3D2.ts","../src/core/object/Group2.ts","../src/core/object/Mesh2.ts","../src/core/object/InstancedMesh2.ts","../node_modules/three/examples/jsm/lines/LineGeometry.js","../node_modules/three/examples/jsm/lines/Line2.js","../src/core/object/MeshLine.ts","../src/core/object/MeshLineSegments.ts","../src/core/geometry/BufferGeometry2.ts","../src/core/geometry/LineGeometry2.ts","../src/core/geometry/LineSegmentsGeometry2.ts","../node_modules/three/examples/jsm/lines/WireframeGeometry2.js","../src/core/geometry/WireframeGeometry3.ts","../src/core/geometry/TubeShapeGeometry.ts","../src/core/geometry/EllipseCurve3D.ts","../src/core/object/iLightCommons.ts","../src/core/light/AmbientLight2.ts","../src/core/light/DirectionalLight2.ts","../src/core/light/HemisphereLight2.ts","../src/core/light/PointLight2.ts","../src/core/light/RectAreaLight2.ts","../src/core/light/SpotLight2.ts","../src/core/ITexture.ts","../src/core/IRenderer.ts","../src/core/object/RootScene.ts","../node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/three/examples/jsm/postprocessing/RenderPass.js","../node_modules/three/examples/jsm/shaders/CopyShader.js","../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../src/postprocessing/ExtendedShaderPass.ts","../src/postprocessing/GenericBlendTexturePass.ts","../src/postprocessing/ExtendedRenderPass.ts","../src/postprocessing/ExtendedCopyPass.ts","../src/postprocessing/GBufferRenderPass.ts","../src/postprocessing/ScreenPass.glsl","../src/postprocessing/ScreenPass.ts","../src/postprocessing/sortPasses.ts","../node_modules/three/examples/jsm/postprocessing/MaskPass.js","../node_modules/three/examples/jsm/postprocessing/EffectComposer.js","../src/postprocessing/EffectComposer2.ts","../src/rendering/RenderTarget.ts","../src/rendering/RenderTargetManager.ts","../src/assetmanager/Importer.ts","../src/assetmanager/AssetImporter.ts","../node_modules/three/examples/jsm/utils/TextureUtils.js","../node_modules/three/examples/jsm/exporters/GLTFExporter.js","../src/assetmanager/export/GLTFWriter2.ts","../src/assetmanager/gltf/GLTFLightExtrasExtension.ts","../src/assetmanager/gltf/GLTFMaterialExtrasExtension.ts","../src/assetmanager/gltf/GLTFMaterialsAlphaMapExtension.ts","../src/assetmanager/gltf/GLTFMaterialsBumpMapExtension.ts","../src/assetmanager/gltf/GLTFMaterialsDisplacementMapExtension.ts","../src/assetmanager/gltf/GLTFMaterialsLightMapExtension.ts","../src/assetmanager/gltf/GLTFObject3DExtrasExtension.ts","../src/assetmanager/import/RGBEPNGLoader.ts","../src/assetmanager/gltf/GLTFViewerConfigExtension.ts","../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../src/assetmanager/gltf/gltfEncyptionHelpers.ts","../src/assetmanager/import/SimpleJSONLoader.ts","../src/assetmanager/import/JSONMaterialLoader.ts","../src/assetmanager/import/MTLLoader2.ts","../src/assetmanager/import/OBJLoader2.ts","../node_modules/three/examples/jsm/libs/fflate.module.js","../node_modules/three/examples/jsm/curves/NURBSUtils.js","../node_modules/three/examples/jsm/curves/NURBSCurve.js","../node_modules/three/examples/jsm/loaders/FBXLoader.js","../src/assetmanager/import/FBXLoader2.ts","../src/assetmanager/import/ZipLoader.ts","../src/assetmanager/import/GLTFLoader2.ts","../node_modules/three/examples/jsm/loaders/DRACOLoader.js","../src/assetmanager/import/DRACOLoader2.ts","../node_modules/three/examples/jsm/loaders/EXRLoader.js","../node_modules/three/examples/jsm/loaders/3DMLoader.js","../src/assetmanager/import/Rhino3dmLoader2.ts","../src/assetmanager/import/SVGTextureLoader.ts","../src/assetmanager/import/VideoLoader.ts","../src/assetmanager/import/VideoTextureLoader.ts","../src/assetmanager/export/GLTFExporter2.ts","../src/assetmanager/export/SimpleJSONExporter.ts","../src/assetmanager/export/SimpleTextExporter.ts","../node_modules/three/examples/jsm/exporters/EXRExporter.js","../src/assetmanager/export/EXRExporter2.ts","../src/assetmanager/export/assetExportHook.ts","../src/assetmanager/AssetExporter.ts","../src/assetmanager/MaterialManager.ts","../node_modules/three/examples/jsm/loaders/RGBELoader.js","../src/utils/legacy.ts","../src/assetmanager/import/PolyhavenMaterialGLTFLoader.ts","../src/assetmanager/AssetManager.ts","../src/assetmanager/Object3DManager.ts","../src/rendering/RenderManager.ts","../src/viewer/ViewerRenderManager.ts","../src/plugins/animation/PopmotionPlugin.ts","../src/plugins/interaction/InteractionPromptPlugin.ts","../src/plugins/animation/CameraViewPlugin.ts","../src/plugins/interaction/DropzonePlugin.ts","../src/plugins/postprocessing/shaders/Uncharted2ToneMapping.glsl","../src/plugins/postprocessing/shaders/TonemapPlugin.pars.glsl","../src/plugins/postprocessing/shaders/TonemapPlugin.patch.glsl","../src/plugins/base/PipelinePassPlugin.ts","../src/plugins/pipeline/shaders/GBufferPlugin.unpack.glsl","../src/plugins/pipeline/GBufferPlugin.ts","../src/plugins/postprocessing/AScreenPassExtensionPlugin.ts","../src/plugins/postprocessing/TonemapPlugin.ts","../src/viewer/version.ts","../src/viewer/ThreeViewer.ts","../node_modules/three/src/constants.js","../node_modules/three/examples/jsm/lines/Wireframe.js","../node_modules/three/examples/jsm/utils/UVsDebug.js","../node_modules/three/examples/jsm/utils/WorkerPool.js","../node_modules/three/examples/jsm/libs/ktx-parse.module.js","../node_modules/three/examples/jsm/libs/zstddec.module.js","../node_modules/three/examples/jsm/loaders/KTX2Loader.js","../node_modules/three/examples/jsm/loaders/KTXLoader.js","../node_modules/three/examples/jsm/loaders/USDZLoader.js","../node_modules/three/examples/jsm/loaders/PLYLoader.js","../node_modules/three/examples/jsm/loaders/STLLoader.js","../node_modules/three/examples/jsm/misc/GPUComputationRenderer.js","../node_modules/three/examples/jsm/math/MeshSurfaceSampler.js","../node_modules/three/examples/jsm/math/ConvexHull.js","../src/plugins/base/BaseImporterPlugin.ts","../src/plugins/base/BaseGroundPlugin.ts","../src/plugins/base/ACameraControlsPlugin.ts","../src/plugins/base/AAssetManagerProcessStatePlugin.ts","../src/postprocessing/AddBlendTexturePass.ts","../src/plugins/pipeline/SSAAPlugin.ts","../src/plugins/pipeline/ProgressivePlugin.ts","../src/plugins/pipeline/shaders/DepthBufferPlugin.unpack.glsl","../src/plugins/pipeline/DepthBufferPlugin.ts","../src/plugins/pipeline/NormalBufferPlugin.ts","../src/plugins/pipeline/FrameFadePlugin.ts","../src/plugins/pipeline/shaders/SSAOPlugin.pass.glsl","../src/plugins/pipeline/shaders/SSAOPlugin.patch.glsl","../src/plugins/pipeline/SSAOPlugin.ts","../src/plugins/ui/RenderTargetPreviewPlugin.ts","../src/plugins/ui/GeometryUVPreviewPlugin.ts","../src/plugins/ui/ViewerUiConfigPlugin.ts","../src/plugins/ui/SceneUiConfigPlugin.ts","../src/plugins/interaction/FullScreenPlugin.ts","../src/plugins/interaction/LoadingScreenPlugin.ts","../src/three/widgets/SelectionWidget.ts","../src/three/widgets/AHelperWidget.ts","../src/three/widgets/ACameraHelperWidget.ts","../src/three/widgets/ALightHelperWidget.ts","../src/three/widgets/BoneHelper.ts","../src/three/widgets/BoxSelectionWidget.ts","../src/three/widgets/CameraHelper2.ts","../src/three/widgets/DirectionalLightHelper2.ts","../src/three/widgets/LineHelper.ts","../src/three/widgets/PointLightHelper2.ts","../src/three/widgets/SkeletonHelper2.ts","../src/three/widgets/SpotLightHelper2.ts","../src/plugins/interaction/PickingPlugin.ts","../src/plugins/interaction/MultiSelectHelper.ts","../src/plugins/interaction/TransformControlsPlugin.ts","../src/plugins/interaction/PivotControlsPlugin.ts","../src/plugins/interaction/PivotEditPlugin.ts","../src/plugins/interaction/EditorViewWidgetPlugin.ts","../src/plugins/interaction/DeviceOrientationControlsPlugin.ts","../src/plugins/interaction/PointerLockControlsPlugin.ts","../src/plugins/interaction/ThreeFirstPersonControlsPlugin.ts","../src/plugins/interaction/UndoManagerPlugin.ts","../src/plugins/import/Rhino3dmLoadPlugin.ts","../src/plugins/import/USDZLoadPlugin.ts","../src/plugins/import/PLYLoadPlugin.ts","../src/plugins/import/STLLoadPlugin.ts","../src/plugins/import/KTXLoadPlugin.ts","../src/plugins/import/KTX2LoadPlugin.ts","../src/plugins/import/GLTFMeshOptDecodePlugin.ts","../src/plugins/export/AssetExporterPlugin.ts","../src/plugins/export/CanvasSnapshotPlugin.ts","../src/plugins/export/FileTransferPlugin.ts","../src/plugins/postprocessing/shaders/VignettePlugin.glsl","../src/plugins/postprocessing/VignettePlugin.ts","../src/plugins/postprocessing/shaders/ChromaticAberrationPlugin.glsl","../src/plugins/postprocessing/ChromaticAberrationPlugin.ts","../src/plugins/postprocessing/shaders/FilmicGrainPlugin.glsl","../src/plugins/postprocessing/FilmicGrainPlugin.ts","../src/plugins/animation/GLTFAnimationPlugin.ts","../src/plugins/animation/TransformAnimationPlugin.ts","../src/plugins/animation/AnimationObjectPlugin.ts","../src/plugins/material/ClearcoatTintPlugin.ts","../src/plugins/material/shaders/NoiseBumpMaterialPlugin.pars.glsl","../src/plugins/material/shaders/NoiseBumpMaterialPlugin.patch.glsl","../src/plugins/material/NoiseBumpMaterialPlugin.ts","../src/plugins/material/shaders/CustomBumpMapPlugin.glsl","../src/plugins/material/CustomBumpMapPlugin.ts","../src/plugins/material/shaders/ParallaxMappingPlugin.relief.glsl","../src/plugins/material/ParallaxMappingPlugin.ts","../src/plugins/material/shaders/FragmentClippingExtensionPlugin.pars.glsl","../src/plugins/material/shaders/FragmentClippingExtensionPlugin.patch.glsl","../src/plugins/material/FragmentClippingExtensionPlugin.ts","../src/plugins/rendering/VirtualCamerasPlugin.ts","../src/plugins/rendering/CascadedShadowsPlugin.ts","../src/plugins/configurator/MaterialConfiguratorBasePlugin.ts","../src/plugins/configurator/SwitchNodeBasePlugin.ts","../src/plugins/geometry/AGeometryGenerator.ts","../src/plugins/geometry/primitives/TorusGeometryGenerator.ts","../src/plugins/geometry/primitives/CircleGeometryGenerator.ts","../src/plugins/geometry/primitives/BoxGeometryGenerator.ts","../src/plugins/geometry/primitives/SphereGeometryGenerator.ts","../src/plugins/geometry/primitives/PlaneGeometryGenerator.ts","../src/plugins/geometry/primitives/CylinderGeometryGenerator.ts","../src/plugins/geometry/helpers/CurveUiHelper.ts","../src/plugins/geometry/primitives/TubeGeometryGenerator.ts","../src/plugins/geometry/helpers/ShapePresets.ts","../src/plugins/geometry/primitives/ShapeGeometryGenerator.ts","../src/plugins/geometry/primitives/TubeShapeGeometryGenerator.ts","../src/plugins/geometry/primitives/LineGeometryGenerator.ts","../src/plugins/geometry/GeometryGeneratorPlugin.ts","../src/plugins/geometry/ShapeTubeExtrudePlugin.ts","../src/plugins/extras/HDRiGroundPlugin.glsl","../src/plugins/extras/HDRiGroundPlugin.ts","../src/plugins/extras/Object3DWidgetsPlugin.ts","../src/plugins/extras/Object3DGeneratorPlugin.ts","../src/plugins/extras/ContactShadowGroundPlugin.ts","../src/plugins/extras/SimplifyModifierPlugin.ts","../src/plugins/extras/MeshOptSimplifyModifierPlugin.ts","../src/plugins/extras/helpers/GLTFMaterialsVariantsExtensionImport.ts","../src/plugins/extras/helpers/GLTFMaterialsVariantsExtensionExport.ts","../src/plugins/extras/GLTFKHRMaterialVariantsPlugin.ts","../src/plugins/extras/TailwindCSSCDNPlugin.ts","../src/plugins/extras/DynamicImportPlugin.ts","../src/plugins/extras/helpers/BasicObjectConstraints.ts","../src/plugins/extras/ObjectConstraintsPlugin.ts","../src/plugins/extras/components/componentTypes.ts","../src/plugins/extras/components/typeSystem.ts","../src/plugins/extras/components/ReferenceManager.ts","../src/plugins/extras/components/setupComponent.ts","../src/plugins/extras/components/Object3DComponent.ts","../src/plugins/extras/components/SampleBodyComponent.ts","../src/plugins/extras/EntityComponentPlugin.ts","../src/testing/testing.ts","../src/three/utils/object-transform.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2010-2023 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '163';\n\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst ConstantColorFactor = 211;\nconst OneMinusConstantColorFactor = 212;\nconst ConstantAlphaFactor = 213;\nconst OneMinusConstantAlphaFactor = 214;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\nconst AgXToneMapping = 6;\nconst NeutralToneMapping = 7;\nconst AttachedBindMode = 'attached';\nconst DetachedBindMode = 'detached';\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst UnsignedInt5999Type = 35902;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst RGB_BPTC_SIGNED_Format = 36494;\nconst RGB_BPTC_UNSIGNED_Format = 36495;\nconst RED_RGTC1_Format = 36283;\nconst SIGNED_RED_RGTC1_Format = 36284;\nconst RED_GREEN_RGTC2_Format = 36285;\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\nconst DisplayP3ColorSpace = 'display-p3';\nconst LinearDisplayP3ColorSpace = 'display-p3-linear';\nconst RGBM16ColorSpace = 'rgbm-16';\n\nconst LinearTransfer = 'linear';\nconst SRGBTransfer = 'srgb';\n\nconst Rec709Primaries = 'rec709';\nconst P3Primaries = 'p3';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst NeverCompare = 512;\nconst LessCompare = 513;\nconst EqualCompare = 514;\nconst LessEqualCompare = 515;\nconst GreaterCompare = 516;\nconst NotEqualCompare = 517;\nconst GreaterEqualCompare = 518;\nconst AlwaysCompare = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst WebGLCoordinateSystem = 2000;\nconst WebGPUCoordinateSystem = 2001;\n\n/** @deprecated Use LinearSRGBColorSpace or NoColorSpace in three.js r152+. */\nconst LinearEncoding = 3000;\n/** @deprecated Use SRGBColorSpace in three.js r152+. */\nconst sRGBEncoding = 3001;\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tVector2.prototype.isVector2 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nclass Matrix3 {\n\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nfunction warnOnce( message ) {\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\tconsole.warn( message );\n\n}\n\n/**\n * Matrices converting P3 <-> Rec. 709 primaries, without gamut mapping\n * or clipping. Based on W3C specifications for sRGB and Display P3,\n * and ICC specifications for the D50 connection space. Values in/out\n * are _linear_ sRGB and _linear_ Display P3.\n *\n * Note that both sRGB and Display P3 use the sRGB transfer functions.\n *\n * Reference:\n * - http://www.russellcottrell.com/photo/matrixCalculator.htm\n */\n\nconst LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t0.8224621, 0.177538, 0.0,\n\t0.0331941, 0.9668058, 0.0,\n\t0.0170827, 0.0723974, 0.9105199,\n);\n\nconst LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = /*@__PURE__*/ new Matrix3().set(\n\t1.2249401, -0.2249404, 0.0,\n\t-0.0420569, 1.0420571, 0.0,\n\t-0.0196376, -0.0786361, 1.0982735\n);\n\n/**\n * Defines supported color spaces by transfer function and primaries,\n * and provides conversions to/from the Linear-sRGB reference space.\n */\nconst COLOR_SPACES = {\n\t[ LinearSRGBColorSpace ]: {\n\t\ttransfer: LinearTransfer,\n\t\tprimaries: Rec709Primaries,\n\t\ttoReference: ( color ) => color,\n\t\tfromReference: ( color ) => color,\n\t},\n\t[ SRGBColorSpace ]: {\n\t\ttransfer: SRGBTransfer,\n\t\tprimaries: Rec709Primaries,\n\t\ttoReference: ( color ) => color.convertSRGBToLinear(),\n\t\tfromReference: ( color ) => color.convertLinearToSRGB(),\n\t},\n\t[ LinearDisplayP3ColorSpace ]: {\n\t\ttransfer: LinearTransfer,\n\t\tprimaries: P3Primaries,\n\t\ttoReference: ( color ) => color.applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ),\n\t\tfromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ),\n\t},\n\t[ DisplayP3ColorSpace ]: {\n\t\ttransfer: SRGBTransfer,\n\t\tprimaries: P3Primaries,\n\t\ttoReference: ( color ) => color.convertSRGBToLinear().applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ),\n\t\tfromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ).convertLinearToSRGB(),\n\t},\n};\n\nconst SUPPORTED_WORKING_COLOR_SPACES = new Set( [ LinearSRGBColorSpace, LinearDisplayP3ColorSpace ] );\n\nconst ColorManagement = {\n\n\tenabled: true,\n\n\t_workingColorSpace: LinearSRGBColorSpace,\n\n\tget workingColorSpace() {\n\n\t\treturn this._workingColorSpace;\n\n\t},\n\n\tset workingColorSpace( colorSpace ) {\n\n\t\tif ( ! SUPPORTED_WORKING_COLOR_SPACES.has( colorSpace ) ) {\n\n\t\t\tthrow new Error( `Unsupported working color space, \"${ colorSpace }\".` );\n\n\t\t}\n\n\t\tthis._workingColorSpace = colorSpace;\n\n\t},\n\n\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tconst sourceToReference = COLOR_SPACES[ sourceColorSpace ].toReference;\n\t\tconst targetFromReference = COLOR_SPACES[ targetColorSpace ].fromReference;\n\n\t\treturn targetFromReference( sourceToReference( color ) );\n\n\t},\n\n\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\treturn this.convert( color, this._workingColorSpace, targetColorSpace );\n\n\t},\n\n\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\treturn this.convert( color, sourceColorSpace, this._workingColorSpace );\n\n\t},\n\n\tgetPrimaries: function ( colorSpace ) {\n\n\t\treturn COLOR_SPACES[ colorSpace ].primaries;\n\n\t},\n\n\tgetTransfer: function ( colorSpace ) {\n\n\t\tif ( colorSpace === NoColorSpace || colorSpace === RGBM16ColorSpace ) return LinearTransfer;\n\n\t\treturn COLOR_SPACES[ colorSpace ].transfer;\n\n\t},\n\n};\n\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image, forcePng = false ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( ! forcePng && ( canvas.width > 2048 || canvas.height > 2048 ) ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.isSource = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\t\tthis.dataReady = true;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\t\t\tlet data = [];\n\t\t\ttry {\n\n\t\t\t\tdata = Array.from( image.data );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( e.message.includes( 'Invalid array length' ) )\n\t\t\t\t\tconsole.warn( 'Serializing large texture, might not be saved in JSON structure.' );\n\t\t\t\telse\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\tdata = image.data;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tif ( image.url !== undefined ) return image.url;\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\tthis.isTexture = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.source = new Source( image );\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\t\tthis.channel = 0;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// todo repalash remove later\n\t\tif ( typeof colorSpace === 'string' ) {\n\n\t\t\tthis.colorSpace = colorSpace;\n\n\t\t} else { // @deprecated, r152\n\n\t\t\twarnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' );\n\t\t\tthis.colorSpace = colorSpace === sRGBEncoding ? SRGBColorSpace : NoColorSpace;\n\n\t\t}\n\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.pmremVersion = 0; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t\t// this is required otherwise the data is not uploaded\n\t\tif ( image instanceof ImageData && image !== Texture.DEFAULT_IMAGE )\n\t\t\tthis.needsUpdate = true;\n\n\t}\n\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.userData = copyTextureUserData( this.userData, source.userData );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\t\t\tencoding: this.colorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding, // deprecated in r152, added for backwards compatibility, remove later\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = copyTextureUserData( {}, this.userData );\n\n\t\tif ( ! isRootObject && meta.textures ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t}\n\n\t}\n\n\t// todo repalash remove later\n\tget encoding() { // @deprecated, r152\n\n\t\twarnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' );\n\t\treturn this.colorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding;\n\n\t}\n\n\tset encoding( encoding ) { // @deprecated, r152\n\n\t\twarnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' );\n\t\tthis.colorSpace = encoding === sRGBEncoding ? SRGBColorSpace : NoColorSpace;\n\n\t}\n\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = null;\nTexture.DEFAULT_MAPPING = UVMapping;\nTexture.DEFAULT_ANISOTROPY = 1;\n\nconst iTextureIgnoredUserData = [ 'appliedMaterials', 'uuid' ]; // todo: these are not set by the material\nfunction copyTextureUserData( dest, source ) {\n\n\tif ( source ) {\n\n\t\tfor ( const key of Object.keys( source ) ) {\n\n\t\t\tif ( iTextureIgnoredUserData.includes( key ) ) continue;\n\t\t\tif ( key.startsWith( '__' ) ) continue; // double underscore\n\t\t\tif ( typeof dest[ key ] === 'function' || typeof source[ key ] === 'function' ) continue;\n\t\t\tdest[ key ] = typeof source[ key ] === 'object' ? JSON.parse( JSON.stringify( source[ key ] ) ) : source[ key ];\n\n\t\t}\n\n\t}\n\n\treturn dest;\n\n}\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tVector4.prototype.isVector4 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass RenderTarget extends EventDispatcher {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.isRenderTarget = true;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: 1 };\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1\n\t\t}, options );\n\n\t\tconst texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\n\t\ttexture.flipY = false;\n\t\ttexture.generateMipmaps = options.generateMipmaps;\n\t\ttexture.internalFormat = options.internalFormat;\n\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\tthis.depthBuffer = options.depthBuffer;\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\tthis.samples = options.samples;\n\n\t}\n\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tconst image = Object.assign( {}, source.texture.image );\n\t\tthis.texture.source = new Source( image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\t// it can be set to undefined by mistake (not just null)\n\t\tif ( source.depthTexture ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass WebGLRenderTarget extends RenderTarget {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.isDataArrayTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.isData3DTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : -1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// sets this quaternion to a uniform random unit quaternnion\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tVector3.prototype.isVector3 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox3 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\tthis.isSphere = true;\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$4.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$4.elements[ 0 ] *= invSX;\n\t\t_m1$4.elements[ 1 ] *= invSX;\n\t\t_m1$4.elements[ 2 ] *= invSX;\n\n\t\t_m1$4.elements[ 4 ] *= invSY;\n\t\t_m1$4.elements[ 5 ] *= invSY;\n\t\t_m1$4.elements[ 6 ] *= invSY;\n\n\t\t_m1$4.elements[ 8 ] *= invSZ;\n\t\t_m1$4.elements[ 9 ] *= invSZ;\n\t\t_m1$4.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$4 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tc = - far / ( far - near );\n\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\n\t\tlet z, zInv;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tz = ( far + near ) * p;\n\t\t\tzInv = -2 * p;\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tz = near * p;\n\t\t\tzInv = -1 * p;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0; \t\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = zInv;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$4 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.DEFAULT_ORDER = 'XYZ';\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$3 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nconst _childaddedEvent = { type: 'childadded', child: null };\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isObject3D = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material, group ) {\n\n\t\tthis.dispatchEvent( { type: 'beforeRender', renderer, scene, camera, geometry, material, group } );\n\n\t}\n\n\tonAfterRender( renderer, scene, camera, geometry, material, group ) {\n\n\t\tthis.dispatchEvent( { type: 'afterRender', renderer, scene, camera, geometry, material, group } );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$3.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$3.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$3.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$3 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$3.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$3 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$3.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$3.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$3 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tif ( child.matrixWorldAutoUpdate === true || force === true ) {\n\n\t\t\t\tchild.updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null && parent.matrixWorldAutoUpdate === true ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tif ( child.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {},\n\t\t\t\textras: {},\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.visibility = this._visibility;\n\t\t\tobject.active = this._active;\n\t\t\tobject.bounds = this._bounds.map( bound => ( {\n\t\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\t\tboxMin: bound.box.min.toArray(),\n\t\t\t\tboxMax: bound.box.max.toArray(),\n\n\t\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\t\tsphereRadius: bound.sphere.radius,\n\t\t\t\tsphereCenter: bound.sphere.center.toArray()\n\t\t\t} ) );\n\n\t\t\tobject.maxGeometryCount = this._maxGeometryCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = {\n\t\t\t\t\tcenter: object.boundingSphere.center.toArray(),\n\t\t\t\t\tradius: object.boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = {\n\t\t\t\t\tmin: object.boundingBox.min.toArray(),\n\t\t\t\t\tmax: object.boundingBox.max.toArray()\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = {};\n\t\tfor ( const [ key, value ] of Object.entries( source.userData ) ) {\n\n\t\t\tthis.userData[ key ] = ! value || ( value && ( value.isTexture || value.isObject3D ) ) ? value : JSON.parse( JSON.stringify( value ) );\n\n\t\t}\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tthis.isColor = true;\n\n\t\tthis.r = 1;\n\t\tthis.g = 1;\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isMaterial = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\t\tthis.alphaHash = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\t\tthis.blendAlpha = 0;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\t\tthis.forceSinglePass = false;\n\n\t\tthis.allowOverride = true;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( `THREE.Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t// console.warn( `THREE.Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( Array.isArray( newValue ) && currentValue && typeof currentValue.fromArray === 'function' ) {\n\n\t\t\t\tcurrentValue.fromArray( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6001,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = copyMaterialUserData( {}, source.userData );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nfunction copyMaterialUserData( dest, source ) {\n\n\tif ( ! source ) return dest;\n\tfor ( const key of Object.keys( source ) ) {\n\n\t\tif ( key.startsWith( '__' ) ) continue; // double underscore\n\t\tif ( typeof dest[ key ] === 'function' || typeof source[ key ] === 'function' ) continue;\n\t\tconst src = source[ key ];\n\t\tconst skipClone = ( ! src ) || src.isTexture || src.isObject3D || src.isMaterial || src.isBufferGeometry || src.userDataSkipClone;\n\t\tif ( ! skipClone && typeof source[ key ].clone === 'function' )\n\t\t\tdest[ key ] = source[ key ].clone();\n\t\telse if ( ! skipClone && ( typeof source[ key ] === 'object' || Array.isArray( source[ key ] ) ) )\n\t\t\tdest[ key ] = copyMaterialUserData( Array.isArray( source[ key ] ) ? [] : {}, source[ key ] );\n\t\telse\n\t\t\tdest[ key ] = source[ key ];\n\n\t}\n\n\treturn dest;\n\n}\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n// float32 to float16\n\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n// float16 to float32\n\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\nconst DataUtils = {\n\ttoHalfFloat: toHalfFloat,\n\tfromHalfFloat: fromHalfFloat,\n};\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.isBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis._updateRange = { offset: 0, count: -1 };\n\t\tthis.updateRanges = [];\n\t\tthis.gpuType = FloatType;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tget updateRange() {\n\n\t\twarnOnce( 'THREE.BufferAttribute: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.' ); // @deprecated, r159\n\t\treturn this._updateRange;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$2 = 0;\n\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBufferGeometry = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1$2.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1$2.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1$2.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1$2.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1$2.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1$2.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers the geometry based on the bounding box.\n\t * @param targetOffset Optional target vector to copy translation into.\n\t * @return {BufferGeometry}\n\t */\n\tcenter( targetOffset = undefined ) {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\tif ( targetOffset ) targetOffset.copy( _offset );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _uvA$1 = /*@__PURE__*/ new Vector2();\nconst _uvB$1 = /*@__PURE__*/ new Vector2();\nconst _uvC$1 = /*@__PURE__*/ new Vector2();\n\nconst _normalA = /*@__PURE__*/ new Vector3();\nconst _normalB = /*@__PURE__*/ new Vector3();\nconst _normalC = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( ! source.isMesh ) return this;\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv1, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv1, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv1, c );\n\n\t\t\tintersection.uv1 = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\t_normalA.fromBufferAttribute( normal, a );\n\t\t\t_normalB.fromBufferAttribute( normal, b );\n\t\t\t_normalC.fromBufferAttribute( normal, c );\n\n\t\t\tintersection.normal = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _normalA, _normalB, _normalC, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\tconsole.warn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\t\tthis.uniformsGroups = [];\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.forceSinglePass = true;\n\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets minTarget and maxTarget to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Copies the result into the target Vector2, where x is width and y is height.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t *   +---+---+---+\n\t *   | A | B | C |\n\t *   +---+---+---+\n\t *   | D | E | F |\n\t *   +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t *   const w = 1920;\n\t *   const h = 1080;\n\t *   const fullWidth = w * 3;\n\t *   const fullHeight = h * 2;\n\t *\n\t *   --A--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t *   --B--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t *   --C--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t *   --D--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t *   --E--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t *   --F--\n\t *   camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t *   Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tthis.renderTarget = renderTarget;\n\t\tthis.coordinateSystem = null;\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\tthis.isPlane = true;\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$5.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$5.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$5 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$5.center.set( 0, 0, 0 );\n\t\t_sphere$5.radius = 0.7071067811865476;\n\t\t_sphere$5.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$5 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$7 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute._updateRange; // @deprecated, r159\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === -1 && updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t}\n\n\t\tif ( updateRanges.length !== 0 ) {\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\t// @deprecated, r159\n\t\tif ( updateRange.count !== -1 ) {\n\n\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\tupdateRange.count = -1; // reset range\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\t#if defined(INVERSE_ALPHAMAP) && INVERSE_ALPHAMAP >= 1\\n\\tdiffuseColor.a *= 1.0-texture2D( alphaMap, vAlphaMapUv ).g;\\n\\t#else\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n\\t#endif\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\tattribute float batchId;\\n\\tuniform highp sampler2D batchingTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( batchId );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660,  0.0556434,\\n\\t\\t-1.5371385,  1.8760108, -0.2040259,\\n\\t\\t-0.4985314,  0.0415560,  1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat luminance( const in vec3 rgb ) {\\n\\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\\n\\treturn dot( weights, rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"\\nconst mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = mat3(\\n\\tvec3( 0.8224621, 0.177538, 0.0 ),\\n\\tvec3( 0.0331941, 0.9668058, 0.0 ),\\n\\tvec3( 0.0170827, 0.0723974, 0.9105199 )\\n);\\nconst mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.2249401, - 0.2249404, 0.0 ),\\n\\tvec3( - 0.0420569, 1.0420571, 0.0 ),\\n\\tvec3( - 0.0196376, - 0.0786361, 1.0982735 )\\n);\\nvec4 LinearSRGBToLinearDisplayP3( in vec4 value ) {\\n\\treturn vec4( value.rgb * LINEAR_SRGB_TO_LINEAR_DISPLAY_P3, value.a );\\n}\\nvec4 LinearDisplayP3ToLinearSRGB( in vec4 value ) {\\n\\treturn vec4( value.rgb * LINEAR_DISPLAY_P3_TO_LINEAR_SRGB, value.a );\\n}\\nvec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn sRGBTransferOETF( value );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 RGBM16ToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * value.a * 16.0, 1.0 );\\n}\\nvec4 LinearToRGBM16( in vec4 value ) {\\n\\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / 16.0, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * 16.0 ), M );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\treflectedLight.indirectDiffuse += lightMapIrradiance;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t#if defined ( LEGACY_LIGHTS )\\n\\t\\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\t\\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t\\t}\\n\\t\\treturn 1.0;\\n\\t#else\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t}\\n\\t\\treturn distanceFalloff;\\n\\t#endif\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t#if defined( FIX_ENV_DIRECTION )\\n\\t\\t\\tvec3 worldNormal = normal;\\n\\t\\t#else\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#endif\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\t#if !defined( FIX_ENV_DIRECTION )\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\t#endif\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n    float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n    float x2 = x * x;\\n    float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n    return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#if defined( USE_ANISOTROPY ) || defined( USE_ANISOTROPY_BRDF )\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3(    0, 1,    0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\\n\\t\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[MORPHTARGETS_COUNT];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] =  texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\t\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\t\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\t\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t#endif\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t\\t#endif\\n\\t\\tuniform sampler2DArray morphTargetsTexture;\\n\\t\\tuniform ivec2 morphTargetsTextureSize;\\n\\t\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t\\t}\\n\\t#else\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t\\t#else\\n\\t\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\t\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\t\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\t\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\ndiffuseColor.a = min(max(diffuseColor.a, 0.), 1.);\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nvec2 packDepthToRG( in highp float v ) {\\n\\treturn packDepthToRGBA( v ).yx;\\n}\\nfloat unpackRGToDepth( const in highp vec2 v ) {\\n\\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\\n}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t  f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3(  1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108,  1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605,  1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tfloat startCompression = 0.8 - 0.04;\\n\\tfloat desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min(color.r, min(color.g, color.b));\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max(color.r, max(color.g, color.b));\\n\\tif (peak < startCompression) return color;\\n\\tfloat d = 1. - startCompression;\\n\\tfloat newPeak = 1. - d * d / (peak + d - startCompression);\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / (desaturation * (peak - newPeak) + 1.);\\n\\treturn mix(color, newPeak * vec3(1, 1, 1), g);\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\t#ifndef WebGL2Context\\n\\t#define textureLod texture2DLodEXT\\n\\t#define textureSize(s, lod) vec2(1024./pow(2.,float(lod)),1024./pow(2.,float(lod)))\\n\\t#define isinf(x) (x > 1e20 || x < -1e20)\\n\\t#endif\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tif(roughness == 0.0) return transmissionSamplerMapTexelToLinear( texture2D( transmissionSamplerMap, fragCoord.xy ) );\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn transmissionSamplerMapTexelToLinear( textureBicubic( transmissionSamplerMap, fragCoord.xy, lod ) );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) || attenuationDistance == 0.0) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\trefractionCoords += 1.0;\\n\\t\\trefractionCoords /= 2.0;\\n\\t\\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"#ifdef HAS_TEXTURE\\nvarying vec2 vUv;\\nuniform mat3 uvTransform;\\nuniform bool flipX;\\nuniform bool flipY;\\n#endif\\nvoid main() {\\n#ifdef HAS_TEXTURE\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n    vUv = flipX ? vec2( 1.0 - vUv.x, vUv.y ) : vUv;\\n    vUv = flipY ? vec2( vUv.x, 1.0 - vUv.y ) : vUv;\\n#endif\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"#ifdef HAS_TEXTURE\\nuniform sampler2D t2D;\\nvarying vec2 vUv;\\n#endif\\nuniform float backgroundIntensity;\\nuniform vec3 backgroundColor;\\nvoid main() {\\n#ifdef HAS_TEXTURE\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n#else\\n\\tvec4 texColor = vec4( 1.0 );\\n#endif\\n\\ttexColor.rgb *= backgroundColor * backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include <cube_uv_reflection_fragment>\\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$e = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$a = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinbase_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_lambert_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_lambert_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <iridescence_fragment>\\n#include <cube_uv_reflection_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_physical_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_physical_pars_fragment>\\n#include <transmission_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <clearcoat_pars_fragment>\\n#include <iridescence_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <clearcoat_normal_fragment_begin>\\n\\t#include <clearcoat_normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include <transmission_fragment>\\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_toon_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_toon_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$2 = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <logdepthbuf_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 },\n\n\t\t\tbackgroundColor: { value: new Color( 0xffffff ) },\n\n\t\t\tflipX: { value: false },\n\t\t\tflipY: { value: false },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tenvMapRotation: { value: 0 },\n\t\t\tenvMapIntensity: { value: 1 },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _m2 = /*@__PURE__*/ new Matrix3();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\t\tconst backgroundColor = scene.isScene && scene.backgroundColor !== undefined ? scene.backgroundColor : null;\n\n\t\tif ( background === 'environment' ) background = scene.environment;\n\n\t\tconst isEnvironment = background && background === scene.environment;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( isEnvironment ) {\n\n\t\t\t\tboxMesh.material.uniforms.backgroundIntensity.value *= scene.environmentIntensity;\n\n\t\t\t\t_e1$1.copy( scene.environmentRotation );\n\n\t\t\t\t// accommodate left-handed frame\n\t\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\t\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t\t}\n\n\t\t\t\tboxMesh.material.uniforms.backgroundRotation.value.premultiply( _m2.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) ) );\n\n\t\t\t}\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( ( background && background.isTexture ) || ( ! background && backgroundColor ) ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.backgroundColor.value.set( backgroundColor || 0xffffff );\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\n\t\t\tif ( background ) {\n\n\t\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\t\tplaneMesh.material.uniforms.flipX.value = background.userData.flipX || false;\n\t\t\t\tplaneMesh.material.uniforms.flipY.value = background.userData.flipY || false;\n\n\t\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\t\tbackground.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\t\tplaneMesh.material.defines.HAS_TEXTURE = '1';\n\n\t\t\t} else if ( planeMesh.material.defines.HAS_TEXTURE ) {\n\n\t\t\t\tdelete planeMesh.material.defines.HAS_TEXTURE;\n\n\t\t\t}\n\n\t\t\tconst backgroundVersion = ( background ? background.version : -1 );\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== backgroundVersion ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = backgroundVersion;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetPlaneMesh: function () {\n\n\t\t\treturn planeMesh;\n\n\t\t},\n\t\tgetBoxMesh: function () {\n\n\t\t\treturn boxMesh;\n\n\t\t},\n\t\tgetBoxMesh2: function () {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\treturn boxMesh;\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\tthis.render( starts[ i ], counts[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\t// cubemap.rotation = texture.rotation;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\t// renderTarget.texture.rotation = texture.rotation;\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( -1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, -1 ),\n\t/*@__PURE__*/ new Vector3( -1, 1, -1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( 256 );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t * The smallest supported equirectangular image size is 64 x 32.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t * The smallest supported cube size is 16 x 16.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tconst array = geometry.morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.remove( array[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\tthis.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedIntType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isDepthTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n *  \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with  name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\nemptyShadowTexture.compareFunction = LessEqualCompare;\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tconst emptyTexture2D = ( this.type === gl.SAMPLER_2D_SHADOW ) ? emptyShadowTexture : emptyTexture;\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\tconst encodingPrimaries = colorSpace === NoColorSpace || colorSpace === RGBM16ColorSpace ? null : ColorManagement.getPrimaries( colorSpace );\n\n\tlet gamutMapping;\n\n\tif ( workingPrimaries === encodingPrimaries || ! encodingPrimaries ) {\n\n\t\tgamutMapping = '';\n\n\t} else if ( workingPrimaries === P3Primaries && encodingPrimaries === Rec709Primaries ) {\n\n\t\tgamutMapping = 'LinearDisplayP3ToLinearSRGB';\n\n\t} else if ( workingPrimaries === Rec709Primaries && encodingPrimaries === P3Primaries ) {\n\n\t\tgamutMapping = 'LinearSRGBToLinearDisplayP3';\n\n\t}\n\n\tswitch ( colorSpace ) {\n\n\t\tcase NoColorSpace:\n\t\t\treturn [ '', '' ];\n\t\tcase LinearSRGBColorSpace:\n\t\tcase LinearDisplayP3ColorSpace:\n\t\t\treturn [ gamutMapping, 'LinearTransferOETF' ];\n\n\t\tcase SRGBColorSpace:\n\t\tcase DisplayP3ColorSpace:\n\t\t\treturn [ gamutMapping, 'sRGBTransferOETF' ];\n\n\t\tcase RGBM16ColorSpace:\n\t\t\treturn [ '', 'LinearToRGBM16' ];\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported color space:', colorSpace );\n\t\t\treturn [ gamutMapping, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelDecodingFunction( functionName, colorSpace ) {\n\n\tlet fn;\n\tswitch ( colorSpace ) {\n\n\t\tcase LinearSRGBColorSpace:\n\t\t\tfn = '';\n\t\t\tbreak;\n\t\tcase SRGBColorSpace:\n\t\t\tfn = 'sRGBToLinear'; // todo required?\n\t\t\tbreak;\n\t\tcase RGBM16ColorSpace:\n\t\t\tfn = 'RGBM16ToLinear';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported color space:', colorSpace );\n\t\t\tfn = '';\n\t\t\tbreak;\n\n\t}\n\n\t// return `vec4 ${functionName}( vec4 value ) { return ${components[ 0 ]}ToLinear${components[ 1 ]}; }`;\n\treturn `vec4 ${functionName}( vec4 value ) { return ${fn} ( value ); }`;\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\treturn `vec4 ${functionName}( vec4 value ) { return ${components[ 0 ]}( ${components[ 1 ]}( value ) ); }`;\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map( [\n\t[ 'encodings_fragment', 'colorspace_fragment' ], // @deprecated, r154\n\t[ 'encodings_pars_fragment', 'colorspace_pars_fragment' ], // @deprecated, r154\n\t[ 'output_fragment', 'opaque_fragment' ], // @deprecated, r154\n] );\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', // todo this might break stuff, flatShading should not be related to tangents\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\n\t\t\tparameters.transmissionSamplerMapEncoding ? getTexelDecodingFunction( 'transmissionSamplerMapTexelToLinear', parameters.transmissionSamplerMapEncoding ) : '',\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad',\n\t\t\t'#define WebGL2Context 1'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id$1 = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id$1 ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst transmissionRenderTarget = renderer.userData && renderer.userData.transmissionRenderTarget;\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\t// todo repalash?\n\t\t\t// outputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( ( currentRenderTarget.isXRRenderTarget === true || currentRenderTarget.texture.colorSpace && currentRenderTarget.texture.colorSpace !== SRGBColorSpace ) ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\ttransmissionSamplerMapEncoding: transmissionRenderTarget ? transmissionRenderTarget.texture.colorSpace || LinearSRGBColorSpace : LinearSRGBColorSpace,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false && ! ( material.transmission > 0 ),\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY || geometry.userData.__forceUseTangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading === true,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\t\t\tuseLegacyLights: renderer._useLegacyLights,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: HAS_EXTENSIONS && material.extensions.multiDraw === true && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.useLegacyLights )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 20 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, useLegacyLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( useLegacyLights === true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( useLegacyLights ) {\n\n\t\tlights.setup( lightsArray, useLegacyLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: null\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include <packing>\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = _renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t     currentStencilRef !== stencilRef ||\n\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace || texture.colorSpace === RGBM16ColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || texture.colorSpace === RGBM16ColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t// Note: flipY, premultiplyAlpha does not work for ImageBitmap, it must be set while creating the image with createImageBitmap (see https://threejs.org/docs/index.html#api/en/loaders/ImageBitmapLoader , https://github.com/mrdoob/three.js/issues/16144)\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true && glInternalFormat !== RGB_ETC1_Format );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace || texture.colorSpace === RGBM16ColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || texture.colorSpace === RGBM16ColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\tif ( isMultisample || useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t// todo repalash remove later\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true && Array.isArray( renderTarget.texture ) ? renderTarget.texture : renderTarget.textures || [ renderTarget.texture ];\n\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\t\t\tconst textureProperties = properties.get( texture );\n\t\t\tconst webglTexture = textureProperties.__webglTexture;\n\n\t\t\tif ( textureProperties.__version !== texture.version ) { // needsUpdate called after generateMipmaps change,\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tsetTextureParameters( target, texture );\n\t\t\t\tstate.unbindTexture();\n\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\tconst textures = renderTarget.textures;\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\tconst invalidationArray = [];\n\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t// If MRT we need to remove FBO attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tinvalidationArray.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t}\n\n\t\t\t\tconst ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;\n\n\t\t\t\tif ( ignoreDepthValues === false ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTargetProperties.__isTransmissionRenderTarget !== true ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ignoreDepthValues === true ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\tif ( supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( colorSpace === RGBM16ColorSpace ) ; else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isArrayCamera = true;\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// private method\n\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\nclass WebXRDepthSensing {\n\n\tconstructor() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t\tthis.depthNear = 0;\n\t\tthis.depthFar = 0;\n\n\t}\n\n\tinit( renderer, depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new Texture();\n\n\t\t\tconst texProps = renderer.properties.get( texture );\n\t\t\ttexProps.__webglTexture = depthData.texture;\n\n\t\t\tif ( ( depthData.depthNear != renderState.depthNear ) || ( depthData.depthFar != renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\trender( renderer, cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t\trenderer.render( this.mesh, cameraXR );\n\n\t\t}\n\n\t}\n\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n}\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\t\tcameraXR.layers.enable( 1 );\n\t\tcameraXR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\t\t\t\tif ( session.renderState.layers === undefined ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tconst renderTargetProperties = renderer.properties.get( newRenderTarget );\n\t\t\t\t\trenderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tcamera.near = depthSensing.depthNear;\n\t\t\t\tcamera.far = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t\tcameraL.near = _currentDepthNear;\n\t\t\t\tcameraL.far = _currentDepthFar;\n\t\t\t\tcameraR.near = _currentDepthNear;\n\t\t\t\tcameraR.far = _currentDepthFar;\n\n\t\t\t\tcameraL.updateProjectionMatrix();\n\t\t\t\tcameraR.updateProjectionMatrix();\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\t\tthis.onPreAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tif ( scope.onPreAnimationFrameCallback ) scope.onPreAnimationFrameCallback( time, frame );\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\n\t\t\t\tif ( enabledFeatures && enabledFeatures.includes( 'depth-sensing' ) ) {\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( renderer, depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdepthSensing.render( renderer, cameraXR );\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tif ( material.transmission !== undefined ) {\n\n\t\t\t\tif ( uniforms.transmission ) uniforms.transmission.value = material.transmission;\n\t\t\t\tif ( uniforms.transmissionSamplerMap && transmissionRenderTarget ) uniforms.transmissionSamplerMap.value = transmissionRenderTarget ? transmissionRenderTarget.texture : null;\n\t\t\t\tif ( uniforms.transmissionSamplerSize && transmissionRenderTarget ) uniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\t}\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\t\t\t// const envMapOrig = material.envMap || properties.get( material ).environment || envMap;\n\t\t\t// uniforms.envMapRotation.value = envMapOrig ? envMapOrig.rotation : 0;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\n\t\t\t// artist-friendly light intensity scaling factor\n\t\t\tconst scaleFactor = ( renderer._useLegacyLights === true ) ? Math.PI : 1;\n\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshTransformUniform: refreshTransformUniform,\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconsole.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t// Calculate the chunk offset\n\t\t\t\t\tconst chunkOffsetUniform = offset % chunkSize;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkOffsetUniform !== 0 && ( chunkSize - chunkOffsetUniform ) < info.boundary ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkOffsetUniform );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\nclass WebGLRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t} = parameters;\n\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = canvas;\n\n\t\t// Debug configuration container\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\t// physical lights\n\n\t\tthis._useLegacyLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = NoToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// user data\n\n\t\tthis.userData = {};\n\n\t\t// extra context events\n\n\t\tthis.onContextLost = () => {};\n\n\t\tthis.onContextRestore = () => {};\n\n\t\tthis.onContextCreationError = () => {};\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector2 = new Vector2();\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\tconst context = canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tstate = new WebGLState( _gl );\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t_this.capabilities = capabilities;\n\t\t\t_this.extensions = extensions;\n\t\t\t_this.properties = properties;\n\t\t\t_this.renderLists = renderLists;\n\t\t\t_this.shadowMap = shadowMap;\n\t\t\t_this.state = state;\n\t\t\t_this.info = info;\n\t\t\t_this.background = background;\n\t\t\t_this.cubemaps = cubemaps;\n\t\t\t_this.cubeuvmaps = cubeuvmaps;\n\t\t\t_this.materials = materials;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\tthis.xr = xr;\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor.apply( background, arguments );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t\t};\n\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\t// if ( ! _scissorTest ) {\n\t\t\t//\n\t\t\t// \t// https://stackoverflow.com/questions/11544608/how-to-clear-a-rectangle-area-in-webgl\n\t\t\t// \t_gl.enable( _gl.SCISSOR_TEST );\n\t\t\t// \t_gl.scissor( _viewport.x, _viewport.y, _viewport.z, _viewport.w );\n\t\t\t//\n\t\t\t// }\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = targetFormat === RGBAIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RGIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RedIntegerFormat;\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = targetType === UnsignedByteType ||\n\t\t\t\t\t\ttargetType === UnsignedIntType ||\n\t\t\t\t\t\ttargetType === UnsignedShortType ||\n\t\t\t\t\t\ttargetType === UnsignedInt248Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort4444Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort5551Type;\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t\t// if ( ! _scissorTest ) {\n\t\t\t//\n\t\t\t// \t_gl.disable( _gl.SCISSOR_TEST );\n\t\t\t// \t_gl.scissor( _scissor.x, _scissor.y, _scissor.z, _scissor.w );\n\t\t\t//\n\t\t\t// }\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t//\n\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t\t_this.onContextLost( event );\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = _this.info ? _this.info.autoReset : undefined;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tif ( _this.info && infoAutoReset !== undefined ) _this.info.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t\t_this.onContextRestore && _this.onContextRestore();\n\n\t\t\t//console.log( 'restored' );\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t\t_this.onContextCreationError( event );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init();\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights( _this._useLegacyLights );\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\trenderStateStack.pop();\n\t\t\tcurrentRenderState = null;\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init();\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _this.userData.shadowMapRender !== false ) {\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\t\tif ( shadowsArray.length > 0 )\n\t\t\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\n\t\t\t//\n\t\t\tif ( _this.userData.backgroundRender !== false ) {\n\n\t\t\t\tif ( xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false ) {\n\n\t\t\t\t\tbackground.render( currentRenderList, scene );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// render scene\n\t\t\tif ( _this.userData.sceneRender !== false ) {\n\n\t\t\t\tcurrentRenderState.setupLights( _this._useLegacyLights );\n\n\t\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport ); // viewport is set by WebXRManager\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector3.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector3.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector3\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( _this.userData.transmissionRender === undefined && _this.userData.renderTransmissionPass !== false )\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( [ ...opaqueObjects, ...transparentObjects ], transmissiveObjects, scene, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( _this.userData.opaqueRender !== false ) {\n\n\t\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\tif ( _this.userData.transparentRender !== false ) {\n\n\t\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\tif ( _this.userData.transmissionRender !== false ) {\n\n\t\t\t\t// Custom version of renderTransmissionPass.\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tif ( ! currentRenderState.state.transmissionRenderTarget ) currentRenderState.state.transmissionRenderTarget = new WebGLRenderTarget( 1, 1 );\n\n\t\t\t\t\tconst texture = ( _this.userData.transmissionRenderTarget || currentRenderState.state.transmissionRenderTarget ).texture;\n\t\t\t\t\tconst isWebGL2 = capabilities.isWebGL2;\n\n\t\t\t\t\tconst generateMipmaps = texture.generateMipmaps;\n\t\t\t\t\tconst minFilter = texture.minFilter;\n\t\t\t\t\t// const magFilter = texture.magFilter;\n\n\t\t\t\t\tif ( isWebGL2 && _this.userData.blurTransmissionTarget && _this.userData.transmissionRenderTarget ) {\n\n\t\t\t\t\t\ttexture.generateMipmaps = true;\n\t\t\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter;\n\t\t\t\t\t\t// texture.magFilter = LinearMipmapLinearFilter;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\ttextures.updateMultisampleRenderTarget( _this.userData.transmissionRenderTarget ); // todo?\n\t\t\t\t\t\ttextures.updateRenderTargetMipmap( _this.userData.transmissionRenderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// todo; do we need to set backside when double-side like below in renderTransmissionPass.\n\n\t\t\t\t\trenderObjects( transmissiveObjects, scene, camera );\n\n\t\t\t\t\tif ( isWebGL2 && _this.userData.blurTransmissionTarget && _this.userData.transmissionRenderTarget ) {\n\n\t\t\t\t\t\ttexture.generateMipmaps = generateMipmaps;\n\t\t\t\t\t\ttexture.minFilter = minFilter;\n\t\t\t\t\t\t// texture.magFilter = magFilter;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\ttextures.updateMultisampleRenderTarget( _this.userData.transmissionRenderTarget ); // todo?\n\t\t\t\t\t\ttextures.updateRenderTargetMipmap( _this.userData.transmissionRenderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconsole.warn( 'three.js internal render transmission pass should not be called' );\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget === null ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil\n\t\t\t\t} );\n\n\t\t\t\tconst renderTargetProperties = properties.get( currentRenderState.state.transmissionRenderTarget );\n\t\t\t\trenderTargetProperties.__isTransmissionRenderTarget = true;\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: currentRenderState.state.transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget;\n\n\t\t\t_this.getDrawingBufferSize( _vector2 );\n\t\t\ttransmissionRenderTarget.setSize( _vector2.x, _vector2.y );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\tconst object = renderItem.object;\n\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\tconst material = renderItem.material;\n\t\t\t\tconst group = renderItem.group;\n\n\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\t// todo palash: find a better fix... PMREM and other ShaderPass wouldn't work for transparent and transmission objects\n\t\t\tconst temp = { ..._this.userData };\n\t\t\t_this.userData.opaqueRender = undefined;\n\t\t\t_this.userData.transparentRender = undefined;\n\t\t\t_this.userData.transmissionRender = undefined;\n\t\t\t_this.userData.backgroundRender = undefined;\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst object = renderItem.object;\n\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\tconst group = renderItem.group;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tObject.assign( _this.userData, temp );\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\t\t\tmaterial.onAfterRender( _this, scene, camera, geometry, object, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.userData && material.userData.envMapSlotKey && scene.textureSlots && scene.textureSlots[ material.userData.envMapSlotKey ] ? scene.textureSlots[ material.userData.envMapSlotKey ] : material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.userData && material.userData.envMapSlotKey && scene.textureSlots && scene.textureSlots[ material.userData.envMapSlotKey ] ? scene.textureSlots[ material.userData.envMapSlotKey ] : material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( ( _currentRenderTarget.isXRRenderTarget === true || _currentRenderTarget.texture.colorSpace && _currentRenderTarget.texture.colorSpace !== SRGBColorSpace ) ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 || geometry.userData.__forceUseTangent );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tif ( ! ( material.userData && material.userData.separateEnvMapIntensity ) ) {\n\n\t\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tm_uniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _this.userData.transmissionRenderTarget || currentRenderState.state.transmissionRenderTarget );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// Update this in Material.onBeforeRender(which has access to object). This is set for each object each frame, useful for things like inverseModelMatrix, uvTransform, geometry offsets etc.\n\t\t\tconst extraUniformsToUpload = material.extraUniformsToUpload;\n\t\t\textraUniformsToUpload && Object.entries( extraUniformsToUpload ).forEach( ( [ k, v ] )=> {\n\n\t\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\t\tp_uniforms.setValue( _gl, k, v.value, textures );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = Array.isArray( renderTarget.textures ) ? renderTarget.textures[ textureIndex || 0 ] : renderTarget.texture;\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// https://stackoverflow.com/a/62485031/2229899\n\t\t\t\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets || renderTarget.textures.length > 1 ) {\n\n\t\t\t\t\t\t\t// _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + textureIndex, _gl.TEXTURE_2D, properties.get( texture ).__webglTexture, 0 );\n\t\t\t\t\t\t\t_gl.readBuffer( _gl.COLOR_ATTACHMENT0 + ( textureIndex || 0 ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( !! _currentRenderTarget ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\t\tconst width = srcTexture.image.width;\n\t\t\tconst height = srcTexture.image.height;\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t\t// As another texture upload may have changed pixelStorei\n\t\t\t// parameters, make sure they are correct for the dstTexture\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t\t} else {\n\n\t\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\t\tconst width = Math.round( sourceBox.max.x - sourceBox.min.x );\n\t\t\tconst height = Math.round( sourceBox.max.y - sourceBox.min.y );\n\t\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\tconst unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ level ] : srcTexture.image;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );\n\n\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tif ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = colorSpace === DisplayP3ColorSpace ? 'display-p3' : 'srgb';\n\t\tgl.unpackColorSpace = ColorManagement.workingColorSpace === LinearDisplayP3ColorSpace ? 'display-p3' : 'srgb';\n\n\t}\n\n\tget useLegacyLights() { // @deprecated, r155\n\n\t\t// console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );\n\t\treturn this._useLegacyLights;\n\n\t}\n\n\tset useLegacyLights( value ) { // @deprecated, r155\n\n\t\t// console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );\n\t\tthis._useLegacyLights = value;\n\n\t}\n\n}\n\nclass FogExp2 {\n\n\tconstructor( color, density = 0.00025 ) {\n\n\t\tthis.isFogExp2 = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = density;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\nclass Fog {\n\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\tthis.isFog = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.backgroundBlurriness = 0;\n\t\tthis.backgroundIntensity = 1;\n\t\tthis.backgroundRotation = new Euler();\n\n\t\tthis.environmentIntensity = 1;\n\t\tthis.environmentRotation = new Euler();\n\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.isInterleavedBuffer = true;\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis._updateRange = { offset: 0, count: -1 };\n\t\tthis.updateRanges = [];\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tget updateRange() {\n\n\t\twarnOnce( 'THREE.InterleavedBuffer: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.' ); // @deprecated, r159\n\t\treturn this._updateRange;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized;\n\n\t}\n\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nclass Sprite extends Object3D {\n\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\tthis.geometry = _geometry;\n\t\tthis.material = material;\n\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\nclass LOD extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t},\n\t\t\tisLOD: {\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\t} );\n\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\n\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\nclass SkinnedMesh extends Mesh {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = AttachedBindMode;\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\tapplyBoneTransform( index, vector ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( vector ).applyMatrix4( this.bindMatrix );\n\n\t\tvector.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\tvector.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn vector.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\nclass Bone extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isDataTexture = true;\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix$1 = /*@__PURE__*/ new Matrix4();\n\nclass Skeleton {\n\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneInverses = boneInverses;\n\t\tthis.boneMatrices = null;\n\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix$1;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 bones * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 bones * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 bones * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\n\nclass InstancedMesh extends Mesh {\n\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isInstancedMesh = true;\n\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\t\tthis.instanceColor = null;\n\t\tthis.morphTexture = null;\n\n\t\tthis.sourceTrs = null;\n\n\t\tthis.count = count;\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$3 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( ! source.isInstancedMesh ) return this;\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$3.copy( this.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( drawRange, z ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = drawRange.start;\n\t\titem.count = drawRange.count;\n\t\titem.z = z;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst ID_ATTR_NAME = 'batchId';\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _invMatrixWorld = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// @TODO: SkinnedMesh support?\n// @TODO: geometry.groups support?\n// @TODO: geometry.drawRange support?\n// @TODO: geometry.morphAttributes support?\n// @TODO: Support uniform parameter per geometry\n// @TODO: Add an \"optimize\" function to pack geometry and remove data gaps\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\nclass BatchedMesh extends Mesh {\n\n\tget maxGeometryCount() {\n\n\t\treturn this._maxGeometryCount;\n\n\t}\n\n\tconstructor( maxGeometryCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\tthis.isBatchedMesh = true;\n\t\tthis.perObjectFrustumCulled = true;\n\t\tthis.sortObjects = true;\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\t\tthis.customSort = null;\n\n\t\tthis._drawRanges = [];\n\t\tthis._reservedRanges = [];\n\n\t\tthis._visibility = [];\n\t\tthis._active = [];\n\t\tthis._bounds = [];\n\n\t\tthis._maxGeometryCount = maxGeometryCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tthis._geometryInitialized = false;\n\t\tthis._geometryCount = 0;\n\t\tthis._multiDrawCounts = new Int32Array( maxGeometryCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxGeometryCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._visibilityChanged = true;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\n\t\tthis._initMatricesTexture();\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 matrices * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 matrices * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 matrices * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxGeometryCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxGeometryCount = this._maxGeometryCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\tconst indexArray = maxVertexCount > 65536\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tconst idArray = maxGeometryCount > 65536\n\t\t\t\t? new Uint32Array( maxVertexCount )\n\t\t\t\t: new Uint16Array( maxVertexCount );\n\t\t\tgeometry.setAttribute( ID_ATTR_NAME, new BufferAttribute( idArray, 1 ) );\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check that the geometry doesn't have a version of our reserved id attribute\n\t\tif ( geometry.getAttribute( ID_ATTR_NAME ) ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry cannot use attribute \"${ ID_ATTR_NAME }\"` );\n\n\t\t}\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( attributeName === ID_ATTR_NAME ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst geometryCount = this._geometryCount;\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst active = this._active;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0; i < geometryCount; i ++ ) {\n\n\t\t\tif ( active[ i ] === false ) continue;\n\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( i, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst geometryCount = this._geometryCount;\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst active = this._active;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0; i < geometryCount; i ++ ) {\n\n\t\t\tif ( active[ i ] === false ) continue;\n\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( i, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\taddGeometry( geometry, vertexCount = -1, indexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\t// ensure we're not over geometry\n\t\tif ( this._geometryCount >= this._maxGeometryCount ) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\t// get the necessary range fo the geometry\n\t\tconst reservedRange = {\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t};\n\n\t\tlet lastRange = null;\n\t\tconst reservedRanges = this._reservedRanges;\n\t\tconst drawRanges = this._drawRanges;\n\t\tconst bounds = this._bounds;\n\t\tif ( this._geometryCount !== 0 ) {\n\n\t\t\tlastRange = reservedRanges[ reservedRanges.length - 1 ];\n\n\t\t}\n\n\t\tif ( vertexCount === -1 ) {\n\n\t\t\treservedRange.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\t} else {\n\n\t\t\treservedRange.vertexCount = vertexCount;\n\n\t\t}\n\n\t\tif ( lastRange === null ) {\n\n\t\t\treservedRange.vertexStart = 0;\n\n\t\t} else {\n\n\t\t\treservedRange.vertexStart = lastRange.vertexStart + lastRange.vertexCount;\n\n\t\t}\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tif ( indexCount\t=== -1 ) {\n\n\t\t\t\treservedRange.indexCount = index.count;\n\n\t\t\t} else {\n\n\t\t\t\treservedRange.indexCount = indexCount;\n\n\t\t\t}\n\n\t\t\tif ( lastRange === null ) {\n\n\t\t\t\treservedRange.indexStart = 0;\n\n\t\t\t} else {\n\n\t\t\t\treservedRange.indexStart = lastRange.indexStart + lastRange.indexCount;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (\n\t\t\treservedRange.indexStart !== -1 &&\n\t\t\treservedRange.indexStart + reservedRange.indexCount > this._maxIndexCount ||\n\t\t\treservedRange.vertexStart + reservedRange.vertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\tconst visibility = this._visibility;\n\t\tconst active = this._active;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\n\t\t// push new visibility states\n\t\tvisibility.push( true );\n\t\tactive.push( true );\n\n\t\t// update id\n\t\tconst geometryId = this._geometryCount;\n\t\tthis._geometryCount ++;\n\n\t\t// initialize matrix information\n\t\t_identityMatrix.toArray( matricesArray, geometryId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\t// add the reserved range and draw range objects\n\t\treservedRanges.push( reservedRange );\n\t\tdrawRanges.push( {\n\t\t\tstart: hasIndex ? reservedRange.indexStart : reservedRange.vertexStart,\n\t\t\tcount: -1\n\t\t} );\n\t\tbounds.push( {\n\t\t\tboxInitialized: false,\n\t\t\tbox: new Box3(),\n\n\t\t\tsphereInitialized: false,\n\t\t\tsphere: new Sphere()\n\t\t} );\n\n\t\t// set the id for the geometry\n\t\tconst idAttribute = this.geometry.getAttribute( ID_ATTR_NAME );\n\t\tfor ( let i = 0; i < reservedRange.vertexCount; i ++ ) {\n\n\t\t\tidAttribute.setX( reservedRange.vertexStart + i, geometryId );\n\n\t\t}\n\n\t\tidAttribute.needsUpdate = true;\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\treturn geometryId;\n\n\t}\n\n\tsetGeometryAt( id, geometry ) {\n\n\t\tif ( id >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst reservedRange = this._reservedRanges[ id ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > reservedRange.indexCount ||\n\t\t\tgeometry.attributes.position.count > reservedRange.vertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry over\n\t\tconst vertexStart = reservedRange.vertexStart;\n\t\tconst vertexCount = reservedRange.vertexCount;\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( attributeName === ID_ATTR_NAME ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = vertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, vertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = reservedRange.indexStart;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedRange.indexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, reservedRange.indexCount );\n\n\t\t}\n\n\t\t// store the bounding boxes\n\t\tconst bound = this._bounds[ id ];\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tbound.box.copy( geometry.boundingBox );\n\t\t\tbound.boxInitialized = true;\n\n\t\t} else {\n\n\t\t\tbound.boxInitialized = false;\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tbound.sphere.copy( geometry.boundingSphere );\n\t\t\tbound.sphereInitialized = true;\n\n\t\t} else {\n\n\t\t\tbound.sphereInitialized = false;\n\n\t\t}\n\n\t\t// set drawRange count\n\t\tconst drawRange = this._drawRanges[ id ];\n\t\tconst posAttr = geometry.getAttribute( 'position' );\n\t\tdrawRange.count = hasIndex ? srcIndex.count : posAttr.count;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn id;\n\n\t}\n\n\tdeleteGeometry( geometryId ) {\n\n\t\t// Note: User needs to call optimize() afterward to pack the data.\n\n\t\tconst active = this._active;\n\t\tif ( geometryId >= active.length || active[ geometryId ] === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tactive[ geometryId ] = false;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t// get bounding box and compute it if it doesn't exist\n\tgetBoundingBoxAt( id, target ) {\n\n\t\tconst active = this._active;\n\t\tif ( active[ id ] === false ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst bound = this._bounds[ id ];\n\t\tconst box = bound.box;\n\t\tconst geometry = this.geometry;\n\t\tif ( bound.boxInitialized === false ) {\n\n\t\t\tbox.makeEmpty();\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst drawRange = this._drawRanges[ id ];\n\t\t\tfor ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tbound.boxInitialized = true;\n\n\t\t}\n\n\t\ttarget.copy( box );\n\t\treturn target;\n\n\t}\n\n\t// get bounding sphere and compute it if it doesn't exist\n\tgetBoundingSphereAt( id, target ) {\n\n\t\tconst active = this._active;\n\t\tif ( active[ id ] === false ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst bound = this._bounds[ id ];\n\t\tconst sphere = bound.sphere;\n\t\tconst geometry = this.geometry;\n\t\tif ( bound.sphereInitialized === false ) {\n\n\t\t\tsphere.makeEmpty();\n\n\t\t\tthis.getBoundingBoxAt( id, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst drawRange = this._drawRanges[ id ];\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tbound.sphereInitialized = true;\n\n\t\t}\n\n\t\ttarget.copy( sphere );\n\t\treturn target;\n\n\t}\n\n\tsetMatrixAt( geometryId, matrix ) {\n\n\t\t// @TODO: Map geometryId to index of the arrays because\n\t\t//        optimize() can make geometryId mismatch the index\n\n\t\tconst active = this._active;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tconst geometryCount = this._geometryCount;\n\t\tif ( geometryId >= geometryCount || active[ geometryId ] === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tmatrix.toArray( matricesArray, geometryId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tgetMatrixAt( geometryId, matrix ) {\n\n\t\tconst active = this._active;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tconst geometryCount = this._geometryCount;\n\t\tif ( geometryId >= geometryCount || active[ geometryId ] === false ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn matrix.fromArray( matricesArray, geometryId * 16 );\n\n\t}\n\n\tsetVisibleAt( geometryId, value ) {\n\n\t\tconst visibility = this._visibility;\n\t\tconst active = this._active;\n\t\tconst geometryCount = this._geometryCount;\n\n\t\t// if the geometry is out of range, not active, or visibility state\n\t\t// does not change then return early\n\t\tif (\n\t\t\tgeometryId >= geometryCount ||\n\t\t\tactive[ geometryId ] === false ||\n\t\t\tvisibility[ geometryId ] === value\n\t\t) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvisibility[ geometryId ] = value;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\tgetVisibleAt( geometryId ) {\n\n\t\tconst visibility = this._visibility;\n\t\tconst active = this._active;\n\t\tconst geometryCount = this._geometryCount;\n\n\t\t// return early if the geometry is out of range or not active\n\t\tif ( geometryId >= geometryCount || active[ geometryId ] === false ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn visibility[ geometryId ];\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst visibility = this._visibility;\n\t\tconst active = this._active;\n\t\tconst drawRanges = this._drawRanges;\n\t\tconst geometryCount = this._geometryCount;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryCount; i ++ ) {\n\n\t\t\tif ( ! visibility[ i ] || ! active[ i ] ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst drawRange = drawRanges[ i ];\n\t\t\t_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );\n\n\t\t\t// ge the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( i, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( i, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._drawRanges = source._drawRanges.map( range => ( { ...range } ) );\n\t\tthis._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );\n\n\t\tthis._visibility = source._visibility.slice();\n\t\tthis._active = source._active.slice();\n\t\tthis._bounds = source._bounds.map( bound => ( {\n\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\tbox: bound.box.clone(),\n\n\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\tsphere: bound.sphere.clone()\n\t\t} ) );\n\n\t\tthis._maxGeometryCount = source._maxGeometryCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._geometryCount = source._geometryCount;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.slice();\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\t\treturn this;\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst active = this._active;\n\t\tconst visibility = this._visibility;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst drawRanges = this._drawRanges;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t_projScreenMatrix$2\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\trenderer.coordinateSystem\n\t\t\t);\n\n\t\t}\n\n\t\tlet count = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_invMatrixWorld.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );\n\n\t\t\tfor ( let i = 0, l = visibility.length; i < l; i ++ ) {\n\n\t\t\t\tif ( visibility[ i ] && active[ i ] ) {\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( i, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! _frustum.intersectsSphere( _sphere$2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst z = _vector$5.distanceTo( _sphere$2.center );\n\t\t\t\t\t\t_renderList.push( drawRanges[ i ], z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ count ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ count ] = item.count;\n\t\t\t\tcount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = visibility.length; i < l; i ++ ) {\n\n\t\t\t\tif ( visibility[ i ] && active[ i ] ) {\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( i, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! _frustum.intersectsSphere( _sphere$2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst range = drawRanges[ i ];\n\t\t\t\t\t\tmultiDrawStarts[ count ] = range.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ count ] = range.count;\n\t\t\t\t\t\tcount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._multiDrawCount = count;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _start$1 = /*@__PURE__*/ new Vector3();\nconst _end$1 = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _start$1.distanceTo( _end$1 );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, a );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, b );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineLoop extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isVideoTexture = true;\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.isFramebufferTexture = true;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCompressedTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\nclass CompressedArrayTexture extends CompressedTexture {\n\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\tthis.isCompressedArrayTexture = true;\n\t\tthis.image.depth = depth;\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t}\n\n}\n\nclass CompressedCubeTexture extends CompressedTexture {\n\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\tthis.isCompressedCubeTexture = true;\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t}\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get total curve arc length\n\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t *   p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t *   p(0) = x0, p(1) = x1\n\t *  and\n\t *   p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n *  curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t}\n\n\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t// getPoint() depends on getLength\n\n\tgetLength() {\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\t// cacheLengths must be recalculated.\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t// Compute lengths and cache them\n\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\n\tgetCurveLengths() {\n\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tlength: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.4)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim | 0 );\n\t\t\ttriangles.push( ear.i / dim | 0 );\n\t\t\ttriangles.push( next.i / dim | 0 );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\tlet p = c.next;\n\twhile ( p !== a ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( x0, y0, minX, minY, invSize ),\n\t\tmaxZ = zOrder( x1, y1, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim | 0 );\n\t\t\ttriangles.push( p.i / dim | 0 );\n\t\t\ttriangles.push( b.i / dim | 0 );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\touterNode = eliminateHole( queue[ i ], outerNode );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\tconst bridge = findHoleBridge( hole, outerNode );\n\tif ( ! bridge ) {\n\n\t\treturn outerNode;\n\n\t}\n\n\tconst bridgeReverse = splitPolygon( bridge, hole );\n\n\t// filter collinear points around the cuts\n\tfilterPoints( bridgeReverse, bridgeReverse.next );\n\treturn filterPoints( bridge, bridge.next );\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\tqx = - Infinity,\n\t\tm;\n\n\tconst hx = hole.x, hy = hole.y;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ( x - minX ) * invSize | 0;\n\ty = ( y - minY ) * invSize | 0;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) &&\n           ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) &&\n           ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py );\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n           ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n            ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n            equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? -1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = 0;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n *  curveSegments: <int>, // number of points on the curves\n *  steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n *  depth: <float>, // Depth to extrude the shape\n *\n *  bevelEnabled: <bool>, // turn on bevel\n *  bevelThickness: <float>, // how deep into the original shape bevel goes\n *  bevelSize: <float>, // how far from shape outline (including bevelOffset) is bevel\n *  bevelOffset: <float>, // how far from shape outline does bevel start\n *  bevelSegments: <int>, // number of bevel layers\n *\n *  extrudePath: <THREE.Curve> // curve to extrude shape along\n *\n *  UVGenerator: <Object> // object that provides UV generator functions\n *\n * }\n */\n\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t//   shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t//  adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t//  but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t/////  Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 1.0;\n\t\tthis.metalness = 0.0;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.anisotropyRotation = 0;\n\t\tthis.anisotropyMap = null;\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 2.5 ) ); // clamp to 2.5, when ior = infinity, required for https://asset-samples.threepipe.org/tests/spec-gloss-sample-converted.glb (SpecGlossVsMetalRough.glb)\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.iridescenceMap = null;\n\t\tthis.iridescenceIOR = 1.3;\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = Infinity;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineDashedMaterial = true;\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// converts an array to a specific type\nfunction convertArray( array, type, forceClone ) {\n\n\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t! forceClone && array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) &&\n\t\t! ( object instanceof DataView );\n\n}\n\n// returns an array by which times and values can be sorted\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n// uses the array previously returned by 'getKeyframeOrder' to sort data\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n// function for parsing AOS keyframe formats\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\nconst AnimationUtils = {\n\tconvertArray: convertArray,\n\tisTypedArray: isTypedArray,\n\tgetKeyframeOrder: getKeyframeOrder,\n\tsortedArray: sortedArray,\n\tflattenJSON: flattenJSON,\n\tsubclip: subclip,\n\tmakeClipAdditive: makeClipAdditive\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nclass Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t\tthis.settings = null;\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t// Template methods for derived classes:\n\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nclass CubicInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nclass LinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n */\n\nclass DiscreteInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t// move all keyframes either forwards or backwards in time\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\nQuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t// parse the animation.hierarchy format\n\tstatic parseAnimation( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key, type ) {\n\n\t\tif ( this.enabled === false ) return type ? Promise.resolve() : undefined;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn type ? Promise.resolve( this.files[ key ] ) : this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t}\n\n}\n\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\nclass Loader {\n\n\tconstructor( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.crossOrigin = 'anonymous';\n\t\tthis.withCredentials = false;\n\t\tthis.path = '';\n\t\tthis.resourcePath = '';\n\t\tthis.requestHeader = {};\n\n\t}\n\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\tparse( /* data */ ) {}\n\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\n/* eslint-disable indent */\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.responseType = 'text';\n\n\t\tthis.useCache = true;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\t( this.useCache ?\n\t\t\tCache.get( url, this.responseType, this.mimeType ) :\n\t\t\tPromise.resolve( undefined ) )\n\t\t\t.then( ( cached )=>{\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'Content-Length' ) || response.headers.get( 'X-File-Size' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tif ( this.useCache ) Cache.add( url, data, this.responseType );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tif ( this.useCache ) this.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tif ( this.useCache ) this.manager.itemStart( url );\n\n\t\t} );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst origUrl = url;\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\tCache.get( url, 'blob' ).then( ( cachedBlob )=>{\n\n\t\t\tif ( cachedBlob !== undefined && ! cachedBlob.type.startsWith( 'text/plain' ) ) {\n\n\t\t\t\tif ( ! cachedBlob.type )\n\t\t\t\t\tif ( url.endsWith( '.svg' ) || url.startsWith( 'data:image/svg' ) )\n\t\t\t\t\t\tcachedBlob = new Blob( [ cachedBlob ], { type: 'image/svg+xml' } ); // hack for now. todo: blob SHOULD have the type from the content type in the response header or the mime type in the file name\n\n\t\t\t\timage.src = URL.createObjectURL( cachedBlob );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst fileLoader = new FileLoader( this.manager );\n\t\t\tfileLoader.useCache = false;\n\t\t\tfileLoader.setPath( this.path );\n\t\t\tfileLoader.setCrossOrigin( this.crossOrigin );\n\t\t\tfileLoader.setResponseType( 'blob' );\n\n\t\t\tfileLoader.load( origUrl, function ( blob ) {\n\n\t\t\t\tif ( ! blob.type )\n\t\t\t\t\tif ( url.endsWith( '.svg' ) || url.startsWith( 'data:image/svg' ) )\n\t\t\t\t\t\tblob = new Blob( [ blob ], { type: 'image/svg+xml' } ); // hack for now. todo: blob SHOULD have the type from the content type in the response header or the mime type in the file name // https://github.com/whatwg/fetch/issues/540\n\n\t\t\t\tCache.add( url, blob, 'blob' );\n\t\t\t\timage.src = URL.createObjectURL( blob );\n\n\t\t\t}, onProgress, ( event )=>{\n\n\t\t\t\tremoveEventListeners();\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\treturn image;\n\n\t}\n\n}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\ttexture.image.complete = true;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// todo repalash do the same in other texture/embedded asset loaders that are using in loaders like GLTF, FBXLoader etc\n\t\t\tif ( ! url.startsWith( 'blob:' ) )\n\t\t\t\ttexture.userData.rootPath = loader.path + url;\n\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, function ( event ) {\n\n\t\t\tif ( texture.image instanceof ImageData ) { // todo should we do it for all?\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\tonError( event );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass Light extends Object3D {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity;\n\n\t}\n\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass HemisphereLight extends Light {\n\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\tthis.isSpotLightShadow = true;\n\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SpotLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.distance = distance;\n\t\tthis.angle = angle;\n\t\tthis.penumbra = penumbra;\n\t\tthis.decay = decay;\n\n\t\tthis.map = null;\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t//  xzXZ\n\t\t\t//   y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nclass PointLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\tthis.distance = distance;\n\t\tthis.decay = decay;\n\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\nclass DirectionalLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AmbientLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\nclass RectAreaLight extends Light {\n\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Primary reference:\n *   https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n *   https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nclass LightProbe extends Light {\n\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isLightProbe = true;\n\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\t// only for legacy files.\n\t\tconst hexColorSpace = ( json.metadata && json.metadata.version <= 4.5 ) ? LinearSRGBColorSpace : undefined;\n\n\t\tconst material = MaterialLoader.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color, hexColorSpace );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor, hexColorSpace );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive, hexColorSpace );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular, hexColorSpace );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor, hexColorSpace );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor, hexColorSpace );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value, hexColorSpace );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\tif ( url[ 0 ] === '/' ) {\n\n\t\t\t// Host Relative URL\n\t\t\tif ( /^https?:\\/\\//i.test( path ) ) {\n\n\t\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t\t} else {\n\n\t\t\t\t// Current Host\n\t\t\t\treturn url;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( `THREE.ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height,\n\t\t\t\t\t\tcomplete: true\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height,\n\t\t\t\t\t\tcomplete: true\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source ? source.data : undefined;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image && image.complete ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\t\t\t\t// todo repalash remove later\n\t\t\t\telse if ( data.encoding !== undefined ) texture.encoding = data.encoding; // @deprecated, r152\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\t// only for legacy files. Note: color values of lights is not handled.\n\t\tconst hexColorSpace = ( data.metadata && data.metadata.version <= 4.5 ) ? LinearSRGBColorSpace : undefined;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color().setHex( data.background, hexColorSpace );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxGeometryCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._visibility = data.visibility;\n\t\t\t\tobject._active = data.active;\n\t\t\t\tobject._bounds = data.bounds.map( bound => {\n\n\t\t\t\t\tconst box = new Box3();\n\t\t\t\t\tbox.min.fromArray( bound.boxMin );\n\t\t\t\t\tbox.max.fromArray( bound.boxMax );\n\n\t\t\t\t\tconst sphere = new Sphere();\n\t\t\t\t\tsphere.radius = bound.sphereRadius;\n\t\t\t\t\tsphere.center.fromArray( bound.sphereCenter );\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\t\t\t\tbox: box,\n\n\t\t\t\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\t\t\t\tsphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\n\t\t\t\tobject._maxGeometryCount = data.maxGeometryCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} ).catch( e => {\n\n\t\t\t\t\tif ( onError ) onError( e );\n\n\t\t\t\t} );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\tCache.add( url, blob, 'blob' );\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tCache.remove( url );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( url, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nlet _context;\n\nclass AudioContext {\n\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\nclass StereoCamera {\n\n\tconstructor() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu<i>'\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu<i>' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.warn( 'THREE.PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n *  - Add objects you would otherwise pass as 'root' to the\n *    constructor or the .clipAction method of AnimationMixer.\n *\n *  - Instead pass this object as 'root'.\n *\n *  - You can also add and remove objects later when the mixer\n *    is running.\n *\n * Note:\n *\n *    Objects of this class appear as one object to the mixer,\n *    so cache control of the individual objects must be done\n *    on the group.\n *\n * Limitation:\n *\n *  - The animated properties must be compatible among the\n *    all objects in the group.\n *\n *  - A single property can either be controlled through a\n *    target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// remove & forget\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions |  inactive actions  ]\n\t\t// [  active actions >| inactive actions ]\n\t\t//                 s        a\n\t\t//                  <-swap->\n\t\t//                 a        s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [  active actions  | inactive actions ]\n\t\t// [ active actions |< inactive actions  ]\n\t\t//        a        s\n\t\t//         <-swap->\n\t\t//        s        a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t// get an existing action\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// advance the time and update apply the animation\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remove a targeted clip from the cache\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\nclass UniformsGroup extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isUniformsGroup = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.name = '';\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.uniforms = [];\n\n\t}\n\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.isGLBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * phi (the polar angle) is measured from the positive y-axis. The positive y-axis is up.\n * theta (the azimuthal angle) is measured from the positive z-axis.\n */\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be between EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\tthis.radius = radius; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = y; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix2 {\n\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox2 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\tthis.start = start;\n\t\tthis.end = end;\n\n\t}\n\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, -1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, -1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, -1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, -1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, -1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, -1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, -1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, -1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, -1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, -1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, -1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, -1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst 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 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst 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 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\t// dir is assumed to be normalized\n\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass ShapePath {\n\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\tthis.color = new Color();\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success    or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t//  with the horizontal line through inPt, left of inPt\n\t\t\t//  not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nclass WebGLMultipleRenderTargets extends WebGLRenderTarget { // @deprecated, r162\n\n\tconstructor( width = 1, height = 1, count = 1, options = {} ) {\n\n\t\tconsole.warn( 'THREE.WebGLMultipleRenderTargets has been deprecated and will be removed in r172. Use THREE.WebGLRenderTarget and set the \"count\" parameter to enable MRT.' );\n\n\t\tsuper( width, height, { ...options, count } );\n\n\t\tthis.isWebGLMultipleRenderTargets = true;\n\n\t}\n\n\tget texture() {\n\n\t\treturn this.textures;\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DisplayP3ColorSpace, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearDisplayP3ColorSpace, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, P3Primaries, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBM16ColorSpace, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, Rec709Primaries, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, createCanvasElement, sRGBEncoding };\n","/**\n * @license\n * ts-browser-helpers v0.19.4\n * Copyright 2022-2025 repalash <palash@shaders.app>\n * MIT License\n * See ./dependencies.txt for bundled third-party dependencies and licenses.\n */\nclass H {\n  constructor() {\n    this._eventListeners = {}, this.dispatchEvent = this.dispatchEvent.bind(this), this.addEventListener = this.addEventListener.bind(this), this.removeEventListener = this.removeEventListener.bind(this), this.hasEventListener = this.hasEventListener.bind(this);\n  }\n  addEventListener(e, i) {\n    const n = this._eventListeners;\n    n[e] === void 0 && (n[e] = []), n[e].includes(i) || n[e].push(i);\n  }\n  hasEventListener(e, i) {\n    const n = this._eventListeners;\n    return n[e] !== void 0 && n[e].includes(i);\n  }\n  removeEventListener(e, i) {\n    const r = this._eventListeners[e];\n    if (r !== void 0) {\n      const o = r.indexOf(i);\n      o !== -1 && r.splice(o, 1);\n    }\n  }\n  dispatchEvent(e) {\n    const n = this._eventListeners[e.type];\n    if (n !== void 0) {\n      e.target = this;\n      const r = n.slice(0);\n      for (let o = 0, s = r.length; o < s; o++) r[o].call(this, e);\n    }\n  }\n}\nasync function pe(t) {\n  return new Promise((e) => setTimeout(e, Math.max(0, t)));\n}\nfunction _() {\n  return (typeof performance > \"u\" ? Date : performance).now();\n}\nclass me extends H {\n  constructor() {\n    super(...arguments), this._onPointerDown = (e) => {\n      if (e.button !== 0 || !this._element) return;\n      this._pointerUp = void 0;\n      const i = e.clientX / this._element.clientWidth * 2 - 1, n = -(e.clientY / this._element.clientHeight) * 2 + 1, r = _();\n      this._pointerDown = { x: i, y: n, time: r }, this._pointer = this._pointerDown, this.dispatchEvent({ type: \"dragStart\", pointer: this._pointerDown });\n    }, this._onPointerMove = (e) => {\n      if (!this._pointerDown || !this._pointer || !this._element) return;\n      const i = e.clientX / this._element.clientWidth * 2 - 1, n = -(e.clientY / this._element.clientHeight) * 2 + 1, r = _();\n      this.dispatchEvent({\n        type: \"drag\",\n        pointer: this._pointer,\n        drag: { x: i - this._pointerDown.x, y: n - this._pointerDown.y, time: r - this._pointerDown.time },\n        delta: { x: i - this._pointer.x, y: n - this._pointer.y, time: r - this._pointer.time }\n      }), this._pointer = { x: i, y: n, time: _() }, e.buttons % 2 === 0 && this._onPointerUp(e);\n    }, this._onPointerUp = (e) => {\n      if (e.button !== 0 || !this._pointerDown || !this._element) return;\n      const i = e.clientX / this._element.clientWidth * 2 - 1, n = -(e.clientY / this._element.clientHeight) * 2 + 1, r = _();\n      this._pointerUp = { x: i, y: n, time: r }, this.dispatchEvent({\n        type: \"dragEnd\",\n        pointer: this._pointerUp,\n        drag: {\n          x: this._pointerUp.x - this._pointerDown.x,\n          y: this._pointerUp.y - this._pointerDown.y,\n          time: this._pointerUp.time - this._pointerDown.time\n        }\n      }), this._pointerDown = void 0, this._pointer = void 0;\n    };\n  }\n  get element() {\n    return this._element;\n  }\n  set element(e) {\n    this._element !== e && (this._element && this._removeElement(), this._element = e, this._element && this._addElement());\n  }\n  _removeElement() {\n    var e, i, n, r, o;\n    (e = this._element) == null || e.removeEventListener(\"pointerdown\", this._onPointerDown), (i = this._element) == null || i.removeEventListener(\"pointermove\", this._onPointerMove), (n = this._element) == null || n.removeEventListener(\"pointerup\", this._onPointerUp), (r = this._element) == null || r.removeEventListener(\"pointercancel\", this._onPointerUp), (o = this._element) == null || o.removeEventListener(\"pointerout\", this._onPointerUp);\n  }\n  _addElement() {\n    var e, i, n, r, o;\n    (e = this._element) == null || e.addEventListener(\"pointerdown\", this._onPointerDown), (i = this._element) == null || i.addEventListener(\"pointermove\", this._onPointerMove), (n = this._element) == null || n.addEventListener(\"pointerup\", this._onPointerUp), (r = this._element) == null || r.addEventListener(\"pointercancel\", this._onPointerUp), (o = this._element) == null || o.addEventListener(\"pointerout\", this._onPointerUp);\n  }\n  dispose() {\n    this.element = void 0;\n  }\n}\nclass ge {\n  constructor(e) {\n    this.options = {\n      limit: 500,\n      // maximum commands stack size\n      debug: !1,\n      // whether to emit execution status in console\n      bindHotKeys: !1\n      // whether to bind \"undo\" and \"redo\" commands to \"Ctrl+Z\", \"Ctrl+Y\" & \"Ctrl+Shift+Z\" hot keys\n      // useTransactions: true   // whether to initialize transactions manager\n    }, this.enabled = !0, this.presets = {}, this._keyDown = (i) => {\n      if (!this.enabled) return;\n      const n = i.ctrlKey || i.metaKey;\n      i.code === \"KeyZ\" && n && !i.shiftKey ? this.undo() : (i.code === \"KeyZ\" && n && i.shiftKey || i.code === \"KeyY\" && i.ctrlKey) && this.redo();\n    }, Object.assign(this.options, e), this.limit = e.limit, this.options = e, this.reset(), e.bindHotKeys && this.bindHotKeys(), this.log(`Initialized with stack limit of ${this.limit} commands`);\n  }\n  /**\n   * Bind 'undo' and 'redo' actions to 'Ctrl/Cmd+Z', 'Ctrl+Y' & 'Ctrl/Cmd+Shift+Z' hot keys.\n   * It is a basic implementation for quick testing and should be replaced with custom event handlers\n   * for more flexible processing.\n   * @returns {JSUndoManager}\n   */\n  bindHotKeys() {\n    return this.log(\"Bound 'undo' and 'redo' actions to 'Ctrl/Cmd+Z', 'Ctrl+Y' & 'Ctrl/Cmd+Shift+Z' hot keys\"), (this.options.hotKeyRoot ?? document).addEventListener(\"keydown\", this._keyDown), this;\n  }\n  /**\n   * Removes the event listeners and clears the stack\n   */\n  dispose() {\n    return (this.options.hotKeyRoot ?? document).removeEventListener(\"keydown\", this._keyDown), this.reset();\n  }\n  /**\n   * Remember executed command containing \"redo\" and \"undo\" functions\n   * @param {Object|Function} command - either an object with \"redo\" and \"undo\" functions\n   * @returns {JSUndoManager}\n   */\n  record(e) {\n    return this.enabled ? (this._record(e), this) : this;\n  }\n  replaceLast(e) {\n    const i = this.peek();\n    if (i)\n      return this.log(\"replace\", i, \"with\", e), this.stack[this.sp] = e, this;\n  }\n  /**\n   * Execute function and record it with its opposite \"undo\" function\n   * @param {Object|Function} command - either an object with \"redo\" and \"undo\" functions\n   * @param {Function} [undo] - \"undo\" function, used if the first argument is also a function\n   * @returns {JSUndoManager}\n   */\n  execute(e) {\n    if (!this.enabled) return;\n    let i = this._rc(e), n = i.redo;\n    return this.record.apply(this, i), this.log(\"Executing function...\"), n.apply(e), this;\n  }\n  _rc(e) {\n    if (e.type) {\n      const i = this.presets[e.type];\n      if (typeof i == \"function\")\n        return i(e);\n      throw console.error(e, i, this.presets), new Error(\"Preset command not found\");\n    } else\n      return e;\n  }\n  _record(e) {\n    this.enabled && (this.log(\"Recording command\", e), this._rebase(), this.stack.push(e), this.sp++, this._keepLimit());\n  }\n  //forget \"future\" commands if stack pointer is not at the end\n  _rebase() {\n    this.canRedo() && (this.stack.length = this.sp + 1);\n  }\n  //sustain limited size of stack; cut extra commands starting with the latest ones\n  _keepLimit() {\n    if (this.stack.length <= this.limit)\n      return;\n    let e = this.stack.length - this.limit;\n    this.log(\"Stack size reached its limit: ${this.limit} commands. Cutting off most old commands...\"), e === 1 ? this.stack.shift() : this.stack.splice(0, e), this.sp -= e;\n  }\n  /**\n   * Undo previous command if possible\n   * @returns {JSUndoManager}\n   */\n  undo() {\n    if (!this.canUndo())\n      return this;\n    let e = this.stack[this.sp];\n    return this.log(\"undo\"), this.sp--, this._rc(e).undo(), this;\n  }\n  /**\n   * Check whether undoing previous command is possible\n   * @returns {boolean}\n   */\n  canUndo() {\n    return this.sp >= 0 && this.enabled;\n  }\n  /**\n   * Get the last command that was done\n   */\n  peek() {\n    return this.canUndo() ? this.stack[this.sp] : null;\n  }\n  /**\n   * Redo the command which was previously undone\n   * @returns {JSUndoManager}\n   */\n  redo() {\n    if (!this.canRedo())\n      return this;\n    let e = this.stack[this.sp + 1];\n    return this.log(\"redo\"), this.sp++, this._rc(e).redo(), this;\n  }\n  /**\n   * Check whether redoing command is possible\n   * @returns {boolean}\n   */\n  canRedo() {\n    return this.sp < this.stack.length - 1 && this.enabled;\n  }\n  /**\n   * Gets the last command that was undone\n   */\n  peekForward() {\n    return this.canRedo() ? this.stack[this.sp + 1] : null;\n  }\n  /**\n   * Change stack size limit initially defined in the constructor options\n   * @param {number} limit\n   */\n  setLimit(e) {\n    let i = this.stack.length - this.sp - 1;\n    if (e < 1 || typeof e != \"number\")\n      throw new TypeError(`JSUndoManager.setLimit(): unexpected argument limit=${e}. Should be a positive number`);\n    return e < i ? console.warn(`JSUndoManager.setLimit(): cannot set stack limit (${e}) less than the number of 'redoable' commands (${i})`) : (this.limit = Math.floor(e), this._keepLimit()), this;\n  }\n  /**\n   * Reset all commands from memory\n   */\n  reset() {\n    return this.log(\"reset\"), this.stack = [], this.sp = -1, this;\n  }\n  /**\n   * Check whether the commands stack is empty\n   * @returns {boolean}\n   */\n  isEmpty() {\n    return !this.stack.length;\n  }\n  /**\n   * Check whether the commands stack size reaches its limit\n   * @returns {boolean}\n   */\n  isFull() {\n    return this.stack.length === this.limit;\n  }\n  /**\n   * Get number of commands in memory stack\n   * @returns {Number}\n   */\n  getSize() {\n    return this.stack.length;\n  }\n  log(e, ...i) {\n    this.options.debug && console.log(`Command Manager: ${e}`, ...i);\n  }\n}\n/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst w = class w {\n  constructor(e = w.DECAY_MILLISECONDS) {\n    this.velocity = 0, this.naturalFrequency = 0, this.setDecayTime(e);\n  }\n  setDecayTime(e) {\n    this.naturalFrequency = 1 / Math.max(w.MIN_DECAY_MILLISECONDS, e);\n  }\n  update(e, i, n, r) {\n    const o = 2e-4 * this.naturalFrequency;\n    if (e == null || r === 0 || e === i && this.velocity === 0)\n      return i;\n    if (n < 0)\n      return e;\n    const s = e - i, a = this.velocity + this.naturalFrequency * s, c = s + n * a, u = Math.exp(-this.naturalFrequency * n), l = (a - this.naturalFrequency * c) * u, h = -this.naturalFrequency * (l + a * u);\n    return Math.abs(l) < o * Math.abs(r) && h * s >= 0 ? (this.velocity = 0, i) : (this.velocity = l, i + c * u);\n  }\n};\nw.SETTLING_TIME = 1e4, w.MIN_DECAY_MILLISECONDS = 1e-3, w.DECAY_MILLISECONDS = 50;\nlet M = w;\nfunction we() {\n  const t = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"canvas\");\n  return t.style.display = \"block\", t;\n}\nfunction ye({ innerHTML: t = \"\", id: e, classList: i, addToBody: n = !0, elementTag: r = \"div\" }) {\n  const o = document.createElement(r);\n  return e && (o.id = e), o.innerHTML = t, i && o.classList.add(...i), n && document.body.appendChild(o), o;\n}\nasync function N(t) {\n  return new Promise((e, i) => {\n    const n = new Image();\n    n.onload = () => e(n), n.onerror = i, n.crossOrigin = \"anonymous\", n.decoding = \"sync\", n.src = t;\n  });\n}\nfunction W(t, e = document.head) {\n  const i = document.createElement(\"style\");\n  return i.type = \"text/css\", i.innerText = t, e == null || e.appendChild(i), i;\n}\nasync function ve(t, e = document.head) {\n  return new Promise((i, n) => {\n    const r = document.createElement(\"script\");\n    r.setAttribute(\"src\", t), r.addEventListener(\"load\", () => i(r)), r.addEventListener(\"error\", n), e.appendChild(r);\n  });\n}\nasync function be(t, e) {\n  var n;\n  t.innerHTML = e;\n  const i = t.getElementsByTagName(\"script\");\n  for (let r = 0; r < i.length; r++) {\n    const o = i[r], s = V(o);\n    let a = !1;\n    await new Promise((c) => {\n      s.onload = c, s.onerror = () => {\n        a = !0, c(void 0);\n      };\n    }), !a && ((n = o.parentNode) == null || n.replaceChild(s, o));\n  }\n}\nfunction V(t, e) {\n  e = e ?? document.createElement(\"script\"), e.type = t.type || \"text/javascript\", e.text = t.text;\n  for (let i = 0; i < t.attributes.length; i++) {\n    const n = t.attributes[i];\n    e.setAttribute(n.name, n.value);\n  }\n  return e;\n}\nfunction xe(t) {\n  if (!window)\n    return console.warn(\"window is required\"), \"\";\n  let e = \"\";\n  const i = new Uint8Array(t), n = i.byteLength;\n  for (let r = 0; r < n; r++)\n    e += String.fromCharCode(i[r]);\n  return window.btoa(e);\n}\nfunction ke(t) {\n  if (!window)\n    return console.warn(\"window is required\"), new Uint8Array(0);\n  const e = window.atob(t), i = e.length, n = new Uint8Array(i);\n  for (let r = 0; r < i; r++)\n    n[r] = e.charCodeAt(r);\n  return n.buffer;\n}\nconst B = {\n  Int8Array,\n  Uint8Array,\n  Uint8ClampedArray,\n  Int16Array,\n  Uint16Array,\n  Int32Array,\n  Uint32Array,\n  Float32Array,\n  Float64Array\n};\nfunction Ee(t, e) {\n  return new B[t](e);\n}\nfunction Ce(t) {\n  return t.replace(\n    /\\w\\S*/g,\n    function(e) {\n      return e.charAt(0).toUpperCase() + e.substr(1).toLowerCase();\n    }\n  );\n}\nfunction _e(t) {\n  return t.replace(\n    /([-_][a-z])/ig,\n    (e) => e.toUpperCase().replace(\"-\", \"\").replace(\"_\", \"\")\n  );\n}\nfunction Se(t) {\n  if (!t || t === \"\" || t.match(/__MACOSX\\/.*\\._/)) return \"\";\n  t = t.replace(/\\?.*$/, \"\");\n  const e = t.split(/[\\\\/]/).pop() ?? \"\", i = e.lastIndexOf(\".\");\n  return e === \"\" || i < 1 ? \"\" : e.slice(i + 1);\n}\nfunction Le(t) {\n  return t.substring(t.lastIndexOf(\"/\") + 1);\n}\nfunction Y(t) {\n  return RegExp.escape ? RegExp.escape(t) : t.replace(/[.*+?^${}()|[\\]/\\\\=!:]/g, \"\\\\$&\");\n}\nfunction f(t, e, i) {\n  return t.replace(new RegExp(Y(e), \"g\"), i);\n}\nfunction Ae(t, e, i, {\n  replaceAll: n = !1,\n  prepend: r = !1,\n  append: o = !1,\n  notFoundCallback: s = () => {\n  }\n} = {}) {\n  if (s && !t.includes(e))\n    return s(), t;\n  let a = i;\n  return r ? a = i + e : o && (a = e + i), n ? t.replaceAll(e, a) : t.replace(e, a);\n}\nfunction ze(t) {\n  return t.sort(), t[0].split(\"\").map((e, i) => t[t.length - 1][i] === e ? e : \"\\0\").join(\"\").split(\"\\0\").at(0) || \"\";\n}\nfunction g(t) {\n  return t.replace(/[&<>\"']/g, function(e) {\n    switch (e) {\n      case \"&\":\n        return \"&amp;\";\n      case \"<\":\n        return \"&lt;\";\n      case \">\":\n        return \"&gt;\";\n      case '\"':\n        return \"&quot;\";\n      case \"'\":\n        return \"&#39;\";\n      default:\n        return e;\n    }\n  });\n}\nconst Ue = (t, ...e) => String.raw({ raw: t }, ...e), K = (t, ...e) => String.raw({ raw: t }, ...e), Oe = (t, ...e) => String.raw({ raw: t }, ...e), J = (t, ...e) => {\n  let i = String.raw({ raw: t }, ...e);\n  return i = f(i, \"%\", \"%25\"), i = f(i, \"> <\", \"><\"), i = f(i, \"; }\", \";}\"), i = f(i, \"<\", \"%3c\"), i = f(i, \">\", \"%3e\"), i = f(i, '\"', \"'\"), i = f(i, \"#\", \"%23\"), i = f(i, \"{\", \"%7b\"), i = f(i, \"}\", \"%7d\"), i = f(i, \"|\", \"%7c\"), i = f(i, \"^\", \"%5e\"), i = f(i, \"`\", \"%60\"), i = f(i, \"@\", \"%40\"), i = f(i, \"&\", \"&amp;\"), i = f(i, `\n`, \"%0A\"), \"data:image/svg+xml;charset=UTF-8,\" + i;\n};\nfunction De(t = document.head) {\n  return W(K`\n      ::-webkit-scrollbar\n      {\n        width: 8px;  /* for vertical scrollbars */\n        height: 8px; /* for horizontal scrollbars */\n      }\n      ::-webkit-scrollbar-track\n      {\n        background: rgba(64, 64, 64, 0.4);\n        border-radius: 6px;\n      }\n      ::-webkit-scrollbar-thumb\n      {\n        background: rgba(128, 128, 128, 0.2);\n        border-radius: 6px;\n      }\n      ::-webkit-scrollbar-corner {background: rgba(0,0,0,0.5);}\n    `, t);\n}\nfunction G(t, e) {\n  const i = window.URL.createObjectURL(t), n = document.createElement(\"a\");\n  n.style.display = \"none\", n.href = i, n.download = e, document.body.appendChild(n), n.click(), setTimeout(() => {\n    document.body.removeChild(n), window.URL.revokeObjectURL(i);\n  }, 1e3);\n}\nasync function X(t) {\n  return new Promise((e, i) => {\n    const n = new FileReader();\n    n.onload = (r) => e(n.result), n.onerror = (r) => i(n.error), n.onabort = (r) => i(new Error(\"Read aborted\")), n.readAsDataURL(t);\n  });\n}\nfunction Ie(t, e) {\n  return G(t, e ?? t.name);\n}\nasync function Pe(t = !1, e = !1, i) {\n  const n = document.createElement(\"input\");\n  n.type = \"file\", n.multiple = t, n.accept = i || \"*\", n.webkitdirectory = e, n.style.display = \"none\", document.body.appendChild(n), n.click();\n  const r = await new Promise((o) => {\n    n.onchange = (s) => {\n      o(Array.from(n.files || []));\n    };\n  });\n  return document.body.removeChild(n), r;\n}\nfunction Te() {\n  let t = !1;\n  return function(e) {\n    (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(e.substr(0, 4))) && (t = !0);\n  }(navigator.userAgent || navigator.vendor || window.opera), t;\n}\nfunction Me(t) {\n  return t < 0.04045 ? t * 0.0773993808 : Math.pow(t * 0.9478672986 + 0.0521327014, 2.4);\n}\nfunction $e(t) {\n  return t < 31308e-7 ? t * 12.92 : 1.055 * Math.pow(t, 0.41666) - 0.055;\n}\nfunction Re(t, e = 1, i = 1) {\n  const n = document.createElement(\"canvas\");\n  n.width = e, n.height = i;\n  const r = n.getContext(\"2d\");\n  r.fillStyle = \"#\" + t, r.fillRect(0, 0, e, i);\n  const o = n.toDataURL();\n  return n.remove(), o;\n}\nfunction Z(t, e) {\n  let i;\n  do\n    i = Object.getOwnPropertyDescriptor(t, e);\n  while (!i && (t = Object.getPrototypeOf(t)));\n  return i;\n}\nfunction Q(t, e, i = !0, n = !1) {\n  const r = Z(t, e);\n  return !!(r != null && r.set) || i && (r == null ? void 0 : r.writable) !== !1 && (r == null ? void 0 : r.get) === void 0 || n && !r;\n}\nfunction D(t, e, i, n = !0, r = !1) {\n  return t && Q(t, e, n, r) ? (t[e] = i, !0) : !1;\n}\nfunction Fe(t, ...e) {\n  return typeof t == \"function\" && (t = t(...e)), t;\n}\nfunction qe(t, e, i) {\n  for (const n of i) {\n    const r = t[n];\n    r !== void 0 && D(e, n, r, !0);\n  }\n  return e;\n}\nfunction He(t, e) {\n  for (const i of e)\n    if (!t.includes(i)) return !1;\n  return !0;\n}\nfunction j(t, e) {\n  for (let i = t.length - 1; i >= 0; i--)\n    if (e(t[i])) return i;\n  return -1;\n}\nfunction Ne(t, e) {\n  return function(...i) {\n    return t(), e && e.call(this, ...i);\n  };\n}\nfunction We(t, e) {\n  return function(...i) {\n    return t(...i), e && e.call(this, ...i);\n  };\n}\nfunction Ve(t, e, i = !1) {\n  for (typeof t == \"string\" && (t = t.split(\".\")); t.length > 0; ) {\n    if (!e) return e;\n    const n = t.splice(0, 1)[0];\n    if (!(n.length < 1))\n      if (Array.isArray(e))\n        e = e[parseInt(n)];\n      else if (typeof e == \"object\" && n in e)\n        e = e[n];\n      else {\n        if (i)\n          throw new Error(\"invalid access, check \" + n + \" in \" + e);\n        return;\n      }\n  }\n  return e;\n}\nfunction Be(t, e) {\n  return Object.keys(t).find((i) => t[i] === e);\n}\nfunction L(t, e) {\n  return Object.hasOwn ? Object.hasOwn(t, e) : t.hasOwnProperty(e);\n}\nfunction Ye(t, e, i = !0) {\n  const n = i ? t : {}, r = Object.keys(t);\n  for (const o of r) n[o] = e(t[o], o);\n  return n;\n}\nfunction $(t, e) {\n  return Object.fromEntries(Object.entries(t).map((i) => e(i)));\n}\nconst A = {\n  // object\n  priority: 1 / 0,\n  serialize: (t, e) => $(t, ([i, n]) => [i, m.Serialize(n, e, !1)]),\n  deserialize: (t, e, i) => Object.assign(e || {}, $(t, ([n, r]) => [n, m.Deserialize(r, e == null ? void 0 : e[n], i, !1)])),\n  isType: (t) => (t.constructor || Object) === Object\n}, d = class d {\n  static GetSerializer(e) {\n    return d.Serializers.find((i) => i.isType(e));\n  }\n  static RegisterSerializer(...e) {\n    for (const i of e) {\n      const n = i.priority ?? 1e10, r = j(d.Serializers, (o) => o.priority !== void 0 && o.priority < n);\n      r >= 0 ? d.Serializers.splice(r + 1, 0, i) : d.Serializers.push(i);\n    }\n  }\n  static UnregisterSerializer(...e) {\n    for (const i of e) {\n      const n = d.Serializers.indexOf(i);\n      n >= 0 && d.Serializers.splice(n, 1);\n    }\n  }\n  /**\n   * Serialize an object\n   * @param obj - object to serialize\n   * @param meta - Optional object to store common meta-data/resources across the serialization process of multiple objects\n   * @param isThis - true if called from inside the serialization function, like custom {@link IJSONSerializable.toJSON}.\n   */\n  static Serialize(e, i, n = !1) {\n    if (typeof e == \"function\") return;\n    if (!n) {\n      const s = d.GetSerializer(e);\n      if (s) return s.serialize(e, i);\n      if (typeof e.toJSON == \"function\") {\n        const a = e.toJSON(i, !0);\n        return e.serializableClassId && a && (a.serializableClassId = e.serializableClassId), a;\n      }\n    }\n    let r = e.constructor ?? Object;\n    const o = {};\n    for (; r && r !== Object; ) {\n      const s = d.TypeMap.get(r) ?? [];\n      for (const [a, c] of s)\n        o[a] = d.Serialize(e[c], i, !1);\n      r = Object.getPrototypeOf(r);\n    }\n    return e.serializableClassId && (o.serializableClassId = e.serializableClassId), o;\n  }\n  /**\n   * Deserialize an object\n   * @param data - data to deserialize\n   * @param obj - current object that's set. If of the same class/type the data is deserialized into that instead of creating new objects.\n   * @param meta - Optional object to retrieve common meta-data/resources across the deserialization process of multiple objects. Objects in meta must be class instances, not js objects. (like Material, Texture, Object3D etc)\n   * @param isThis - true if called from inside the deserialization function, like custom {@link IJSONSerializable.fromJSON}\n   */\n  static Deserialize(e, i, n, r = !1) {\n    if (e === void 0 || i === e) return i;\n    if (e && typeof e == \"object\" && (e.constructor || Object) === Object && e.resource && typeof e.resource == \"string\" && e.uuid) {\n      const s = n == null ? void 0 : n[e.resource];\n      if (!s)\n        return console.warn(`Serialization: Resource ${e.resource} not found`), i;\n      const a = s[e.uuid];\n      if (!a)\n        return console.warn(`Serialization: Resource ${e.resource} with uuid ${e.uuid} not found`), i;\n      if (e = a, typeof e == \"object\" && (e.__useCount = e.__useCount ? e.__useCount + 1 : 1), i === e) return i;\n      if (e && typeof e == \"object\") {\n        if ((e.constructor || Object) !== Object)\n          return i && console.warn(\"Serialization: replacing object\", i, \"with deserialized object\", e), e;\n        console.error(\"Serialization: during Deserialize, meta should only have class instances, not js objects\", e, i, n);\n      }\n    }\n    if (e && typeof e == \"object\" && (e.constructor || Object) !== Object && !Array.isArray(e) && !e.serializableClassId) {\n      if (e instanceof Blob) return e;\n      console.warn(\"Serialization: Data might already be deserialized. It will be cloned, or copied to source\", e, \"source\", i, e.constructor, e.constructor !== Object);\n    }\n    if (e && typeof e == \"object\") {\n      const s = (a) => {\n        const c = d.SerializableClasses.get(a);\n        c && (c.DataInConstructor ? i = new c(e) : i = new c());\n      };\n      e.serializableClassId && (!i || i.serializableClassId !== e.serializableClassId) && s(e.serializableClassId), e.type && (!i || i.type !== e.type) && s(e.type), !Array.isArray(i) && Array.isArray(e) ? i = [] : typeof i != \"object\" && (e.constructor || Object) === Object && (i = {});\n    }\n    if (typeof i == \"function\")\n      return console.error(\"Serialization: Cannot deserialize into a function\", i, e), i;\n    if (!r) {\n      const s = d.GetSerializer(e);\n      if (s && s !== A) return s.deserialize(e, i, n);\n    }\n    if (!e || i === void 0 || i === null || typeof i != \"object\")\n      return e;\n    if (!r && typeof (i == null ? void 0 : i.fromJSON) == \"function\")\n      return i.fromJSON(e, n, !0), i;\n    let o = i.constructor ?? Object;\n    if (o === Object) return A.deserialize(e, i, n);\n    for (; o && o !== Object; ) {\n      const s = d.TypeMap.get(o) ?? [];\n      for (const [a, c] of s) {\n        const u = i[c], l = d.Deserialize(e[a], u, n, !1);\n        l !== u && D(i, c, l, !0);\n      }\n      o = Object.getPrototypeOf(o);\n    }\n    return i;\n  }\n};\nd.TypeMap = /* @__PURE__ */ new Map(), d.SerializableClasses = /* @__PURE__ */ new Map(), d.Serializers = [\n  {\n    // arrays\n    priority: 0,\n    isType: (e) => Array.isArray(e),\n    serialize: (e, i) => e.map((n) => d.Serialize(n, i, !1)),\n    deserialize: (e, i, n) => {\n      const r = e.length;\n      Array.isArray(i) || (i = []);\n      for (let o = 0; o < r; o++) {\n        const s = e[o], a = i.length > o ? d.Deserialize(s, i[o], n, !1) : d.Deserialize(s, void 0, n, !1);\n        i.length <= o ? i.push(a) : i[o] = a;\n      }\n      return i;\n    }\n  },\n  {\n    // primitives\n    priority: 0,\n    isType: (e) => !e || typeof e != \"object\",\n    serialize: (e) => {\n      if (e && typeof e == \"number\") {\n        if (e === 1 / 0) return \"Infinity\";\n        if (e === -1 / 0) return \"-Infinity\";\n        if (isNaN(e)) return \"NaN\";\n      }\n      return e;\n    },\n    deserialize: (e, i) => {\n      if (typeof i == \"number\") {\n        if (e === \"Infinity\") return 1 / 0;\n        if (e === \"-Infinity\") return -1 / 0;\n        if (e === \"NaN\") return NaN;\n        if (typeof e == \"number\" || !e) return e;\n      }\n      return e;\n    }\n  },\n  A\n];\nlet m = d;\nconst k = class k {\n  static callFunction(e, i, n = []) {\n    if (!i) return e(...n);\n    if (e.name && i[e.name] === e) return e.call(i, ...n);\n    k.methodMap.has(i) || k.methodMap.set(i, /* @__PURE__ */ new WeakMap());\n    const r = k.methodMap.get(i);\n    if (!r.has(e)) {\n      let o = i;\n      for (; o; ) {\n        const s = Object.values(Object.getOwnPropertyDescriptors(o));\n        for (let a of s)\n          if (a.value === e)\n            return r.set(e, !0), e.call(i, ...n);\n        o = Object.getPrototypeOf(o);\n      }\n      r.set(e, !1);\n    }\n    return r.get(e) ? e.call(i, ...n) : e(...n);\n  }\n};\nk.methodMap = /* @__PURE__ */ new WeakMap();\nlet U = k;\nfunction I(t, e = \"param\") {\n  if (!t) throw new Error(\"onChange: fnKey is undefined, make sure the function exists or provide a string\");\n  return (i, n, r) => {\n    const o = {\n      get() {\n        return this[`_oc_${n}`];\n      },\n      set(s) {\n        var u;\n        const a = this[`_oc_${n}`];\n        if (a === s) return;\n        this[`_oc_${n}`] = s;\n        const c = e === \"param\" ? [n, s, a, this] : e === \"object\" ? [{ key: n, value: s, oldValue: a, target: this }] : [];\n        typeof t == \"string\" ? (u = this[t]) == null || u.call(this, ...c) : typeof t == \"function\" && U.callFunction(t, this, c);\n      }\n    };\n    if (r)\n      return L(r, \"value\") && delete r.value, L(r, \"writable\") && delete r.writable, L(r, \"initializer\") && delete r.initializer, Object.assign(r, o);\n    Object.defineProperty(i, n, o);\n  };\n}\nfunction Ke(t, e = \"void\") {\n  if (!t) throw new Error(\"onChange: fnKey is undefined, make sure the function exists or provide a string\");\n  return I(t, e);\n}\nfunction Je(t, e = \"object\") {\n  if (!t) throw new Error(\"onChange: fnKey is undefined, make sure the function exists or provide a string\");\n  return I(t, e);\n}\nfunction Ge(t) {\n  return I((e, i, n, r) => {\n    if (!r.dispatchEvent) throw new Error(\"onChangeDispatchEvent: target does not have dispatchEvent\");\n    r.dispatchEvent({ type: t || `${e}-changed`, detail: { key: e, value: i, oldValue: n } });\n  }, \"param\");\n}\nfunction Xe(t) {\n  return (e, i) => {\n    const n = e.constructor;\n    if (n === Object) throw new Error(\"All properties in an object are serialized by default\");\n    m.TypeMap.has(n) || m.TypeMap.set(n, []), m.TypeMap.get(n).push([t || i, i]);\n  };\n}\nfunction Ze(t) {\n  return (e) => (e = class extends e {\n    constructor() {\n      super(...arguments), this.serializableClassId = t;\n    }\n    // static DataInConstructor = false // if constructor is equivalent to fromJSON, see LUTCubeTextureWrapper.\n  }, m.SerializableClasses.set(t, e), e);\n}\nasync function Qe(t, e, i, n = 12) {\n  const r = typeof e == \"string\" ? new TextEncoder().encode(e) : e, o = await crypto.subtle.digest(\"SHA-256\", r), s = crypto.getRandomValues(new Uint8Array(n)), a = Array.from(s).map((x) => String.fromCharCode(x)).join(\"\"), c = { name: \"AES-GCM\", iv: s }, u = await crypto.subtle.importKey(\"raw\", o, c, !1, [\"encrypt\"]), l = typeof t == \"string\" ? new TextEncoder().encode(t) : t, h = await crypto.subtle.encrypt(c, u, l), v = new Uint8Array(h), p = Array.from(v), b = p.map((x) => String.fromCharCode(x)).join(\"\"), E = i ? typeof i == \"string\" ? i : new TextDecoder().decode(i) : \"\", C = i ? typeof i == \"string\" ? new TextEncoder().encode(i) : Array.from(i) : [];\n  return typeof t == \"string\" ? E + a + b : new Uint8Array([...C, ...s, ...p]);\n}\nasync function je(t, e, i = 12) {\n  const n = typeof e == \"string\" ? new TextEncoder().encode(e) : e, r = await crypto.subtle.digest(\"SHA-256\", n), o = t.slice(0, i), a = { name: \"AES-GCM\", iv: typeof o == \"string\" ? new Uint8Array(Array.from(o).map((h) => h.charCodeAt(0))) : o }, c = await crypto.subtle.importKey(\"raw\", r, a, !1, [\"decrypt\"]), u = t.slice(i), l = typeof u == \"string\" ? new Uint8Array(Array.from(u).map((h) => h.charCodeAt(0))) : u;\n  try {\n    const h = await crypto.subtle.decrypt(a, c, l);\n    return typeof t == \"string\" ? new TextDecoder().decode(h) : new Uint8Array(h);\n  } catch {\n    throw new Error(\"Decrypt failed\");\n  }\n}\nasync function et() {\n  return \"showOpenFilePicker\" in window ? window.showOpenFilePicker().then((t) => t[0]) : window.chooseFileSystemEntries();\n}\nfunction tt() {\n  if (\"showSaveFilePicker\" in window) {\n    const e = {\n      types: [{\n        description: \"Text file\",\n        accept: { \"text/plain\": [\".txt\"] }\n      }]\n    };\n    return window.showSaveFilePicker(e);\n  }\n  const t = {\n    type: \"save-file\",\n    accepts: [{\n      description: \"Text file\",\n      extensions: [\"txt\"],\n      mimeTypes: [\"text/plain\"]\n    }]\n  };\n  return window.chooseFileSystemEntries(t);\n}\nfunction it(t) {\n  return t.text ? t.text() : ee(t);\n}\nfunction ee(t) {\n  return new Promise((e) => {\n    const i = new FileReader();\n    i.addEventListener(\"loadend\", (n) => {\n      const r = (n.srcElement || n.target).result;\n      e(r);\n    }), i.readAsText(t);\n  });\n}\nasync function nt(t, e) {\n  if (t.createWriter) {\n    const n = await t.createWriter();\n    await n.write(0, e), await n.close();\n    return;\n  }\n  const i = await t.createWritable();\n  await i.write(e), await i.close();\n}\nasync function rt(t, e) {\n  const i = {};\n  return e && (i.writable = !0, i.mode = \"readwrite\"), await t.queryPermission(i) === \"granted\" || await t.requestPermission(i) === \"granted\";\n}\nfunction R(t, e = 8192, i = !1) {\n  var c;\n  const n = t.width || t.videoWidth, r = t.height || t.videoHeight;\n  if (!n || !r) throw new Error(\"Invalid bitmap\");\n  const o = document.createElement(\"canvas\");\n  o.width = Math.min(e, n), o.height = Math.floor(1 + o.width * r / n);\n  const s = t instanceof ImageBitmap, a = s && i && Math.abs(o.width - n) < 0.5 ? o.getContext(\"bitmaprenderer\") : void 0;\n  return a ? a.transferFromImageBitmap(t) : (c = o.getContext(\"2d\")) == null || c.drawImage(t, 0, 0, o.width, o.height), s && i && t.close(), o;\n}\nfunction ot(t, e = 8192, i = !1, n = \"image/png\") {\n  if (!(t.width || t.videoWidth) || !(t.height || t.videoHeight)) return \"\";\n  const r = R(t, e, !1), o = r.toDataURL(n);\n  return r.remove(), i && t instanceof ImageBitmap && t.close(), o;\n}\nasync function st(t, e = 8192, i = !1, n = \"image/png\") {\n  if (!(t.width || t.videoWidth) || !(t.height || t.videoHeight)) return Promise.reject(\"Invalid bitmap\");\n  const r = R(t, e, !1);\n  return new Promise((o, s) => {\n    r.toBlob((a) => {\n      a ? o(a) : s(\"Could not get blob\"), r.remove(), i && t instanceof ImageBitmap && t.close();\n    }, n);\n  });\n}\nasync function at(t) {\n  return new Promise((e, i) => {\n    const n = new Image();\n    n.addEventListener(\"load\", () => {\n      const r = document.createElement(\"canvas\");\n      r.width = n.width, r.height = n.height;\n      const o = r.getContext(\"2d\");\n      if (!o) {\n        i(new Error(\"Could not get 2d context\"));\n        return;\n      }\n      o.drawImage(n, 0, 0, r.width, r.height);\n      const s = o.getImageData(0, 0, r.width, r.height);\n      e(s), r.remove(), n.remove();\n    }, !1), n.addEventListener(\"error\", (r) => {\n      n.remove(), i(r);\n    }, !1), n.src = t;\n  });\n}\nfunction te(t, {\n  backgroundColor: e = \"\",\n  scale: i = 1,\n  width: n = 512,\n  height: r = 512\n}) {\n  const o = document.createElement(\"canvas\"), s = o.getContext(\"2d\"), a = i, c = n, u = r;\n  return o.width = c * a, o.height = u * a, o.style.width = `${c}`, o.style.height = `${u}`, (e == null ? void 0 : e.length) > 0 && (s.fillStyle = e, s.fillRect(0, 0, o.width, o.height)), s.drawImage(t, 0, 0, o.width, o.height), o;\n}\nfunction ct(t) {\n  const e = document.createElement(\"canvas\");\n  return e.width = t.width, e.height = t.height, e.getContext(\"2d\").putImageData(t, 0, 0), e;\n}\nfunction lt() {\n  const t = document.createElement(\"canvas\");\n  return t.getContext && t.getContext(\"2d\") ? t.toDataURL(\"image/webp\").startsWith(\"data:image/webp\") : !1;\n}\nfunction ut(t) {\n  const e = document.createElement(\"canvas\");\n  e.width = t.width || t.videoWidth || 1, e.height = t.height || t.videoHeight || 1;\n  const i = e.getContext(\"2d\");\n  if (!i) throw new Error(\"Unable to get 2d context\");\n  return i.translate(0, t.height || t.videoHeight || 1), i.scale(1, -1), i.drawImage(t, 0, 0), e;\n}\nfunction dt(t) {\n  return new Promise((e, i) => {\n    const n = new Image(), r = URL.createObjectURL(t);\n    n.onload = () => {\n      URL.revokeObjectURL(r), e(n);\n    }, n.onerror = (o) => {\n      URL.revokeObjectURL(r), i(o);\n    }, n.src = r;\n  });\n}\nconst ft = (t) => `data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='16' height='16' fill='%23${t}'/%3E%3C/svg%3E%0A`, ht = (t) => `data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='7' fill='%23${t}'/%3E%3C/svg%3E%0A`, pt = (t) => `data:image/svg+xml,%3Csvg viewBox='0 0 80 14' xmlns='http://www.w3.org/2000/svg'%3E%3Ctext style='font: 8px \"Roboto Mono\", \"Source Code Pro\", Menlo, Courier, monospace; fill: white;' x='9' y='9'%3E${t}%3C/text%3E%3C/svg%3E%0A`, F = async (t, e) => {\n  const i = await N(t);\n  return te(i, e);\n}, ie = async (t, e) => await F(t, e).then((i) => i.toDataURL(\"image/png\")), ne = async (t) => X(await (await fetch(t)).blob());\nasync function mt(t, e = ne) {\n  const i = t.match(/(((ftp|https?):\\/\\/)[\\-\\w@:%_\\+.~#?,&\\/\\/=]+)/g);\n  if (i)\n    for (const n of i) {\n      const r = await e(n);\n      t = t.replace(n, r);\n    }\n  return t;\n}\nfunction q(t, e, { width: i, height: n }, r = !0) {\n  const o = `\n<svg viewBox=\"0 0 ${i} ${n}\" xmlns=\"http://www.w3.org/2000/svg\">\n    <style>\n    ${e}\n    </style>\n    <foreignObject x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\n        <div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"height: 100%; width: 100%; position: absolute: top:0; left:0\">\n            ${t}\n        </div>\n    </foreignObject>\n</svg>\n    `;\n  return r ? J(o) : o;\n}\nasync function gt(t, e, i) {\n  const n = q(t, e, i);\n  return await F(n, i);\n}\nasync function wt(t, e, i) {\n  const n = q(t, e, i);\n  return await ie(n, i);\n}\nfunction yt(t, e) {\n  return Math.abs(t) > Math.abs(e) ? t : e;\n}\nfunction vt(t, e, i) {\n  const n = i ? 1 : 0, r = ~(1 << e);\n  return t & r | n << e;\n}\nfunction bt(t, e) {\n  const i = ~(1 << e);\n  return t & i;\n}\nfunction xt() {\n  const t = (n, r) => n.toString(16).padStart(r, \"0\"), e = crypto.getRandomValues(new Uint8Array(16));\n  e[6] = e[6] & 15 | 64, e[8] = e[8] & 63 | 128;\n  const i = new DataView(e.buffer);\n  return `${t(i.getUint32(0), 8)}-${t(i.getUint16(4), 4)}-${t(i.getUint16(6), 4)}-${t(i.getUint16(8), 4)}-${t(i.getUint32(10), 8)}${t(i.getUint16(14), 4)}`;\n}\nfunction kt(t, e = null) {\n  var n;\n  return (n = window == null ? void 0 : window.location) != null && n.href ? new URL(window.location.href).searchParams.get(t) ?? e : e;\n}\nfunction Et(t, e, i = !1) {\n  var r;\n  if (!((r = window == null ? void 0 : window.location) != null && r.href)) return;\n  const n = new URLSearchParams(window.location.search);\n  e == null ? n.has(t) && n.delete(t) : n.set(t, e), i ? window.location.search = n.toString() : window.history.replaceState({}, \"\", \"?\" + n.toString());\n}\nfunction Ct(t, e = \"/\") {\n  return t.join(e);\n}\nfunction _t(t, e) {\n  const i = (e ? `var Module = { locateFile: function(s) { return \"${e}\"; } }; \n` : \"\") + `importScripts( \"${t}\" );`;\n  return URL.createObjectURL(new Blob([i], { type: \"text/javascript\" }));\n}\nconst St = {\n  alert: async (t) => window.alert(t),\n  prompt: async (t, e, i) => window.prompt(t, e),\n  confirm: async (t) => window.confirm(t),\n  confirmSync: (t) => window.confirm(t)\n}, re = '.dialog-container{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1000;border-radius:10px;padding:20px;max-width:calc(100% - 32px);width:calc(100% - 32px);color:#0a0a0a;background-color:#fff;border:1px solid oklch(.922 0 0);box-shadow:#0000 0 0,#0000 0 0,#0000 0 0,#0000 0 0,#0000001a 0 10px 15px -3px,#0000001a 0 4px 6px -4px;display:flex;gap:1rem;flex-direction:column;box-sizing:border-box;font-family:Inter,-apple-system,\"system-ui\",Segoe UI,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\";transition:max-width .5s,width .5s,height .5s}.dialog-content{display:flex;flex-direction:column;gap:.5rem;text-align:center}.dialog-title{font-size:1.125rem;font-weight:600;line-height:1.5;color:#0a0a0a}.dialog-message{color:#737373;font-size:.875rem;line-height:1.42}.dialog-footer{display:flex;gap:10px;flex-direction:column-reverse}@media (width >= 40rem){.dialog-content{text-align:left}.dialog-container{max-width:512px;width:512px}.dialog-footer{flex-direction:row;justify-content:flex-end}}.dialog-button,.dialog-input{height:2.25rem;box-sizing:border-box}.dialog-input{width:100%;padding:.25rem .75rem;font-size:1rem;border:1px solid oklch(.922 0 0);border-radius:.5rem;background:transparent;color:#0a0a0a;outline:none;transition:outline-width .2s}.dialog-button{padding:.5rem 1rem;box-shadow:#0000 0 0,#0000 0 0,#0000 0 0,#0000000d 0 1px 2px;border-radius:.5rem;border:1px solid oklch(.922 0 0);cursor:pointer;font-size:.875rem;background-color:#fff;color:#0a0a0a;transition:background-color .2s ease,color .2s ease,outline-width .2s ease}.dialog-button:focus,.dialog-input:focus{outline:3px solid #6d7a8c66}.dialog-button:hover{background-color:#f8f8f8}.dialog-ok{background-color:#0a0a0a;color:#fff}.dialog-ok:hover{background-color:#222}.dialog-link{max-width:100%;display:inline-block;vertical-align:bottom;text-decoration:underline;color:var(#2563eb);overflow:hidden}.dialog-link-text{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}';\nlet S = null;\nfunction oe(t) {\n  const e = /((https?:\\/\\/|www\\.)[^\\s<]+)/g;\n  return t.replace(e, (i) => {\n    let n = i;\n    return n.startsWith(\"http\") || (n = \"https://\" + n), `<a href=\"${n}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"dialog-link\"><span class=\"dialog-link-text\">${g(i)}</span></a>`;\n  });\n}\nfunction se(t) {\n  const e = g(t);\n  return oe(e).replace(/\\n/g, \"<br>\");\n}\nfunction P(t) {\n  return `\n${t.title ? `<div class=\"dialog-title\">${g(t.title)}</div>` : \"\"}\n<div class=\"dialog-message\">${se(t.message)}</div>\n`;\n}\nconst ae = (t) => `\n<div class=\"dialog-content\">\n${P(t)}\n</div>\n<div class=\"dialog-footer\">\n    ${t.ok && `<button class=\"dialog-button dialog-ok\">${g(t.ok)}</button>` || \"\"}\n</div>\n`, ce = (t) => `\n<div class=\"dialog-content\">\n${P(t)}\n</div>\n<div class=\"dialog-footer\">\n    ${t.cancel && `<button class=\"dialog-button dialog-cancel\">${g(t.cancel)}</button>` || \"\"}\n    ${t.ok && `<button class=\"dialog-button dialog-ok\">${g(t.ok)}</button>` || \"\"}\n</div>\n`, le = (t) => `\n<div class=\"dialog-content\">\n    ${P(t)}\n    <input class=\"dialog-input\" type=\"text\" value=\"${t.defaultValue ?? \"\"}\" style=\"margin-top:0.5rem;\"/>\n</div>\n<div class=\"dialog-footer\">\n    ${t.cancel && `<button class=\"dialog-button dialog-cancel\">${g(t.cancel)}</button>` || \"\"}\n    ${t.ok && `<button class=\"dialog-button dialog-ok\">${g(t.ok)}</button>` || \"\"}\n</div>\n`;\nfunction ue() {\n  S || (S = document.createElement(\"style\"), S.textContent = re, document.head.appendChild(S));\n}\nfunction z(t, { message: e, ...i }) {\n  ue();\n  const n = document.createElement(\"div\"), r = e == null ? void 0 : e.split(\":\")[0];\n  return r && e && (e = e.replace(r + \":\", \"\").trim()), n.innerHTML = t({ ...i, message: e, title: r }), n.classList.add(\"dialog-container\"), document.body.appendChild(n), n;\n}\nconst Lt = {\n  alert: async (t) => {\n    const e = z(ae, { message: t || \"Alert\", ok: \"Okay\" });\n    return new Promise((i) => {\n      const n = e.querySelector(\".dialog-ok\"), r = (s) => {\n        (s.key === \"Enter\" || s.key === \"Escape\") && (s.preventDefault(), n == null || n.click());\n      }, o = () => {\n        window.removeEventListener(\"keydown\", r), document.body.removeChild(e);\n      };\n      window.addEventListener(\"keydown\", r), n == null || n.addEventListener(\"click\", () => {\n        o(), i();\n      }), n == null || n.focus();\n    });\n  },\n  prompt: async (t, e, i = !0) => {\n    const n = z(le, {\n      message: t || \"Enter some text\",\n      ok: \"OK\",\n      cancel: i ? \"Cancel\" : void 0,\n      defaultValue: e\n    });\n    return new Promise((r) => {\n      const o = n.querySelector(\".dialog-ok\"), s = n.querySelector(\".dialog-cancel\"), a = n.querySelector(\".dialog-input\");\n      a.addEventListener(\"keydown\", (l) => {\n        l.key === \"Enter\" && (l.preventDefault(), o == null || o.click());\n      });\n      const c = (l) => {\n        l.key === \"Escape\" && s && (l.preventDefault(), s == null || s.click());\n      }, u = () => {\n        window.removeEventListener(\"keydown\", c), document.body.removeChild(n);\n      };\n      window.addEventListener(\"keydown\", c), o == null || o.addEventListener(\"click\", () => {\n        const l = a.value;\n        u(), r(l);\n      }), s == null || s.addEventListener(\"click\", () => {\n        u(), r(null);\n      }), a == null || a.focus(), a == null || a.select();\n    });\n  },\n  confirm: async (t) => {\n    const e = z(ce, { message: t || \"Are you sure?\", ok: \"Yes\", cancel: \"No\" });\n    return new Promise((i) => {\n      const n = e.querySelector(\".dialog-ok\"), r = e.querySelector(\".dialog-cancel\"), o = (a) => {\n        a.key === \"Escape\" && r && (a.preventDefault(), r.click());\n      }, s = () => {\n        window.removeEventListener(\"keydown\", o), document.body.removeChild(e);\n      };\n      window.addEventListener(\"keydown\", o), n == null || n.addEventListener(\"click\", () => {\n        s(), i(!0);\n      }), r == null || r.addEventListener(\"click\", () => {\n        s(), i(!1);\n      }), r == null || r.focus();\n    });\n  },\n  confirmSync: (t) => window.confirm(t)\n};\nfunction y(t) {\n  return t === null || typeof t != \"object\" ? t : Array.isArray(t) ? t.map(y) : !t._ui_isPrimitive && typeof t.clone == \"function\" && t._ui_primitiveClone !== !1 ? t.clone() : t;\n}\nfunction T(t, e) {\n  return t === null || typeof t != \"object\" ? t === e : Array.isArray(t) ? Array.isArray(e) && t.length === e.length && t.every((i, n) => T(i, e[n])) : !t._ui_isPrimitive && typeof t.equals == \"function\" && t._ui_primitiveEquals !== !1 ? !!t.equals(e) : t === e;\n}\nfunction O(t, e) {\n  if (e === null || typeof e != \"object\") return e;\n  if (Array.isArray(e))\n    if (t && Array.isArray(t)) {\n      if (t.length < e.length) {\n        for (let i = 0; i < t.length; i++) t[i] = O(t[i], e[i]);\n        for (let i = t.length; i < e.length; i++) t.push(y(e[i]));\n      } else {\n        for (let i = 0; i < e.length; i++) t[i] = O(t[i], e[i]);\n        t.length = e.length;\n      }\n      return t;\n    } else return y(e);\n  else return !e._ui_isPrimitive && typeof e.copy == \"function\" && e._ui_primitiveCopy !== !1 ? t && typeof t == \"object\" && !Array.isArray(t) && !t._ui_isPrimitive && typeof t.copy == \"function\" && t._ui_primitiveCopy !== !1 ? (t.copy(e), t) : y(e) : e;\n}\nfunction de(t, e, i, n = 2e3) {\n  if (!t || !t.enabled) return;\n  const r = e;\n  if (r.type !== i) return t.record(e);\n  const o = t.peek();\n  let s = !!o && o.type === i && o.uid === r.uid;\n  if (s) {\n    const a = o;\n    !a.final && r.time - a.time < n ? (r.lastVal = a.lastVal, r.val = y(r.val), t.replaceLast(r)) : s = !1;\n  }\n  s || T(r.lastVal, r.val) || (r.val = y(r.val), t.record(r));\n}\nfunction At(t, e, i, n, r, o, s = !0, a = 2e3, c = !1, u) {\n  const [l, h] = e, v = n.lastValue ?? (l == null ? void 0 : l[h]);\n  let p = !1;\n  const b = n.last ?? !0, E = T(v, i), C = y(v);\n  E ? p = !b : l ? O(v, i) !== v ? p = !D(l, h, i, !0, !0) : p = !1 : p = !0;\n  const x = !p && (b || !E);\n  return s && x && t && de(t, {\n    type: o,\n    lastVal: C,\n    val: i,\n    final: b,\n    props: n,\n    time: Date.now(),\n    uid: r,\n    binding: c ? e : void 0,\n    // save binding only if required, otherwise it could cause memory leaks\n    onUndoRedo: u\n  }, o, a), { last: b, value: i, lastValue: C, undoable: x };\n}\nexport {\n  M as Damper,\n  U as FnCaller,\n  ge as JSUndoManager,\n  $e as LinearToSRGB,\n  me as PointerDragHelper,\n  Me as SRGBToLinear,\n  m as Serialization,\n  H as SimpleEventDispatcher,\n  B as TYPED_ARRAYS,\n  yt as absMax,\n  je as aesGcmDecrypt,\n  Qe as aesGcmEncrypt,\n  xe as arrayBufferToBase64,\n  ke as base64ToArrayBuffer,\n  X as blobToDataURL,\n  dt as blobToImage,\n  ut as canvasFlipY,\n  bt as clearBit,\n  y as clonePrimitive,\n  V as cloneScriptTag,\n  Re as colorToDataUrl,\n  O as copyPrimitive,\n  qe as copyProps,\n  we as createCanvasElement,\n  ye as createDiv,\n  N as createImage,\n  ve as createScriptFromURL,\n  W as createStyles,\n  K as css,\n  Ve as deepAccessObject,\n  G as downloadBlob,\n  Ie as downloadFile,\n  mt as embedUrlRefs,\n  T as equalsPrimitive,\n  g as escapeHtml,\n  Y as escapeRegExp,\n  j as findLastIndex,\n  et as getFileHandle,\n  Le as getFilenameFromPath,\n  Be as getKeyByValue,\n  tt as getNewFileHandle,\n  Fe as getOrCall,\n  Z as getPropertyDescriptor,\n  Ee as getTypedArray,\n  kt as getUrlQueryParam,\n  Ue as glsl,\n  Oe as html,\n  Lt as htmlDialogWrapper,\n  gt as htmlToCanvas,\n  wt as htmlToPng,\n  q as htmlToSvg,\n  ot as imageBitmapToBase64,\n  st as imageBitmapToBlob,\n  R as imageBitmapToCanvas,\n  ct as imageDataToCanvas,\n  te as imageToCanvas,\n  at as imageUrlToImageData,\n  He as includesAll,\n  Q as isPropertyWritable,\n  lt as isWebpExportSupported,\n  ze as longestCommonPrefix,\n  ft as makeColorSvg,\n  ht as makeColorSvgCircle,\n  pt as makeTextSvg,\n  Te as mobileAndTabletCheck,\n  _ as now,\n  L as objectHasOwn,\n  Ye as objectMap,\n  $ as objectMap2,\n  I as onChange,\n  Ke as onChange2,\n  Je as onChange3,\n  Ge as onChangeDispatchEvent,\n  Se as parseFileExtension,\n  Ct as pathJoin,\n  De as prettyScrollbar,\n  it as readFile,\n  de as recordUndoCommand,\n  _t as remoteWorkerURL,\n  f as replaceAll,\n  Ae as safeReplaceString,\n  D as safeSetProperty,\n  Ze as serializable,\n  Xe as serialize,\n  be as setInnerHTMLWithScripts,\n  Et as setUrlQueryParam,\n  At as setValueUndoCommand,\n  F as svgToCanvas,\n  ie as svgToPng,\n  J as svgUrl,\n  pe as timeout,\n  _e as toCamelCase,\n  Ce as toTitleCase,\n  vt as updateBit,\n  Pe as uploadFile,\n  xt as uuidV4,\n  rt as verifyPermission,\n  St as windowDialogWrapper,\n  Ne as wrapThisFunction,\n  We as wrapThisFunction2,\n  nt as writeFile\n};\n//# sourceMappingURL=bundle.esm.js.map\n","export type {IEvent, IEventDispatcher} from 'ts-browser-helpers'\nexport type {ImageCanvasOptions} from 'ts-browser-helpers'\nexport type {AnyFunction, AnyOptions, Class, IDisposable, IJSONSerializable, PartialPick, PartialRecord, StringKeyOf, Fof, ValOrFunc, ValOrArr, ValOrFuncOp, ValOrArrOp} from 'ts-browser-helpers'\nexport type {Serializer} from 'ts-browser-helpers'\n\nexport {PointerDragHelper} from 'ts-browser-helpers'\nexport {JSUndoManager} from 'ts-browser-helpers'\nexport type {JSUndoManagerCommand2, JSUndoManagerCommand, JSUndoManagerOptions, JSUndoManagerCommand1} from 'ts-browser-helpers'\nexport {Damper} from 'ts-browser-helpers'\nexport {SimpleEventDispatcher} from 'ts-browser-helpers'\n\nexport {createCanvasElement, createDiv, createImage, createStyles, createScriptFromURL, cloneScriptTag, setInnerHTMLWithScripts} from 'ts-browser-helpers'\nexport {TYPED_ARRAYS, arrayBufferToBase64, base64ToArrayBuffer, getTypedArray} from 'ts-browser-helpers'\nexport {escapeRegExp, getFilenameFromPath, parseFileExtension, replaceAll, toTitleCase, longestCommonPrefix, toCamelCase, safeReplaceString} from 'ts-browser-helpers'\nexport {prettyScrollbar} from 'ts-browser-helpers'\nexport {blobToDataURL, downloadBlob, downloadFile, uploadFile, mobileAndTabletCheck} from 'ts-browser-helpers'\nexport {LinearToSRGB, SRGBToLinear, colorToDataUrl} from 'ts-browser-helpers'\nexport {onChange, onChange2, onChange3, onChangeDispatchEvent, serialize, serializable, type OnChangeDispatchEventType} from 'ts-browser-helpers'\nexport {aesGcmDecrypt, aesGcmEncrypt} from 'ts-browser-helpers'\nexport {verifyPermission, writeFile, getFileHandle, getNewFileHandle, readFile} from 'ts-browser-helpers'\nexport {embedUrlRefs, htmlToCanvas, htmlToPng, htmlToSvg} from 'ts-browser-helpers'\nexport {imageToCanvas, imageBitmapToBase64, imageUrlToImageData, imageDataToCanvas, canvasFlipY, isWebpExportSupported, imageBitmapToBlob, imageBitmapToCanvas, blobToImage} from 'ts-browser-helpers'\nexport {absMax, clearBit, updateBit, uuidV4} from 'ts-browser-helpers'\nexport {includesAll, wrapThisFunction, wrapThisFunction2, findLastIndex} from 'ts-browser-helpers'\nexport {copyProps, getOrCall, getPropertyDescriptor, isPropertyWritable, safeSetProperty} from 'ts-browser-helpers'\nexport {deepAccessObject, getKeyByValue, objectHasOwn, objectMap2, objectMap} from 'ts-browser-helpers'\nexport {makeColorSvg, makeTextSvg, makeColorSvgCircle, svgToCanvas, svgToPng} from 'ts-browser-helpers'\nexport {timeout, now} from 'ts-browser-helpers'\nexport {pathJoin, getUrlQueryParam, setUrlQueryParam, remoteWorkerURL} from 'ts-browser-helpers'\nexport {css, glsl, html, svgUrl} from 'ts-browser-helpers'\nexport {Serialization} from 'ts-browser-helpers'\nexport {FnCaller} from 'ts-browser-helpers'\nexport {windowDialogWrapper, type IDialogWrapper} from 'ts-browser-helpers'\nexport {htmlDialogWrapper} from 'ts-browser-helpers'\nexport {equalsPrimitive, copyPrimitive, clonePrimitive, type PrimitiveValObject, type PrimitiveVal} from 'ts-browser-helpers'\nexport {recordUndoCommand, setValueUndoCommand} from 'ts-browser-helpers'\nexport type {SetValueUndoCommandProps, SetValueUndoCommand, ActionUndoCommand} from 'ts-browser-helpers'\n\nexport function getPropDesc(obj: any, prop: keyof typeof obj) {\n    let proto = obj\n    let protoDesc = undefined\n    while (!protoDesc && proto) {\n        proto = Object.getPrototypeOf(proto)\n        proto && (protoDesc = Object.getOwnPropertyDescriptor(proto, prop))\n    }\n    return {proto, protoDesc}\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function isNonRelativeUrl(url: string) { // todo rename to something better\n    return url.startsWith('http://')\n        || url.startsWith('https://')\n        || url.startsWith('data:')\n        || url.startsWith('asset://')\n        || url.startsWith('/') // domain relative\n        || url.startsWith('//') // protocol relative\n    // not blob:\n}\n","#ifndef SIMPLE_CAMERA_HELPERS\n#define SIMPLE_CAMERA_HELPERS\n#ifndef USE_TRANSMISSION\nuniform mat4 projectionMatrix;\n#endif\nvec3 viewToScreen(const in vec3 pos) {\n    vec4 projected = projectionMatrix * vec4(pos, 1.0);\n    return vec3(0.5 + 0.5 * projected.xy / projected.w, projected.w);\n}\nvec3 screenToView(const in vec2 uv, const in float viewZ) {\n    vec2 uv_ = 2. * uv - 1.;\n    float xe = -(uv_.x + projectionMatrix[2][0]) * viewZ / projectionMatrix[0][0];\n    float ye = -(uv_.y + projectionMatrix[2][1]) * viewZ / projectionMatrix[1][1];\n    return vec3(xe, ye, viewZ);\n}\n#endif\n","#ifndef BASIC_CAMERA_HELPERS\n#define BASIC_CAMERA_HELPERS\n\n// See also PerspectiveCamera2\nuniform mat4 projection;\nuniform vec2 cameraNearFar;\nuniform vec3 cameraPositionWorld;\n\n#ifndef THREE_PACKING_INCLUDED\n#define THREE_PACKING_INCLUDED\n#include <packing>\n#endif\n\nfloat linstep(float edge0, float edge1, float value) {\n    return clamp((value-edge0)/(edge1-edge0), 0.0, 1.0);\n}\n\nfloat depthToViewZ(const in float depth){\n    return (depth > 0.999) ? -cameraNearFar.y * 1000.0 : -mix(cameraNearFar.x, cameraNearFar.y, depth);\n}\nfloat viewZToDepth(const in float viewZ){\n    return linstep(-cameraNearFar.x, -cameraNearFar.y, viewZ);\n}\n\nvec4 viewToScreen3(const in vec3 pos) {\n    vec4 projected = projection * vec4(pos, 1.0);\n    projected.z = pos.z;\n    // w is -viewZ\n    projected.w = 1./projected.w;\n    projected.xyz *= projected.w;\n    projected.xy = 0.5 + 0.5 * projected.xy;\n    return projected;\n}\n\nvec3 screenToView3(const in vec2 uv, const in float viewZ) {\n    vec2 uv_ = 2. * uv - 1.;\n    float xe = -(uv_.x + projection[2][0]) * viewZ / projection[0][0];\n    float ye = -(uv_.y + projection[2][1]) * viewZ / projection[1][1];\n    return vec3(xe, ye, viewZ);\n}\n\nfloat viewZFromNDCZ(const in float depth) {\n    #if PERSPECTIVE_CAMERA == 1\n    return perspectiveDepthToViewZ(depth, cameraNearFar.x, cameraNearFar.y);\n    #else\n    return orthographicDepthToViewZ(depth, cameraNearFar.x, cameraNearFar.y);\n    #endif\n}\n\n\n#endif\n","#ifndef BASIC_RANDOM_HELPERS\n#define BASIC_RANDOM_HELPERS\n\nfloat random(float n){return fract(sin(n) * 43758.5453123);}\n\nfloat random2(vec2 n,float x){n+=x;return fract(sin(dot(n.xy,vec2(12.9898, 78.233)))*43758.5453);}\n\nfloat random3(vec3 v) {\n    v = fract(v * 443.8975);\n    v += dot(v, v.yzx + 19.19);\n    return fract((v.x + v.y) * v.z);\n}\n\n// https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Shaders/Private/Random.ush#L27\nfloat interleavedGradientNoise(const in vec2 fragCoord, const in float seed) {\n    vec3 magic = vec3(0.06711056, 0.00583715, 52.9829189);\n    return fract(magic.z * fract(dot(fragCoord.xy + seed * vec2(2.083, 4.867), magic.xy)));\n}\n\nvec3 hash3( vec2 p )\n{\n    vec3 q = vec3( dot(p,vec2(127.1,311.7)),\n    dot(p,vec2(269.5,183.3)),\n    dot(p,vec2(419.2,371.9)) );\n    return fract(sin(q)*43758.5453);\n}\n\n#endif\n","\nvarying vec2 vUv;\nvoid main() {\n    vUv = uv;\n    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n","\nvarying vec2 vUv;\nvoid main() {\n    gl_FragColor = vec4( vUv, 0.0, 1.0 );\n}\n","#ifndef VORONOI_HELPER\n#define VORONOI_HELPER\n\nfloat voronoi_distance(vec2 a, vec2 b, float metric) {\n    return distance(a, b);\n}\n\n// Blender port of the original voronoise function\nfloat voronoi_f1_2d(in vec2 coord, in float randomness, in float flakeClamp, in float flakeRadius, inout vec3 outColor) {\n    vec2 cellPosition = floor(coord);\n    vec2 localPosition = coord - cellPosition;\n\n    float minDistance = 8.0;\n    vec2 targetOffset, targetPosition;\n    for (int j = -1; j <= 1; j++) {\n        for (int i = -1; i <= 1; i++) {\n            vec2 cellOffset = vec2(i, j);\n            vec2 pointPosition = cellOffset + hash3(cellPosition + cellOffset).xy * randomness;\n            float distanceToPoint = voronoi_distance(pointPosition, localPosition, 1.);\n            if (distanceToPoint < minDistance) {\n                targetOffset = cellOffset;\n                minDistance = distanceToPoint;\n                targetPosition = pointPosition;\n            }\n        }\n    }\n    float outDistance = minDistance;\n    float dist = step(flakeRadius, outDistance);\n    outColor = hash3(cellPosition + hash3(cellPosition + targetOffset).xy * randomness + targetOffset);\n    vec3 outColor1 = minDistance < flakeRadius ? outColor : vec3(0.5, 0.5, 1.);\n    outDistance = mix(dist, minDistance, flakeClamp);\n    outColor = mix(outColor1, outColor, flakeClamp);\n    return outDistance;\n}\n\n#endif\n","import simpleCameraHelpers from './shaders/simpleCameraHelpers.glsl'\nimport cameraHelpers from './shaders/cameraHelpers.glsl'\nimport randomHelpers from './shaders/randomHelpers.glsl'\nimport defaultVertex from './shaders/defaultVertex.glsl'\nimport defaultFragment from './shaders/defaultFragment.glsl'\nimport voronoiNoise from './shaders/voronoiNoise.glsl'\n\nexport const shaderUtils = {\n    simpleCameraHelpers, cameraHelpers, randomHelpers, defaultVertex, defaultFragment, voronoiNoise,\n}\n","import { uuidV4 as R, getOrCall as f, equalsPrimitive as A, copyPrimitive as E, clonePrimitive as M, recordUndoCommand as V, setValueUndoCommand as w, SimpleEventDispatcher as O, JSUndoManager as F, getUrlQueryParam as P, now as x, timeout as I, createDiv as Q } from \"ts-browser-helpers\";\nimport { clonePrimitive as re, copyPrimitive as ne, equalsPrimitive as ie } from \"ts-browser-helpers\";\n/**\n * @license\n * uiconfig.js v0.3.1\n * Copyright 2022-2025 repalash <palash@shaders.app>\n * MIT License\n * See ./dependencies.txt for bundled third-party dependencies and licenses.\n */\nconst C = class C {\n};\nC.Map = /* @__PURE__ */ new Map();\nlet c = C;\nfunction v(n, e, t, r, i = !0) {\n  r = r ?? n[e], t = t ?? e + \"\";\n  const o = r == null ? void 0 : r.uiConfig;\n  let s;\n  if (o)\n    s = o;\n  else {\n    const a = T(r);\n    a === \"folder\" ? s = U(t, r, {}, \"folder\", i) : a && (s = {\n      type: a,\n      label: t,\n      property: [n, e]\n    });\n  }\n  return s && !s.label && (s.label = t), s;\n}\nfunction _(n) {\n  if (!n) return [];\n  let e = n.constructor || Object;\n  e === Array && (e = Object);\n  const t = [], r = [];\n  for (; e && e !== Object; )\n    r.push(e), e = Object.getPrototypeOf(e);\n  if (!r.length || Array.isArray(n)) {\n    const i = typeof n == \"object\" ? Object.keys(n) : Array.isArray(n) ? n.map((o, s) => s) : [];\n    for (const o of i) {\n      const s = n[o];\n      if (s == null) continue;\n      const a = v(n, o, o + \"\", s, !0);\n      a && t.push(a);\n    }\n  }\n  return r.reverse().forEach((i) => {\n    var o;\n    (o = c.Map.get(i)) == null || o.forEach(({ params: s, propKey: a, uiType: u }) => {\n      let d;\n      if (u || (d = () => v(n, a)), d || (d = {\n        property: [n, a],\n        type: u || \"input\"\n        // ...params,\n        // ...extraParams,\n      }), s) {\n        const y = typeof s.params == \"function\" ? s.params(n) : s.params || {}, p = { ...s };\n        if (delete p.params, typeof d == \"function\") {\n          const m = d;\n          d = () => {\n            const l = m();\n            return l && Object.assign(l, { ...p, ...y });\n          };\n        } else\n          Object.assign(d, { ...p, ...y });\n      }\n      t.push(d);\n    });\n  }), t;\n}\nfunction U(n, e, t = {}, r = \"folder\", i = !1) {\n  return {\n    type: r,\n    label: n,\n    children: i ? [() => _(e)] : _(e),\n    uuid: R(),\n    ...t\n  };\n}\nfunction T(n) {\n  return n == null ? null : Array.isArray(n) ? \"folder\" : typeof n == \"boolean\" ? \"checkbox\" : typeof n == \"number\" ? \"number\" : typeof n == \"string\" ? \"input\" : typeof n == \"function\" ? \"button\" : typeof n.x == \"number\" ? \"vec\" : typeof n.r == \"number\" ? \"color\" : n.isTexture ? \"image\" : typeof n == \"object\" ? \"folder\" : null;\n}\nfunction B(n) {\n  return (e, t) => {\n    const r = e.constructor;\n    if (r === Object) throw new Error(\"Not possible to use uiConfig decorator on an object, use class instead\");\n    c.Map.has(r) || c.Map.set(r, []), n(e, t, c.Map.get(r));\n  };\n}\nfunction h(n, e) {\n  return B((t, r, i) => {\n    const o = i.findIndex((s) => s.propKey === r);\n    if (o && o < 0)\n      i.push({\n        params: e || {},\n        propKey: r,\n        uiType: n\n      });\n    else\n      throw new Error(`Property ${r} already has a uiConfig decorator`);\n  });\n}\nfunction b(n, e, t = \"panel\") {\n  return (r) => class extends r {\n    constructor() {\n      super(...arguments), this.uiConfig = U(f(n, this) || \"\", this, e || {}, t);\n    }\n  };\n}\nfunction j(n, e) {\n  return h(\"monitor\", { label: n, params: e });\n}\nfunction q(n, e, t, r) {\n  return h(\"slider\", { label: n, bounds: e, stepSize: t, params: r });\n}\nfunction D(n, e, t, r) {\n  return h(\"vec\", { label: n, bounds: e, stepSize: t, params: r });\n}\nfunction N(n, e, t) {\n  return Array.isArray(e) && typeof e[0] == \"string\" && (e = e.map((r) => ({ label: r, value: r }))), h(\"dropdown\", { label: n, children: e, params: t });\n}\nfunction W(n, e) {\n  return h(\"button\", { label: n, params: e });\n}\nfunction z(n, e) {\n  return h(\"input\", { label: n, params: e });\n}\nfunction H(n, e) {\n  return h(\"number\", { label: n, params: e });\n}\nfunction J(n, e) {\n  return h(\"color\", { label: n, params: e });\n}\nfunction $(n, e) {\n  return h(\"image\", { label: n, params: e });\n}\nfunction G(n, e) {\n  return h(\"checkbox\", { label: n, params: e });\n}\nfunction K(n, e) {\n  return b(n, e, \"panel\");\n}\nfunction X(n, e) {\n  return b(n, e, \"folder\");\n}\nfunction Y(n) {\n  return n;\n}\nconst g = {\n  setValue: \"UiConfigMethods_set\",\n  action: \"UiConfigMethods_action\"\n};\nclass k {\n  constructor(e) {\n    this._renderer = e, this.undoEditingWaitTime = 2e3, this.undoPresets = {\n      [g.setValue]: (t) => {\n        const r = () => {\n          var i, o;\n          t.onUndoRedo && t.onUndoRedo(t), (o = (i = t.uid).uiRefresh) == null || o.call(i, !1);\n        };\n        return {\n          undo: () => {\n            this.setValue(t.uid, t.lastVal, t.props, void 0, !1).then(r);\n          },\n          redo: () => {\n            this.setValue(t.uid, t.val, t.props, void 0, !1).then(r);\n          }\n        };\n      },\n      [g.action]: (t) => {\n        const r = () => {\n          var i, o;\n          t.onUndoRedo && t.onUndoRedo(t), (o = (i = t.uid).uiRefresh) == null || o.call(i, !1);\n        };\n        return {\n          undo: async () => {\n            await t.undo.call(t.target, ...t.args), r();\n          },\n          redo: async () => {\n            await t.redo.call(t.target, ...t.args), r();\n          }\n        };\n      }\n    };\n  }\n  getBinding(e, t = !0) {\n    let r = f(e.property, e);\n    const i = f(e.path, e);\n    if (r === void 0 && Object.hasOwn(e, \"value\") && (r = [e, \"value\"]), r === void 0 && t && (r = f(e.parentProperty, e)), !r || typeof r[0] != \"object\" || !r[1])\n      return [void 0, \"\"];\n    if (typeof r[1] == \"string\" && i && i.length && (r = [r[0], r[1] + \".\" + i]), typeof r[1] == \"string\" && r[1].includes(\".\")) {\n      const o = r[1].split(\".\");\n      let s = r[0];\n      const a = o.pop() || \"\";\n      for (const u of o)\n        if (s = Array.isArray(s) ? s[parseInt(u)] : s[u], !s)\n          return console.warn(\"Cannot determine property, invalid property path\", e, r), [void 0, \"\"];\n      r = [s, a];\n    }\n    return Array.isArray(r[0]) && typeof r[1] == \"string\" && (r[1] = parseInt(r[1])), r;\n  }\n  getRawValue(e) {\n    const [t, r] = this.getBinding(e);\n    return t ? t[r] : void 0;\n  }\n  /**\n   * Get the value from config\n   * @param config\n   * @param val - existing value, new value can be copied to this if not equal.\n   * @param copyOnEqual - whether the value should be copied to val if equal. Default is true.\n   * @returns The value from the binding, cloned or copied if possible. If the value is equal and copyOnEqual is false, then undefined is returned. this can be used to check if the value is changed\n   */\n  getValue(e, t, r = !0) {\n    const [i, o] = this.getBinding(e);\n    if (!i) return;\n    const s = i[o];\n    return t !== void 0 && s !== void 0 ? A(t, s) && !r ? void 0 : E(t, s) : M(s);\n  }\n  dispatchOnChangeSync(e, t, ...r) {\n    var s;\n    const o = [{\n      type: \"change\",\n      last: t.last ?? !0,\n      config: t.config ?? e,\n      configPath: [e, ...t.configPath || []],\n      target: e,\n      value: t.value,\n      lastValue: t.lastValue\n    }, ...r];\n    typeof e.onChange == \"function\" ? e.onChange(...o) : Array.isArray(e.onChange) ? e.onChange.flat().forEach(\n      (a) => typeof a == \"function\" && (a == null ? void 0 : a(...o))\n      // todo .call with config if not a bound function\n    ) : e.onChange && console.error(\"Invalid onChange type, must be a function or array of functions\", e.onChange), (s = e.parentOnChange) == null || s.call(e, ...o);\n  }\n  recordUndo(e) {\n    const t = this._renderer.undoManager;\n    V(t, e, g.setValue, this.undoEditingWaitTime);\n  }\n  /**\n   * Performs an action with undo/redo support.\n   * @param action - a function that returns - 1. an undo function, 2. an object with undo and redo functions (and optional action)\n   * @param targ - the target object to call the action on\n   * @param args - the arguments to pass to the action function\n   * @param config - ui config\n   * @param onUndoRedo - optional callback function to be called on undo/redo of the command. Not called on first action execution, only on undo/redo.\n   */\n  async performAction(e, t, r, i, o) {\n    var p, m, l;\n    const s = () => e === void 0 ? t(...r) : t.call(e, ...r);\n    let a = await s();\n    const u = typeof a == \"function\" ? a : (p = a == null ? void 0 : a.undo) == null ? void 0 : p.bind(a), d = typeof a != \"function\" ? (m = a == null ? void 0 : a.action) == null ? void 0 : m.bind(a) : null, y = typeof a == \"function\" ? s : ((l = a == null ? void 0 : a.redo) == null ? void 0 : l.bind(a)) ?? d;\n    typeof d == \"function\" && (a = await d()), typeof u == \"function\" && this.recordUndo({\n      type: \"UiConfigMethods_action\",\n      uid: i,\n      target: e,\n      undo: u,\n      redo: y,\n      args: r,\n      onUndoRedo: o\n    });\n  }\n  /**\n   *\n   * @param config\n   * @param value\n   * @param props - only the prop `last` need to be set, rest are optional. `lastValue` can be set if known (but it should be exactly equal to the value in the binding and not cloned).\n   * @param forceOnChange\n   * @param trackUndo\n   */\n  async setValue(e, t, r, i, o = !0) {\n    return this.runAtEvent(e, () => {\n      const s = this.getBinding(e), a = this._renderer.undoManager, u = w(a, s, t, r, e, g.setValue, o, this.undoEditingWaitTime, !1, void 0);\n      return !u.undoable && !i ? !1 : (this.dispatchOnChangeSync(e, { ...r, ...u }), !0);\n    });\n  }\n  /**\n   *\n   * @param config\n   * @param props - only last needs to be set, rest are optional. `lastValue` can be set if known (but it should be exactly equal to the value in the binding and not cloned). `config`, `configPath` are for parentOnChange, no need to set that.\n   */\n  async dispatchOnChange(e, t) {\n    return this.runAtEvent(e, () => {\n      this.dispatchOnChangeSync(e, t);\n    });\n  }\n  getLabel(e) {\n    var t;\n    return (f(e.label, e) ?? ((t = this.getBinding(e)) == null ? void 0 : t[1])) + \"\";\n  }\n  getChildren(e) {\n    return (f(e.children, e) ?? []).map((t) => f(t)).flat(2).filter((t) => t);\n  }\n  async clickButton(e, t) {\n    return this.runAtEvent(e, async () => {\n      const r = this.getBinding(e, !1), i = r[0], o = r[1], s = f(e.sendArgs, e) === !1 ? [] : (t == null ? void 0 : t.args) ?? [], a = [];\n      if (i) {\n        const u = i[o] ?? i.value;\n        typeof u == \"function\" ? a.push([u, i]) : u && console.warn(\"Invalid action type for button\", u);\n      }\n      typeof e.onClick == \"function\" && a.push([e.onClick, e]);\n      for (const [u, d] of a)\n        await this.performAction(d, u, s, e);\n      await this.dispatchOnChange(e, {});\n    });\n  }\n  async runAtEvent(e, t) {\n    const r = f(e.dispatchMode, e) ?? \"postFrame\";\n    return r === \"immediate\" ? t() : new Promise((i) => {\n      const o = async () => {\n        this._renderer.removeEventListener(r, o), i(await t());\n      };\n      this._renderer.addEventListener(r, o);\n    });\n  }\n  initUiConfig(e) {\n    e && (e.type || (console.warn(\"No type for config\", e), e.type = \"input\"), e.uuid || (e.uuid = R()), e.property === void 0 && (e.binding ? e.property = e.binding : e.value === void 0 ? (e.getValue || e.setValue) && (Object.defineProperty(e, \"value\", {\n      get: () => e.getValue && e.getValue(),\n      set: (t) => e.setValue && e.setValue(t)\n    }), e.property = [e, \"value\"]) : (e.getValue || e.setValue) && console.warn(\"getValue/setValue is ignored since value is provided\", e), e.property));\n  }\n  getBounds(e, t = !1) {\n    const r = f(e.bounds), i = ((r == null ? void 0 : r.length) ?? 0) >= 2 ? r[1] : t ? 1 / 0 : 1, o = ((r == null ? void 0 : r.length) ?? 0) >= 1 ? r[0] : t ? -1 / 0 : 0, s = f(e.stepSize) || (t ? 0.01 : Math.pow(10, Math.floor(Math.log10((i - o) / 100))));\n    return { min: o, max: i, step: s };\n  }\n}\nclass L extends O {\n  constructor(e = !0, t, r) {\n    super(), this._rafId = null, this.raf = () => {\n      this._autoFrameEvents && (this.dispatchEvent({ type: \"preFrame\" }), this.dispatchEvent({ type: \"preRender\" }), this.dispatchEvent({ type: \"postRender\" }), this.dispatchEvent({ type: \"postFrame\" }), this._rafId = requestAnimationFrame(this.raf));\n    }, this._refreshQueue = {\n      // [config, delay, uuid]\n      preRender: [],\n      postRender: [],\n      preFrame: [],\n      postFrame: []\n    }, this._lastModeTime = {\n      preRender: 0,\n      postRender: 0,\n      preFrame: 0,\n      postFrame: 0\n    }, this.methods = t || new k(this), this.undoManager = r === !1 ? void 0 : r || new F({ bindHotKeys: !0, limit: 1e3, debug: P(\"debugUndo\") !== null }), this._autoFrameEvents = e, e && (this.addEventListener(\"preFrame\", () => this.refreshQueue(\"preFrame\")), this.addEventListener(\"postFrame\", () => this.refreshQueue(\"postFrame\")), this.addEventListener(\"preRender\", () => this.refreshQueue(\"preRender\")), this.addEventListener(\"postRender\", () => this.refreshQueue(\"postRender\")));\n  }\n  get undoManager() {\n    return this._undoManager;\n  }\n  set undoManager(e) {\n    this._undoManager = e, this._undoManager && Object.assign(this._undoManager.presets, this.methods.undoPresets);\n  }\n  // call from render or onMount\n  start() {\n    this._rafId === null && (this._rafId = requestAnimationFrame(this.raf));\n  }\n  // call from unmount or onDispose etc\n  stop() {\n    this._rafId !== null && (cancelAnimationFrame(this._rafId), this._rafId = null);\n  }\n  refreshQueue(e) {\n    const t = this._refreshQueue[e], r = [], i = x(), o = i - this._lastModeTime[e];\n    t.forEach((s) => {\n      s[1] > 1e-3 ? (s[1] -= o, r.push(s)) : this._refreshUiConfigObject(s[0]);\n    }), this._refreshQueue[e] = r, this._lastModeTime[e] = i;\n  }\n  _addToRefreshQueue(e, t, r) {\n    const i = t.uuid, o = this._refreshQueue[e], s = o.find((a) => a[2] === i);\n    s ? s[1] = Math.max(s[1], r) : o.push([t, r, i]), this._refreshQueue[e] = o;\n  }\n  /**\n   * Disposes the UI associated with a config, doesn't makes change to the object or its parent.\n   * @param config\n   * @param performDispose\n   */\n  disposeUiConfig(e, t = !0) {\n    var r, i;\n    e && (e.uiRef && (t && ((i = (r = e.uiRef).dispose) == null || i.call(r)), e.uiRef = void 0), e.uiRefType = void 0, e.uiRefresh = void 0);\n  }\n  addToRefreshQueue(e, t, r, i) {\n    const o = r ? this._flattenUiConfig(t) : [t];\n    for (const s of o)\n      e === \"immediate\" ? I(i).then(() => this._refreshUiConfigObject(s)) : this._addToRefreshQueue(e, s, i);\n  }\n  _flattenUiConfig(e, t) {\n    var r;\n    return t = t ?? [], !e || !e.uiRef || (t.push(e), typeof e.children == \"function\") || (r = e.children) == null || r.forEach((i) => {\n      typeof i != \"function\" && i && (Array.isArray(i) ? i.forEach((o) => t = this._flattenUiConfig(o, t)) : t = this._flattenUiConfig(i, t));\n    }), t;\n  }\n}\nclass Z extends L {\n  constructor(e = document.body, t = !0, r, i) {\n    super(t, r, i), this.config = {\n      type: \"panel\",\n      label: \"Configuration\",\n      children: []\n    }, this._uiContainer = this._createUiContainer(), e.appendChild(this._uiContainer), this.start();\n  }\n  unmount() {\n    this.disposeUiConfig(this.config), this._uiContainer.remove(), this.stop();\n  }\n  // appendUiConfig(uiConfig: UiObjectConfig): void {\n  //     if (!uiConfig) return\n  //     this._renderUiConfig(uiConfig)\n  // }\n  appendChild(e, t) {\n    e && (Object.assign(e, t), this.config.children.push(e), this.refreshRoot());\n  }\n  removeChild(e) {\n    const t = this.config.children.indexOf(e);\n    t !== -1 && (this.config.children.splice(t, 1), this.disposeUiConfig(e), this.refreshRoot());\n  }\n  refreshRoot(e = !0, t = \"postFrame\", r = 0) {\n    var i, o;\n    (o = (i = this.config).uiRefresh) == null || o.call(i, e, t, r);\n  }\n  _createUiContainer() {\n    return Q({ id: \"uiConfigContainer\", addToBody: !1 });\n  }\n}\nexport {\n  k as UiConfigMethods,\n  Z as UiConfigRenderer,\n  L as UiConfigRendererBase,\n  c as UiConfigTypeMap,\n  re as clonePrimitive,\n  ne as copyPrimitive,\n  Y as createValueUiConfig,\n  ie as equalsPrimitive,\n  _ as generateUiConfig,\n  U as generateUiFolder,\n  v as generateValueConfig,\n  W as uiButton,\n  J as uiColor,\n  h as uiConfig,\n  b as uiContainer,\n  N as uiDropdown,\n  X as uiFolderContainer,\n  $ as uiImage,\n  z as uiInput,\n  j as uiMonitor,\n  H as uiNumber,\n  K as uiPanelContainer,\n  q as uiSlider,\n  G as uiToggle,\n  D as uiVector,\n  g as undoCommandTypes\n};\n//# sourceMappingURL=index.mjs.map\n","import {Clock, EventDispatcher} from 'three'\nimport {ThreeViewer} from '../viewer'\nimport {ProgressivePlugin} from '../plugins'\nimport {uiButton, uiFolderContainer, uiInput, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {onChangeDispatchEvent, serializable, serialize} from 'ts-browser-helpers'\nimport {OnChangeDispatchEventType} from './browser-helpers'\n\nexport interface ViewerTimelineEventMap{\n    start: object,\n    stop: object,\n    reset: object,\n    update: object,\n    resetOnEndChanged: OnChangeDispatchEventType<boolean>,\n    stopOnEndChanged: OnChangeDispatchEventType<boolean>,\n    endTimeChanged: OnChangeDispatchEventType<number>\n}\n\n@serializable('ViewerTimeline')\n@uiFolderContainer('Timeline')\nexport class ViewerTimeline extends EventDispatcher<ViewerTimelineEventMap> {\n    declare uiConfig: UiObjectConfig\n    protected _time = 0\n\n    /**\n     * Current time in secs\n     */\n    @uiInput('Time', {readOnly: true})\n    get time() {\n        return this._time\n    }\n\n    /**\n     * Set the current time and step a frame\n     * @param value\n     */\n    set time(value: number) {\n        if (this._time === value) return\n        this.setTime(value, true)\n    }\n\n    /**\n     * in secs\n     */\n    @uiInput('Delta', {readOnly: true})\n        delta = 0\n\n    /**\n     * Maximum time in secs.\n     * This is used to limit the time in the timeline.\n     * Set to 0 to disable the limit.\n     */\n    @uiInput('Max Time')\n    @serialize()\n    @onChangeDispatchEvent('endTimeChanged')\n        endTime = 2\n\n    /**\n     * Reset the timeline time to 0 when the timeline ends.\n     * It is applicable only when the timeline is running and `endTime` is set to a value greater than 0.\n     * This can be used to loop the timeline.\n     * @default true\n     */\n    @uiToggle('Reset on End')\n    @serialize()\n    @onChangeDispatchEvent('resetOnEndChanged')\n        resetOnEnd = true\n\n    /**\n     * Stop the timeline when it reaches the end.\n     * This is applicable only when the timeline is running and `endTime` is set to a value greater than 0.\n     * This can be used to stop the timeline when it reaches the end.\n     * It is separate from `resetOnEnd`, the timeline is stopped and then reset when both are true.\n     * @default false\n     */\n    @uiToggle('Stop on End')\n    @serialize()\n    @onChangeDispatchEvent('stopOnEndChanged')\n        stopOnEnd = false\n\n    /**\n     * Running state.\n     */\n    @uiInput('Running', {readOnly: true})\n        running = false\n\n    /**\n     * Returns true if the timeline is running or if it is set to step this/next frame.\n     */\n    shouldRun() {\n        return this.running || this._step\n    }\n\n    protected _clock = new Clock(false)\n\n    private _start = false\n    private _stop = false\n    private _reset = false\n\n    // this is seek, not step actually\n    private _step = false\n\n    @uiButton('Start')\n    start() {\n        this._start = true // start next frame\n        if (this._stop) this._stop = false\n        if (this._step) this._step = false\n    }\n\n    @uiButton('Stop')\n    stop() {\n        this._stop = true // stop next frame\n        if (this._start) this._start = false\n        if (this._step) this._step = false\n    }\n\n    // @uiButton('Step')\n    // step() {\n    //     if ((this.running || this._start) && !this._stop) return\n    //     this._step = true // stop next frame\n    // }\n\n    @uiButton('Reset')\n    reset() {\n        this._reset = true // reset next frame\n        if (this._step) this._step = false // dont step if called before reset\n        // if (this._start) this._start = false\n        // if (this._stop) this._stop = false\n    }\n\n    update(viewer: ThreeViewer) {\n        this._refreshParams()\n        if (!this.running) {\n            this.delta = this._clock.getDelta() // this will return 0 always\n            this._time = this._clock.elapsedTime\n            return\n        }\n        const d = viewer.getPlugin<ProgressivePlugin>('ProgressivePlugin')?.postFrameConvergedRecordingDelta()\n        if (d && d > 0) {\n            // recorded frame\n            this.delta = d / 1000\n            this._clock.oldTime += d\n            this._clock.elapsedTime += this.delta\n            this._time = this._clock.elapsedTime\n            // viewer.setDirty(this) // for next frame\n            this.dispatchEvent({type: 'update'})\n        } else if (d !== undefined && d === 0) {\n            // recording, not converged yet.\n            this.delta = 0\n            this._time = this._clock.elapsedTime\n        } else if (d === undefined || d < 0) {\n            // not recording\n            this.delta = this._clock.getDelta() // this updates oldTime and elapsedTime\n            this._time = this._clock.elapsedTime\n            // viewer.setDirty(this) // for next frame\n            this.dispatchEvent({type: 'update'})\n        }\n        this._refreshParams()\n    }\n\n    private _refreshParams() {\n        const isEnd = this.endTime > 0 && this.time >= this.endTime && this.running\n        const isReset = this.resetOnEnd && isEnd\n        const isStop = this.stopOnEnd && isEnd\n        if (this._stop || isStop) {\n            this._clock.stop()\n            this._start = false\n            this._stop = false\n            this.running = this._clock.running\n            this.dispatchEvent({type: 'stop'})\n        }\n        if (this._start) {\n            this._clock.start()\n            this._clock.elapsedTime = this.time\n            this._start = false\n            this.running = this._clock.running\n            this.dispatchEvent({type: 'start'})\n        }\n        if (this._reset || isReset) {\n            this._clock.elapsedTime = 0\n            this.time = 0\n            this.delta = 0\n            this._reset = false\n            this.dispatchEvent({type: 'reset'})\n        }\n        this.running = this._clock.running\n    }\n\n    // todo better name\n    update2(_viewer: ThreeViewer) {\n        this._step = false\n    }\n\n    setTime(t: number, stepFrame = true) {\n        if (t < 0) t = 0\n        this._clock.elapsedTime = t\n        this._time = t\n        this.delta = 0 // reset delta\n        // this._start = false\n        // this._stop = false\n        this._reset = false\n        if (!this._start) this._step = stepFrame\n        this.dispatchEvent({type: 'update'})\n    }\n}\n","// stats.js - http://github.com/mrdoob/stats.js\n(function(f,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?\"block\":\"none\";l=a}var l=0,c=document.createElement(\"div\");c.style.cssText=\"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";c.addEventListener(\"click\",function(a){a.preventDefault();\nu(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel(\"FPS\",\"#0ff\",\"#002\")),h=e(new f.Panel(\"MS\",\"#0f0\",\"#020\"));if(self.performance&&self.performance.memory)var t=e(new f.Panel(\"MB\",\"#f08\",\"#201\"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/\n1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement(\"canvas\");q.width=r;q.height=h;q.style.cssText=\"width:80px;height:48px\";var b=q.getContext(\"2d\");b.font=\"bold \"+9*a+\"px Helvetica,Arial,sans-serif\";b.textBaseline=\"top\";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);\nb.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+\" \"+e+\" (\"+g(c)+\"-\"+g(k)+\")\",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});\n","import Stats from 'stats.js'\n\nexport class GLStatsJS {\n    protected _stats: any = new Stats()\n    protected _container: HTMLElement\n\n    constructor(container: HTMLElement) {\n        this._container = container\n        this._stats.dom.id = 'stats-js'\n        this._stats.dom.style.position = 'absolute'\n        this._stats.dom.style.left = 'unset'\n        this._stats.dom.style.right = '0'\n\n    }\n\n    show() {\n        this._container.appendChild(this._stats.dom)\n        this._stats.showPanel(0)\n    }\n\n    hide() {\n        this._container.removeChild(this._stats.dom)\n    }\n\n    begin() {\n        this._stats.begin()\n    }\n\n    end() {\n        this._stats.end()\n    }\n}\n","import styles from './CustomContextMenu.css?inline'\n\n/**\n * Represents a custom context menu that can be created and managed dynamically.\n */\nexport class CustomContextMenu {\n    /**\n     * The HTML element representing the context menu.\n     */\n    public static Element: HTMLDivElement | undefined = undefined\n\n    /**\n     * Indicates whether the context menu has been initialized.\n     */\n    private static _inited = false\n\n    /**\n     * Initializes the context menu by adding event listeners.\n     * This method should be called before creating a context menu.\n     */\n    private static _initialize(): void {\n        this._inited = true\n        document.addEventListener('pointerdown', (e) => {\n            if (this.Element && !this.Element.contains(e.target as any) && e.button === 0) {\n                this.Remove()\n            }\n        })\n    }\n\n    /**\n     * Creates a custom context menu with specified items and options.\n     *\n     * @param items - An object containing menu item labels and corresponding callback functions.\n     * @param x - The horizontal position of the context menu.\n     * @param y - The vertical position of the context menu.\n     * @param show - Indicates whether the context menu should be displayed immediately.\n     * @param removeOnSelect - Indicates whether the context menu should be removed after an item is selected.\n     * @returns The HTML element representing the created context menu.\n     */\n    public static Create(\n        items: Record<string, () => void>,\n        x: number,\n        y: number,\n        show = true,\n        removeOnSelect = true\n    ): HTMLDivElement {\n        if (!this._inited) this._initialize()\n\n        if (this.Element) this.Remove()\n\n        const container = document.createElement('div')\n        container.id = 'customContextMenu'\n        container.style.top = y + 'px'\n        container.style.left = x + 'px'\n        container.innerHTML = '<style>' + styles + '</style>'\n\n        for (const [key, func] of Object.entries(items)) {\n            const d = document.createElement('div')\n            d.classList.add('customContextMenuItems')\n            d.textContent = key\n            container.appendChild(d)\n            d.onclick = async() => {\n                await func()\n                if (removeOnSelect) this.Remove()\n            }\n        }\n\n        this.Element = container\n        if (show) document.body.appendChild(container)\n        return container\n    }\n\n    /**\n     * Removes the context menu from the DOM.\n     */\n    public static Remove(): void {\n        this.Element?.remove()\n        this.Element = undefined\n    }\n}\n","/**\n * Fork of: https://github.com/donmccurdy/simple-dropzone updated: Mar 2021\n * The MIT License (MIT)\n * Copyright (c) 2018 Don McCurdy\n *\n * Changes:\n *      Convert to typescript.\n *      webkitRelativePath for file input select.\n *      Removed unzip and dependency(done in importer).\n *\n * Watches an element for file drops, parses to create a filemap hierarchy,\n * and emits the result.\n */\nexport class Dropzone {\n    get inputEl(): HTMLInputElement|undefined {\n        return this._inputEl\n    }\n    get el(): HTMLElement|undefined {\n        return this._el\n    }\n    private _el?: HTMLElement\n    private _inputEl?: HTMLInputElement\n    private _listeners: Record<DropEventType, ListenerCallback[]>\n\n    constructor(el?: HTMLElement, inputEl?: HTMLInputElement, listeners?: Partial<Record<DropEventType, ListenerCallback>>) {\n        this._el = el\n        this._inputEl = inputEl\n\n        this._listeners = {\n            drop: [],\n            dropstart: [],\n            droperror: [],\n        }\n\n        this._onDragover = this._onDragover.bind(this)\n        this._onDrop = this._onDrop.bind(this)\n        this._onSelect = this._onSelect.bind(this)\n\n        el?.addEventListener('dragover', this._onDragover, false)\n        el?.addEventListener('drop', this._onDrop, false)\n        inputEl?.addEventListener('change', this._onSelect)\n\n        listeners && Object.entries(listeners).forEach(([e, c])=> c && this.on(e as DropEventType, c))\n    }\n\n    on(type: DropEventType, callback: ListenerCallback): Dropzone {\n        this._listeners[type].push(callback)\n        return this\n    }\n\n    private _emit(type: DropEventType, data?: {[id:string]: any}) {\n        this._listeners[type]\n            .forEach((callback) => callback(data))\n        return this\n    }\n\n    /**\n     * Destroys the instance.\n     */\n    destroy(): void {\n        const el = this._el\n        const inputEl = this._inputEl\n\n        el?.removeEventListener('dragover', this._onDragover)\n        el?.removeEventListener('drop', this._onDrop)\n        inputEl?.removeEventListener('change', this._onSelect)\n\n    }\n\n    /**\n     * Use dataTransfer.items when available instead of dataTransfer.files (when files are dropped)\n     *\n     * Set to false to use dataTransfer.files only.\n     * This is useful for environments where files cannot be read from FileSystemEntry like in figma plugins/widgets.\n     */\n    static USE_DATA_TRANSFER_ITEMS = true\n\n    /**\n     * References (and horror):\n     * - https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items\n     * - https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/files\n     * - https://code.flickr.net/2012/12/10/drag-n-drop/\n     * - https://stackoverflow.com/q/44842247/1314762\n     *\n     */\n    private _onDrop(e: DragEvent) {\n        e.stopPropagation()\n        e.preventDefault()\n\n        this._emit('dropstart')\n\n        const files = Array.from(e.dataTransfer?.files || []) as DropFile[]\n        const items = Array.from(e.dataTransfer?.items || [])\n\n        if (files.length === 0 && items.length === 0) {\n            this._fail('Required drag-and-drop APIs are not supported in this browser.')\n            return\n        }\n\n        // Prefer .items, which allow folder traversal if necessary.\n        if (Dropzone.USE_DATA_TRANSFER_ITEMS && items.length > 0) {\n            const entries = items.map((item) => item.webkitGetAsEntry())\n\n            // if (entries[0].name.match(/\\.zip$/)) {\n            //     this._loadZip(items[0].getAsFile())\n            // } else {\n            this._loadNextEntry(new Map(), entries, e)\n            // }\n\n            return\n        }\n\n        // Fall back to .files, since folders can't be traversed.\n        // if (files.length === 1 && files[0].name.match(/\\.zip$/)) {\n        //     this._loadZip(files[0])\n        // }\n        this._emit('drop', {\n            nativeEvent: e,\n            files: new Map(files.map((file) => {\n                file.filePath = file.name\n                return [file.filePath, file]\n            })),\n        })\n    }\n\n    /**\n     * @param  {Event} e\n     */\n    private _onDragover(e: DragEvent) {\n        e.stopPropagation()\n        e.preventDefault()\n        e.dataTransfer && (e.dataTransfer.dropEffect = 'copy') // Explicitly show this is a copy.\n    }\n\n    private _onSelect(e: Event) {\n        if (!this._inputEl) {\n            console.warn('Invalid Dropzone event ', e)\n            return\n        }\n        this._emit('dropstart')\n\n        // HTML file inputs do not seem to support folders, so assume this is a flat file list.\n        const files: DropFile[] = [].slice.call(this._inputEl.files ?? new FileList())\n\n        // Automatically decompress a zip archive if it is the only file given.\n        // if (files.length === 1 && this._isZip(files[0])) {\n        //     this._loadZip(files[0])\n        //     return\n        // }\n\n        const fileMap = new Map()\n        files.forEach((file) => {\n            file.filePath = (file as any).webkitRelativePath || file.name\n            fileMap.set(file.filePath, file)\n        })\n        this._emit('drop', {files: fileMap, nativeEvent: e})\n    }\n\n    /**\n     * Iterates through a list of FileSystemEntry objects, creates the fileMap\n     * tree, and emits the result.\n     * @param fileMap\n     * @param  {Array<FileSystemEntry>} entries\n     * @param e\n     */\n    private _loadNextEntry(fileMap: Map<string, DropFile>, entries: (FileSystemEntry|null)[], e: DragEvent) {\n        const entry = entries.pop()\n\n        if (!entry) {\n            this._emit('drop', {files: fileMap, nativeEvent: e})\n            return\n        }\n\n        if (entry.isFile) {\n            (entry as FileSystemFileEntry).file((file: DropFile) => {\n                file.filePath = entry.fullPath\n                fileMap.set(entry.fullPath, file)\n                this._loadNextEntry(fileMap, entries, e)\n            }, (err) => console.error('Could not load file: %s', entry.fullPath, err, 'Try setting Dropzone.USE_DATA_TRANSFER_ITEMS to false.'))\n        } else if (entry.isDirectory) {\n            // readEntries() must be called repeatedly until it stops returning results.\n            // https://www.w3.org/TR/2012/WD-file-system-api-20120417/#the-directoryreader-interface\n            // https://bugs.chromium.org/p/chromium/issues/detail?id=378883\n            const reader = (entry as FileSystemDirectoryEntry).createReader()\n            const readerCallback = (newEntries: any[]) => {\n                if (newEntries.length) {\n                    entries = entries.concat(newEntries)\n                    // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n                    reader.readEntries(readerCallback)\n                } else {\n                    this._loadNextEntry(fileMap, entries, e)\n                }\n            }\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n            reader.readEntries(readerCallback)\n        } else {\n            console.warn('Unknown asset type: ' + entry.fullPath)\n            this._loadNextEntry(fileMap, entries, e)\n        }\n    }\n\n    // /**\n    //  * Inflates a File in .ZIP format, creates the fileMap tree, and emits the\n    //  * result.\n    //  * @param  {File} file\n    //  */\n    // _loadZip(file) {\n    //     const pending = []\n    //     const fileMap = new Map()\n    //     const archive = new fs.FS()\n    //\n    //     const traverse = (node) => {\n    //         if (node.directory) {\n    //             node.children.forEach(traverse)\n    //         } else if (node.name[0] !== '.') {\n    //             pending.push(new Promise((resolve) => {\n    //                 node.getData(new zip.BlobWriter(), (blob) => {\n    //                     blob.name = node.name\n    //                     fileMap.set(node.getFullname(), blob)\n    //                     resolve()\n    //                 })\n    //             }))\n    //         }\n    //     }\n    //\n    //     archive.importBlob(file, () => {\n    //         traverse(archive.root)\n    //         Promise.all(pending).then(() => {\n    //             this._emit('drop', {files: fileMap, archive: file})\n    //         })\n    //     })\n    // }\n\n    // /**\n    //  * @param  {File} file\n    //  * @return {Boolean}\n    //  */\n    // _isZip(file) {\n    //     return file.type === 'application/zip' || file.name.match(/\\.zip$/)\n    // }\n\n    /**\n     * @throws\n     */\n    private _fail(message: string) {\n        this._emit('droperror', {message: message})\n    }\n}\n\nexport type DropEventType = 'drop'|'dropstart'|'droperror'\nexport type ListenerCallback = ((data?:{files?:Map<string, DropFile>, message?:string})=>void)\nexport interface DropFile extends File{\n    filePath: string\n}\n","import {\n\tEventDispatcher,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3,\n\tPlane,\n\tRay,\n\tMathUtils\n} from 'three';\n\n// OrbitControls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n//    Orbit - left mouse / touch: one-finger move\n//    Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n//    Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst TILT_LIMIT = Math.cos( 70 * MathUtils.DEG2RAD );\n\nclass OrbitControls extends EventDispatcher {\n\n\tconstructor( object, domElement ) {\n\n\t\tsuper();\n\n\t\tthis.object = object;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new Vector3();\n\n\t\t// Sets the 3D cursor (similar to Blender), from which the maxTargetRadius takes effect\n\t\tthis.cursor = new Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0.00001;\n\t\tthis.maxDistance = Infinity;\n\n\t\tthis.autoPushTarget = true; // push target when zoomed even after minDistance\n\t\tthis.autoPullTarget = true; // push target when zoomed even after minDistance\n\n\t\tthis.clampMax = new Vector3( Infinity, Infinity, Infinity ); // clamp position and target\n\t\tthis.clampMin = new Vector3( - Infinity, - Infinity, - Infinity ); // clamp position and target\n\t\t// this.clampBounds = new Box3( new Vector3( - 0.3, - 0.2, - 0.8 ), new Vector3( 1.25, 0.3, 0.2 ) ); // Box3 or null\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// Limit camera target within a spherical area around the cursor\n\t\tthis.minTargetRadius = 0;\n\t\tthis.maxTargetRadius = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.05;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\t\tthis.maxZoomSpeed = 1.0; // only used while damping\n\t\tthis.maxZoomSpeed = 1.0; // only used while damping\n\t\tthis.dollyZoom = false; // only for PerspectiveCamera, control zoom with wheel.\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.panSpeed = 1.0;\n\t\tthis.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\t\tthis.zoomToCursor = false;\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n\t\tthis.throttleUpdate = 0; // limit to n updates per second, set to 0 to disable throttling\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t// Touch fingers\n\t\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.getDistance = function () {\n\n\t\t\treturn this.object.position.distanceTo( this.target );\n\n\t\t};\n\n\t\tthis.listenToKeyEvents = function ( domElement ) {\n\n\t\t\tdomElement.addEventListener( 'keydown', onKeyDown );\n\t\t\tthis._domElementKeyEvents = domElement;\n\n\t\t};\n\n\t\tthis.stopListenToKeyEvents = function () {\n\n\t\t\tthis._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\t\t\tthis._domElementKeyEvents = null;\n\n\t\t};\n\n\t\tthis.saveState = function () {\n\n\t\t\tscope.target0.copy( scope.target );\n\t\t\tscope.position0.copy( scope.object.position );\n\t\t\tscope.zoom0 = scope.object.zoom;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function () {\n\n\t\t\tconst offset = new Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tconst quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\t\tconst quatInverse = quat.clone().invert();\n\n\t\t\tconst lastPosition = new Vector3();\n\t\t\tconst lastQuaternion = new Quaternion();\n\t\t\tconst lastTargetPosition = new Vector3();\n\n\t\t\tconst twoPI = 2 * Math.PI;\n\n\t\t\tconst lastUpdateTime = 0;\n\n\t\t\treturn function update( deltaTime = null ) {\n\n\t\t\t\tif ( this.throttleUpdate && this.throttleUpdate >= 1 ) {\n\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tconst dt = now - lastUpdateTime;\n\t\t\t\t\tif ( dt < 1000 / this.throttleUpdate ) return;\n\n\t\t\t\t}\n\n\t\t\t\tconst position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle( deltaTime ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scope.enableDamping ) {\n\n\t\t\t\t\tspherical.theta += sphericalDelta.theta * scope.dampingFactor;\n\t\t\t\t\tspherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t}\n\n\t\t\t\t// restrict theta to be between desired limits\n\n\t\t\t\tlet min = scope.minAzimuthAngle;\n\t\t\t\tlet max = scope.maxAzimuthAngle;\n\n\t\t\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\t\t\tif ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\n\n\t\t\t\t\tif ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\n\n\t\t\t\t\tif ( min <= max ) {\n\n\t\t\t\t\t\tspherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tspherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\t\t\tMath.max( min, spherical.theta ) :\n\t\t\t\t\t\t\tMath.min( max, spherical.theta );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\t// move target to panned location\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tscope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\t}\n\n\t\t\t\t// Limit the target distance from the cursor to create a sphere around the center of interest\n\t\t\t\tscope.target.sub( scope.cursor );\n\t\t\t\tscope.target.clampLength( scope.minTargetRadius, scope.maxTargetRadius );\n\t\t\t\tscope.target.add( scope.cursor );\n\n\t\t\t\tlet pushDelta = 0;\n\n\t\t\t\tlet zoomChanged = false;\n\t\t\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t\t\t// we adjust zoom later in these cases\n\t\t\t\tif ( scope.zoomToCursor && performCursorZoom || scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\tspherical.radius = clampDistance( spherical.radius );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst prevRadius = spherical.radius;\n\t\t\t\t\t// spherical.radius = clampDistance( spherical.radius * scale );\n\t\t\t\t\tif ( Math.abs( sphericalDelta.radius ) > 0 ) {\n\n\t\t\t\t\t\tif ( scope.dollyZoom ) {\n\n\t\t\t\t\t\t\tscope.object.zoom = Math.max( Math.max( scope.minZoom, 0.1 ), Math.min( Math.min( scope.maxZoom, 20 ), scope.object.zoom * ( 1 + sphericalDelta.radius * ( scope.enableDamping ? scope.dampingFactor : 1 ) ) ) );\n\t\t\t\t\t\t\tscope.object.updateProjectionMatrix();\n\n\t\t\t\t\t\t\tif ( scope.object.zoom >= Math.min( scope.maxZoom, 20 ) || scope.object.zoom <= Math.max( scope.minZoom, 0.1 ) )\n\t\t\t\t\t\t\t\tsphericalDelta.radius = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// spherical.radius += spherical.radius * sphericalDelta.radius * scope.dampingFactor;\n\t\t\t\t\t\tspherical.radius *= 1 + sphericalDelta.radius * ( scope.enableDamping ? scope.dampingFactor : 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( Math.abs( scale - 1 ) > 0.00001 ) { // this will be used when using touch, otherwise it will be 1.\n\n\t\t\t\t\t\tif ( scope.dollyZoom ) {\n\n\t\t\t\t\t\t\tscope.object.zoom = Math.max( Math.max( scope.minZoom, 0.1 ), Math.min( Math.min( scope.maxZoom, 20 ), scope.object.zoom * scale ) );\n\t\t\t\t\t\t\tscope.object.updateProjectionMatrix();\n\n\t\t\t\t\t\t\tif ( scope.object.zoom >= Math.min( scope.maxZoom, 20 ) || scope.object.zoom <= Math.max( scope.minZoom, 0.1 ) )\n\t\t\t\t\t\t\t\tscale = 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// push target\n\t\t\t\t\tif ( scope.autoPushTarget && spherical.radius < scope.minDistance )\n\t\t\t\t\t\tpushDelta = scope.minDistance - spherical.radius;\n\t\t\t\t\t// pull target\n\t\t\t\t\tif ( scope.autoPullTarget && spherical.radius > scope.maxDistance )\n\t\t\t\t\t\tpushDelta = scope.maxDistance - spherical.radius;\n\n\t\t\t\t\tspherical.radius = clampDistance( spherical.radius );\n\n\t\t\t\t\tzoomChanged = prevRadius != spherical.radius;\n\n\t\t\t\t}\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\t\t\t\t// transform(offset, spherical); // todo https://math.stackexchange.com/questions/69099/equation-of-a-rectangle\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.target.add( offset.normalize().multiplyScalar( - pushDelta ) );\n\n\t\t\t\t// restrict position and target in clamp bounds\n\t\t\t\tposition.clamp( scope.clampMin, scope.clampMax );\n\t\t\t\tscope.target.clamp( scope.clampMin, scope.clampMax );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tlet isDamping = false;\n\n\t\t\t\tif ( scope.enableDamping === true && (\n\t\t\t\t\tMath.abs( sphericalDelta.theta ) +\n\t\t\t\t\tMath.abs( sphericalDelta.phi ) +\n\t\t\t\t\tMath.abs( sphericalDelta.radius ) +\n\t\t\t\t\tpanOffset.length()\n\t\t\t\t) > 0.001 ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.radius *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t\tpanOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n\t\t\t\t\tisDamping = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\t// todo this should be moved above previous `if`\n\t\t\t\t// adjust camera position\n\t\t\t\tif ( scope.zoomToCursor && performCursorZoom ) {\n\n\t\t\t\t\tlet newRadius = null;\n\t\t\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t\t\t// this method avoids floating point error\n\t\t\t\t\t\tconst prevRadius = spherical.radius;\n\t\t\t\t\t\tnewRadius = spherical.radius * scale;\n\t\t\t\t\t\t// newRadius = spherical.radius * ( 1 + sphericalDelta.radius * ( scope.enableDamping ? scope.dampingFactor : 1 ) );\n\t\t\t\t\t\tnewRadius = clampDistance( newRadius );\n\n\t\t\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\t\t\tscope.object.position.addScaledVector( dollyDirection, radiusDelta );\n\t\t\t\t\t\tscope.object.updateMatrixWorld();\n\n\t\t\t\t\t\tzoomChanged = !! radiusDelta;\n\n\t\t\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\t\t\tconst mouseBefore = new Vector3( mouse.x, mouse.y, 0 );\n\t\t\t\t\t\tmouseBefore.unproject( scope.object );\n\n\t\t\t\t\t\tconst prevZoom = scope.object.zoom;\n\t\t\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / scale ) );\n\t\t\t\t\t\tscope.object.updateProjectionMatrix();\n\n\t\t\t\t\t\tzoomChanged = prevZoom !== scope.object.zoom;\n\n\t\t\t\t\t\tconst mouseAfter = new Vector3( mouse.x, mouse.y, 0 );\n\t\t\t\t\t\tmouseAfter.unproject( scope.object );\n\n\t\t\t\t\t\tscope.object.position.sub( mouseAfter ).add( mouseBefore );\n\t\t\t\t\t\tscope.object.updateMatrixWorld();\n\n\t\t\t\t\t\tnewRadius = spherical.radius;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.' );\n\t\t\t\t\t\tscope.zoomToCursor = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle the placement of the target\n\t\t\t\t\tif ( newRadius !== null ) {\n\n\t\t\t\t\t\tif ( this.screenSpacePanning ) {\n\n\t\t\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\t\t\tscope.target.set( 0, 0, - 1 )\n\t\t\t\t\t\t\t\t.transformDirection( scope.object.matrix )\n\t\t\t\t\t\t\t\t.multiplyScalar( newRadius )\n\t\t\t\t\t\t\t\t.add( scope.object.position );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t\t\t_ray.origin.copy( scope.object.position );\n\t\t\t\t\t\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( scope.object.matrix );\n\n\t\t\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t\t\t// extremely large values\n\t\t\t\t\t\t\tif ( Math.abs( scope.object.up.dot( _ray.direction ) ) < TILT_LIMIT ) {\n\n\t\t\t\t\t\t\t\tobject.lookAt( scope.target );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint( scope.object.up, scope.target );\n\t\t\t\t\t\t\t\t_ray.intersectPlane( _plane, scope.target );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\tconst prevZoom = scope.object.zoom;\n\t\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / scale ) );\n\n\t\t\t\t\tif ( prevZoom !== scope.object.zoom ) {\n\n\t\t\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\t\t\tzoomChanged = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tperformCursorZoom = false;\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tisDamping ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ||\n\t\t\t\t\tlastTargetPosition.distanceToSquared( scope.target ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tlastTargetPosition.copy( scope.target );\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.stopDamping = function () {\n\n\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t};\n\n\t\tthis.dispose = function () {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu );\n\n\t\t\tscope.domElement.removeEventListener( 'pointerdown', onPointerDown );\n\t\t\tscope.domElement.removeEventListener( 'pointercancel', onPointerUp );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel );\n\n\t\t\tscope.domElement.removeEventListener( 'pointermove', onPointerMove );\n\t\t\tscope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\t\t\tconst document = scope.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\t\tdocument.removeEventListener( 'keydown', interceptControlDown, { capture: true } );\n\n\t\t\tif ( scope._domElementKeyEvents !== null ) {\n\n\t\t\t\tscope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\t\t\t\tscope._domElementKeyEvents = null;\n\n\t\t\t}\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tconst scope = this;\n\n\t\tconst STATE = {\n\t\t\tNONE: - 1,\n\t\t\tROTATE: 0,\n\t\t\tDOLLY: 1,\n\t\t\tPAN: 2,\n\t\t\tTOUCH_ROTATE: 3,\n\t\t\tTOUCH_PAN: 4,\n\t\t\tTOUCH_DOLLY_PAN: 5,\n\t\t\tTOUCH_DOLLY_ROTATE: 6\n\t\t};\n\n\t\tlet state = STATE.NONE;\n\n\t\tconst EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tconst spherical = new Spherical();\n\t\tconst sphericalDelta = new Spherical( 0, 0, 0 );\n\n\t\tlet scale = 1;\n\t\tconst panOffset = new Vector3();\n\n\t\tconst rotateStart = new Vector2();\n\t\tconst rotateEnd = new Vector2();\n\t\tconst rotateDelta = new Vector2();\n\n\t\tconst panStart = new Vector2();\n\t\tconst panEnd = new Vector2();\n\t\tconst panDelta = new Vector2();\n\n\t\tconst dollyStart = new Vector2();\n\t\tconst dollyEnd = new Vector2();\n\t\tconst dollyDelta = new Vector2();\n\n\t\tconst dollyDirection = new Vector3();\n\t\tconst mouse = new Vector2();\n\t\tlet performCursorZoom = false;\n\n\t\tconst pointers = [];\n\t\tconst pointerPositions = {};\n\n\t\tlet controlActive = false;\n\n\t\tfunction getAutoRotationAngle( deltaTime ) {\n\n\t\t\tif ( deltaTime !== null ) {\n\n\t\t\t\treturn ( 2 * Math.PI / 60 * scope.autoRotateSpeed ) * deltaTime;\n\n\t\t\t} else {\n\n\t\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getZoomScale( delta ) {\n\n\t\t\treturn scope.enableDamping && ! scope.zoomToCursor && ! scope.object.isOrthographicCamera ? 1 : Math.pow( 0.95, scope.zoomSpeed );\n\t\t\t// todo try with delta\n\t\t\t// const normalizedDelta = Math.abs( delta * 0.01 );\n\t\t\t// return Math.pow( 0.95, scope.zoomSpeed * normalizedDelta );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tthis.rotateUp = rotateUp;\n\t\tthis.rotateLeft = rotateLeft;\n\n\t\tconst panLeft = function () {\n\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tconst panUp = function () {\n\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tif ( scope.screenSpacePanning === true ) {\n\n\t\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t\t\tv.crossVectors( scope.object.up, v );\n\n\t\t\t\t}\n\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tconst pan = function () {\n\n\t\t\tconst offset = new Vector3();\n\n\t\t\treturn function pan( deltaX, deltaY ) {\n\n\t\t\t\tconst element = scope.domElement;\n\n\t\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tconst position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tlet targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyOut( dollyScale, delta = 0 ) {\n\n\t\t\tif ( scope.object.isPerspectiveCamera || scope.object.isOrthographicCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\t\t\t\tsphericalDelta.radius = Math.max( - scope.maxZoomSpeed, Math.min( scope.maxZoomSpeed, sphericalDelta.radius - delta ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyIn( dollyScale, delta = 0 ) {\n\n\t\t\tif ( scope.object.isPerspectiveCamera || scope.object.isOrthographicCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\t\t\t\tsphericalDelta.radius = Math.max( - scope.maxZoomSpeed, Math.min( scope.maxZoomSpeed, sphericalDelta.radius + delta ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.zoomIn = function ( delta ) {\n\n\t\t\tdollyOut( 1, delta * scope.zoomSpeed );\n\n\t\t};\n\n\t\tthis.zoomOut = function ( delta ) {\n\n\t\t\tdollyIn( 1, delta * scope.zoomSpeed );\n\n\t\t};\n\n\t\tfunction updateZoomParameters( x, y ) {\n\n\t\t\tif ( ! scope.zoomToCursor ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tperformCursorZoom = true;\n\n\t\t\tconst rect = scope.domElement.getBoundingClientRect();\n\t\t\tconst dx = x - rect.left;\n\t\t\tconst dy = y - rect.top;\n\t\t\tconst w = rect.width;\n\t\t\tconst h = rect.height;\n\n\t\t\tmouse.x = ( dx / w ) * 2 - 1;\n\t\t\tmouse.y = - ( dy / h ) * 2 + 1;\n\n\t\t\tdollyDirection.set( mouse.x, mouse.y, 1 ).unproject( scope.object ).sub( scope.object.position ).normalize();\n\n\t\t}\n\n\t\tfunction clampDistance( dist ) {\n\n\t\t\treturn Math.max( scope.minDistance, Math.min( scope.maxDistance, dist ) );\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\tupdateZoomParameters( event.clientX, event.clientX );\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale( dollyDelta.y ) );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale( dollyDelta.y ) );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\tupdateZoomParameters( event.clientX, event.clientY );\n\n\t\t\tlet delta = 0;\n\t\t\t// from trackball controls\n\t\t\tswitch ( event.deltaMode ) {\n\n\t\t\t\tcase 2:\n\t\t\t\t// Zoom in pages\n\t\t\t\t\tdelta += event.deltaY * 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t// Zoom in lines\n\t\t\t\t\tdelta += event.deltaY * 0.4;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t// undefined, 0, assume pixels\n\t\t\t\t\tdelta += event.deltaY * 0.01;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tif ( scope.zoomToCursor || scope.object.isOrthographicCamera )\n\t\t\t\t\tdollyIn( getZoomScale( event.deltaY ) );\n\t\t\t\telse\n\t\t\t\t\tdollyIn( 1, delta * scope.zoomSpeed );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tif ( scope.zoomToCursor || scope.object.isOrthographicCamera )\n\t\t\t\t\tdollyOut( getZoomScale( event.deltaY ) );\n\t\t\t\telse\n\t\t\t\t\tdollyOut( 1, - delta * scope.zoomSpeed );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\tlet needsUpdate = false;\n\n\t\t\tswitch ( event.code ) {\n\n\t\t\t\tcase scope.keys.UP:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateUp( 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateUp( - 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateLeft( 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateLeft( - 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tscope.update();\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\trotateStart.set( event.pageX, event.pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\t\trotateStart.set( x, y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\tpanStart.set( event.pageX, event.pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\t\tpanStart.set( x, y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\tconst dx = event.pageX - position.x;\n\t\t\tconst dy = event.pageY - position.y;\n\n\t\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartDollyPan( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\t\tif ( scope.enablePan ) handleTouchStartPan( event );\n\n\t\t}\n\n\t\tfunction handleTouchStartDollyRotate( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\t\tif ( scope.enableRotate ) handleTouchStartRotate( event );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\tif ( pointers.length == 1 ) {\n\n\t\t\t\trotateEnd.set( event.pageX, event.pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\t\trotateEnd.set( x, y );\n\n\t\t\t}\n\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\tpanEnd.set( event.pageX, event.pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\t\tpanEnd.set( x, y );\n\n\t\t\t}\n\n\t\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\tconst dx = event.pageX - position.x;\n\t\t\tconst dy = event.pageY - position.y;\n\n\t\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\t// todo ` * 6`?\n\t\t\tdollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed * 6 ) );\n\n\t\t\tdollyOut( dollyDelta.y );\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tconst centerX = ( event.pageX + position.x ) * 0.5;\n\t\t\tconst centerY = ( event.pageY + position.y ) * 0.5;\n\n\t\t\tupdateZoomParameters( centerX, centerY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveDollyPan( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\t\tif ( scope.enablePan ) handleTouchMovePan( event );\n\n\t\t}\n\n\t\tfunction handleTouchMoveDollyRotate( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\t\tif ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onPointerDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tif ( pointers.length === 0 ) {\n\n\t\t\t\tscope.domElement.setPointerCapture( event.pointerId );\n\n\t\t\t\tscope.domElement.addEventListener( 'pointermove', onPointerMove );\n\t\t\t\tscope.domElement.addEventListener( 'pointerup', onPointerUp );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( isTrackingPointer( event ) ) return;\n\n\t\t\t//\n\n\t\t\taddPointer( event );\n\n\t\t\tif ( event.pointerType === 'touch' ) {\n\n\t\t\t\tonTouchStart( event );\n\n\t\t\t} else {\n\n\t\t\t\tonMouseDown( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onPointerMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tif ( event.pointerType === 'touch' ) {\n\n\t\t\t\tonTouchMove( event );\n\n\t\t\t} else {\n\n\t\t\t\tif ( ! event.buttons ) onPointerUp( event );\n\t\t\t\telse onMouseMove( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onPointerUp( event ) {\n\n\t\t\tremovePointer( event );\n\n\t\t\tswitch ( pointers.length ) {\n\n\t\t\t\tcase 0:\n\n\t\t\t\t\tscope.domElement.releasePointerCapture( event.pointerId );\n\n\t\t\t\t\tscope.domElement.removeEventListener( 'pointermove', onPointerMove );\n\t\t\t\t\tscope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\t\t\t\t\tscope.dispatchEvent( _endEvent );\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\tconst pointerId = pointers[ 0 ];\n\t\t\t\t\tconst position = pointerPositions[ pointerId ];\n\n\t\t\t\t\t// minimal placeholder event - allows state correction on pointer-up\n\t\t\t\t\tonTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tlet mouseAction;\n\n\t\t\tswitch ( event.button ) {\n\n\t\t\t\tcase 0:\n\n\t\t\t\t\tmouseAction = scope.mouseButtons.LEFT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\tmouseAction = scope.mouseButtons.MIDDLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\n\t\t\t\t\tmouseAction = scope.mouseButtons.RIGHT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tmouseAction = - 1;\n\n\t\t\t}\n\n\t\t\tswitch ( mouseAction ) {\n\n\t\t\t\tcase MOUSE.DOLLY:\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MOUSE.ROTATE:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MOUSE.PAN:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( _startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tswitch ( state ) {\n\n\t\t\t\tcase STATE.ROTATE:\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.DOLLY:\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.PAN:\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tscope.dispatchEvent( _startEvent );\n\n\t\t\thandleMouseWheel( customWheelEvent( event ) );\n\n\t\t\tscope.dispatchEvent( _endEvent );\n\n\t\t}\n\n\t\tfunction customWheelEvent( event ) {\n\n\t\t\tconst mode = event.deltaMode;\n\n\t\t\t// minimal wheel event altered to meet delta-zoom demand\n\t\t\tconst newEvent = {\n\t\t\t\tclientX: event.clientX,\n\t\t\t\tclientY: event.clientY,\n\t\t\t\tdeltaY: event.deltaY,\n\t\t\t};\n\n\t\t\tswitch ( mode ) {\n\n\t\t\t\tcase 1: // LINE_MODE\n\t\t\t\t\tnewEvent.deltaY *= 16;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // PAGE_MODE\n\t\t\t\t\tnewEvent.deltaY *= 100;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// detect if event was triggered by pinching\n\t\t\tif ( event.ctrlKey && ! controlActive ) {\n\n\t\t\t\tnewEvent.deltaY *= 10;\n\n\t\t\t}\n\n\t\t\treturn newEvent;\n\n\t\t}\n\n\t\tfunction interceptControlDown( event ) {\n\n\t\t\tif ( event.key === 'Control' ) {\n\n\t\t\t\tcontrolActive = true;\n\n\n\t\t\t\tconst document = scope.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\t\t\tdocument.addEventListener( 'keyup', interceptControlUp, { passive: true, capture: true } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interceptControlUp( event ) {\n\n\t\t\tif ( event.key === 'Control' ) {\n\n\t\t\t\tcontrolActive = false;\n\n\n\t\t\t\tconst document = scope.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\t\t\tdocument.removeEventListener( 'keyup', interceptControlUp, { passive: true, capture: true } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\ttrackPointer( event );\n\n\t\t\tswitch ( pointers.length ) {\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\tswitch ( scope.touches.ONE ) {\n\n\t\t\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\n\t\t\t\t\tswitch ( scope.touches.TWO ) {\n\n\t\t\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyPan( event );\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyRotate( event );\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( _startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\ttrackPointer( event );\n\n\t\t\tswitch ( state ) {\n\n\t\t\t\tcase STATE.TOUCH_ROTATE:\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_PAN:\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_DOLLY_PAN:\n\n\t\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchMoveDollyPan( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchMoveDollyRotate( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\tfunction addPointer( event ) {\n\n\t\t\tpointers.push( event.pointerId );\n\n\t\t}\n\n\t\tfunction removePointer( event ) {\n\n\t\t\tdelete pointerPositions[ event.pointerId ];\n\n\t\t\tfor ( let i = 0; i < pointers.length; i ++ ) {\n\n\t\t\t\tif ( pointers[ i ] == event.pointerId ) {\n\n\t\t\t\t\tpointers.splice( i, 1 );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTrackingPointer( event ) {\n\n\t\t\tfor ( let i = 0; i < pointers.length; i ++ ) {\n\n\t\t\t\tif ( pointers[ i ] == event.pointerId ) return true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfunction trackPointer( event ) {\n\n\t\t\tlet position = pointerPositions[ event.pointerId ];\n\n\t\t\tif ( position === undefined ) {\n\n\t\t\t\tposition = new Vector2();\n\t\t\t\tpointerPositions[ event.pointerId ] = position;\n\n\t\t\t}\n\n\t\t\tposition.set( event.pageX, event.pageY );\n\n\t\t}\n\n\t\tfunction getSecondPointerPosition( event ) {\n\n\t\t\tconst pointerId = ( event.pointerId === pointers[ 0 ] ) ? pointers[ 1 ] : pointers[ 0 ];\n\n\t\t\treturn pointerPositions[ pointerId ];\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu );\n\n\t\tscope.domElement.addEventListener( 'pointerdown', onPointerDown );\n\t\tscope.domElement.addEventListener( 'pointercancel', onPointerUp );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\n\n\t\tconst document = scope.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.addEventListener( 'keydown', interceptControlDown, { passive: true, capture: true } );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t}\n\n}\n\nexport { OrbitControls };\n","import {OrbitControls, OrbitControlsEventMap} from 'three/examples/jsm/controls/OrbitControls.js'\nimport {IUiConfigContainer, uiInput, UiObjectConfig, uiPanelContainer, uiToggle, uiVector} from 'uiconfig.js'\nimport {serialize} from 'ts-browser-helpers'\nimport {ICameraControls} from '../../core'\nimport {Vector3} from 'three'\n\n@uiPanelContainer('Orbit Controls')\nexport class OrbitControls3 extends OrbitControls implements IUiConfigContainer, ICameraControls<OrbitControlsEventMap> {\n    uiConfig?: UiObjectConfig<void, 'panel'>\n\n    @serialize() type = 'OrbitControls'\n\n    @uiToggle() enabled = true\n\n    @uiToggle() @serialize() dollyZoom = false\n    @uiToggle() @serialize() zoomToCursor = false\n\n    @uiToggle() @serialize() enableDamping = true\n    @uiInput() @serialize() dampingFactor = 0.08\n\n    @uiToggle() @serialize() autoRotate = false\n    @uiInput() @serialize() autoRotateSpeed = 2.0\n\n    @uiToggle() @serialize() enableZoom = true\n    @uiInput() @serialize() zoomSpeed = 0.15\n    @uiInput() @serialize() maxZoomSpeed = 0.20\n\n    @uiToggle() @serialize() enableRotate = true\n    @uiInput() @serialize() rotateSpeed = 2.0\n\n    @uiToggle() @serialize() enablePan = true\n    @uiInput() @serialize() panSpeed = 1.0\n\n    @uiInput() @serialize() autoPushTarget = false\n    @uiInput() @serialize() autoPullTarget = false\n    @uiInput() @serialize() minDistance = 0.35\n    @uiInput() @serialize() maxDistance = 1e6 // should be Infinity but this breaks the UI\n\n    @uiInput() @serialize() minZoom = 0.01\n    @uiInput() @serialize() maxZoom = 1e6 // should be Infinity but this breaks the UI\n\n    @uiInput() @serialize() minPolarAngle = 0\n    @uiInput() @serialize() maxPolarAngle = Math.PI\n\n    @uiInput() @serialize() minAzimuthAngle = -1e6 // should be -Infinity but this breaks the UI\n    @uiInput() @serialize() maxAzimuthAngle = 1e6 // should be Infinity but this breaks the UI\n\n    @uiVector() @serialize() clampMin = new Vector3(-1e6, -1e6, -1e6) // should be -Infinity but this breaks the UI\n    @uiVector() @serialize() clampMax = new Vector3(1e6, 1e6, 1e6) // should be Infinity but this breaks the UI\n\n    // @uiToggle()\n    @serialize() screenSpacePanning = true\n    // @uiInput()\n    @serialize() keyPanSpeed = 7.0\n\n    throttleUpdate = 60 // throttle to 60 updates per second (implemented in OrbitControls.js.update() method)\n\n    stopDamping!: () => void\n}\n","/* eslint-disable */\nimport {\n    BoxGeometry,\n    BufferGeometry,\n    CylinderGeometry,\n    DoubleSide,\n    Euler,\n    Float32BufferAttribute,\n    Line,\n    LineBasicMaterial,\n    Matrix4,\n    Mesh,\n    MeshBasicMaterial,\n    Object3D,\n    OctahedronGeometry,\n    PlaneGeometry,\n    Quaternion,\n    Raycaster,\n    SphereGeometry,\n    TorusGeometry,\n    Vector3\n} from 'three';\n\nconst _raycaster = new Raycaster();\n_raycaster.params.Line2 = {threshold: 0.01} // for picking lines\n\nconst _tempVector = new Vector3();\nconst _tempVector2 = new Vector3();\nconst _tempQuaternion = new Quaternion();\nconst _unit = {\n    X: new Vector3( 1, 0, 0 ),\n    Y: new Vector3( 0, 1, 0 ),\n    Z: new Vector3( 0, 0, 1 )\n};\n\nconst _changeEvent = { type: 'change' };\nconst _mouseDownEvent = { type: 'mouseDown', mode: null };\nconst _mouseUpEvent = { type: 'mouseUp', mode: null };\nconst _objectChangeEvent = { type: 'objectChange' };\n\nclass TransformControls extends Object3D {\n\n    constructor( camera, domElement ) {\n\n        super();\n\n        if ( domElement === undefined ) {\n\n            console.warn( 'THREE.TransformControls: The second parameter \"domElement\" is now mandatory.' );\n            domElement = document;\n\n        }\n\n        this.isTransformControls = true;\n\n        this.visible = false;\n        this.domElement = domElement;\n        this.domElement.style.touchAction = 'none'; // disable touch scroll\n\n        const _gizmo = new TransformControlsGizmo();\n        this._gizmo = _gizmo;\n        this.add( _gizmo );\n\n        const _plane = new TransformControlsPlane();\n        this._plane = _plane;\n        this.add( _plane );\n\n        const scope = this;\n\n        // Defined getter, setter and store for a property\n        function defineProperty( propName, defaultValue ) {\n\n            let propValue = defaultValue;\n\n            Object.defineProperty( scope, propName, {\n\n                get: function () {\n\n                    return propValue !== undefined ? propValue : defaultValue;\n\n                },\n\n                set: function ( value ) {\n\n                    if ( propValue !== value && !(scope.lockProps && scope.lockProps.includes( propName )) ) {\n\n                        propValue = value;\n                        _plane[ propName ] = value;\n                        _gizmo[ propName ] = value;\n\n                        scope.dispatchEvent( { type: propName + '-changed', value: value } );\n                        scope.dispatchEvent( _changeEvent );\n\n                    }\n\n                }\n\n            } );\n\n            scope[ propName ] = defaultValue;\n            _plane[ propName ] = defaultValue;\n            _gizmo[ propName ] = defaultValue;\n\n        }\n\n        // Define properties with getters/setter\n        // Setting the defined property will automatically trigger change event\n        // Defined properties are passed down to gizmo and plane\n\n        defineProperty( 'camera', camera );\n        defineProperty( 'object', undefined );\n        defineProperty( 'enabled', true );\n        defineProperty( 'axis', null );\n        defineProperty( 'mode', 'translate' );\n        defineProperty( 'translationSnap', null );\n        defineProperty( 'rotationSnap', null );\n        defineProperty( 'scaleSnap', null );\n        defineProperty( 'space', 'world' );\n        defineProperty( 'size', 1 );\n        defineProperty( 'dragging', false );\n        defineProperty( 'showX', true );\n        defineProperty( 'showY', true );\n        defineProperty( 'showZ', true );\n\n        // Reusable utility variables\n\n        const worldPosition = new Vector3();\n        const worldPositionStart = new Vector3();\n        const worldQuaternion = new Quaternion();\n        const worldQuaternionStart = new Quaternion();\n        const cameraPosition = new Vector3();\n        const cameraQuaternion = new Quaternion();\n        const pointStart = new Vector3();\n        const pointEnd = new Vector3();\n        const rotationAxis = new Vector3();\n        const rotationAngle = 0;\n        const eye = new Vector3();\n\n        // TODO: remove properties unused in plane and gizmo\n\n        defineProperty( 'worldPosition', worldPosition );\n        defineProperty( 'worldPositionStart', worldPositionStart );\n        defineProperty( 'worldQuaternion', worldQuaternion );\n        defineProperty( 'worldQuaternionStart', worldQuaternionStart );\n        defineProperty( 'cameraPosition', cameraPosition );\n        defineProperty( 'cameraQuaternion', cameraQuaternion );\n        defineProperty( 'pointStart', pointStart );\n        defineProperty( 'pointEnd', pointEnd );\n        defineProperty( 'rotationAxis', rotationAxis );\n        defineProperty( 'rotationAngle', rotationAngle );\n        defineProperty( 'eye', eye );\n\n        this._offset = new Vector3();\n        this._startNorm = new Vector3();\n        this._endNorm = new Vector3();\n        this._cameraScale = new Vector3();\n\n        this._parentPosition = new Vector3();\n        this._parentQuaternion = new Quaternion();\n        this._parentQuaternionInv = new Quaternion();\n        this._parentScale = new Vector3();\n\n        this._worldScaleStart = new Vector3();\n        this._worldQuaternionInv = new Quaternion();\n        this._worldScale = new Vector3();\n\n        this._positionStart = new Vector3();\n        this._quaternionStart = new Quaternion();\n        this._scaleStart = new Vector3();\n\n        this._getPointer = getPointer.bind( this );\n        this._onPointerDown = onPointerDown.bind( this );\n        this._onPointerHover = onPointerHover.bind( this );\n        this._onPointerMove = onPointerMove.bind( this );\n        this._onPointerUp = onPointerUp.bind( this );\n\n        this.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n        this.domElement.addEventListener( 'pointermove', this._onPointerHover );\n        this.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n    }\n\n    // updateMatrixWorld  updates key transformation variables\n    updateMatrixWorld() {\n\n        if ( this.object !== undefined ) {\n\n            this.object.updateMatrixWorld();\n\n            if ( this.object.parent === null ) {\n\n                console.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );\n\n            } else {\n\n                this.object.parent.matrixWorld.decompose( this._parentPosition, this._parentQuaternion, this._parentScale );\n\n            }\n\n            this.object.matrixWorld.decompose( this.worldPosition, this.worldQuaternion, this._worldScale );\n\n            this._parentQuaternionInv.copy( this._parentQuaternion ).invert();\n            this._worldQuaternionInv.copy( this.worldQuaternion ).invert();\n\n        }\n\n        this.camera.updateMatrixWorld();\n        this.camera.matrixWorld.decompose( this.cameraPosition, this.cameraQuaternion, this._cameraScale );\n\n        if ( this.camera.isOrthographicCamera ) {\n\n            this.camera.getWorldDirection( this.eye ).negate();\n\n        } else {\n\n            this.eye.copy( this.cameraPosition ).sub( this.worldPosition ).normalize();\n\n        }\n\n        super.updateMatrixWorld( this );\n\n    }\n\n    pointerHover( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true ) return;\n\n\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n        const intersect = intersectObjectWithRay( this._gizmo.picker[ this.mode ], _raycaster );\n\n        if ( intersect ) {\n\n            this.axis = intersect.object.name;\n\n        } else {\n\n            this.axis = null;\n\n        }\n\n    }\n\n    pointerDown( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || ( pointer != null && pointer.button !== 0 ) ) return;\n\n        if ( this.axis !== null ) {\n\n\t\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n            const planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n            if ( planeIntersect ) {\n\n                this.object.updateMatrixWorld();\n                this.object.parent.updateMatrixWorld();\n\n                this._positionStart.copy( this.object.position );\n                this._quaternionStart.copy( this.object.quaternion );\n                this._scaleStart.copy( this.object.scale );\n\n                this.object.matrixWorld.decompose( this.worldPositionStart, this.worldQuaternionStart, this._worldScaleStart );\n\n                this.pointStart.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n            }\n\n            this.dragging = true;\n            _mouseDownEvent.mode = this.mode;\n            this.dispatchEvent( _mouseDownEvent );\n\n        }\n\n    }\n\n    pointerMove( pointer ) {\n\n        const axis = this.axis;\n        const mode = this.mode;\n        const object = this.object;\n        const isMultiDummy = object && object.userData && object.userData.isMultiSelectDummy;\n        let space = isMultiDummy ? 'world' : this.space;\n\n        if ( mode === 'scale' && !isMultiDummy ) {\n\n            space = 'local';\n\n        } else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) {\n\n            space = 'world';\n\n        }\n\n\t\tif ( object === undefined || axis === null || this.dragging === false || ( pointer !== null && pointer.button !== - 1 ) ) return;\n\n\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n        const planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n        if ( ! planeIntersect ) return;\n\n        this.pointEnd.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n        if ( mode === 'translate' ) {\n\n            // Apply translate\n\n            this._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n            if ( space === 'local' && axis !== 'XYZ' ) {\n\n                this._offset.applyQuaternion( this._worldQuaternionInv );\n\n            }\n\n            if ( axis.indexOf( 'X' ) === - 1 ) this._offset.x = 0;\n            if ( axis.indexOf( 'Y' ) === - 1 ) this._offset.y = 0;\n            if ( axis.indexOf( 'Z' ) === - 1 ) this._offset.z = 0;\n\n            if ( space === 'local' && axis !== 'XYZ' ) {\n\n                this._offset.applyQuaternion( this._quaternionStart ).divide( this._parentScale );\n\n            } else {\n\n                this._offset.applyQuaternion( this._parentQuaternionInv ).divide( this._parentScale );\n\n            }\n\n            object.position.copy( this._offset ).add( this._positionStart );\n\n            // Apply translation snap\n\n            if ( this.translationSnap ) {\n\n                if ( space === 'local' ) {\n\n                    object.position.applyQuaternion( _tempQuaternion.copy( this._quaternionStart ).invert() );\n\n                    if ( axis.search( 'X' ) !== - 1 ) {\n\n                        object.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n                    }\n\n                    if ( axis.search( 'Y' ) !== - 1 ) {\n\n                        object.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n                    }\n\n                    if ( axis.search( 'Z' ) !== - 1 ) {\n\n                        object.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n                    }\n\n                    object.position.applyQuaternion( this._quaternionStart );\n\n                }\n\n                if ( space === 'world' ) {\n\n                    if ( object.parent ) {\n\n                        object.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n                    }\n\n                    if ( axis.search( 'X' ) !== - 1 ) {\n\n                        object.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n                    }\n\n                    if ( axis.search( 'Y' ) !== - 1 ) {\n\n                        object.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n                    }\n\n                    if ( axis.search( 'Z' ) !== - 1 ) {\n\n                        object.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n                    }\n\n                    if ( object.parent ) {\n\n                        object.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n                    }\n\n                }\n\n            }\n\n        } else if ( mode === 'scale' ) {\n\n            if ( axis.search( 'XYZ' ) !== - 1 ) {\n\n                let d = this.pointEnd.length() / this.pointStart.length();\n\n                if ( this.pointEnd.dot( this.pointStart ) < 0 ) d *= - 1;\n\n                _tempVector2.set( d, d, d );\n\n            } else {\n\n                _tempVector.copy( this.pointStart );\n                _tempVector2.copy( this.pointEnd );\n\n                _tempVector.applyQuaternion( this._worldQuaternionInv );\n                _tempVector2.applyQuaternion( this._worldQuaternionInv );\n\n                _tempVector2.divide( _tempVector );\n\n                if ( axis.search( 'X' ) === - 1 ) {\n\n                    _tempVector2.x = 1;\n\n                }\n\n                if ( axis.search( 'Y' ) === - 1 ) {\n\n                    _tempVector2.y = 1;\n\n                }\n\n                if ( axis.search( 'Z' ) === - 1 ) {\n\n                    _tempVector2.z = 1;\n\n                }\n\n            }\n\n            // Apply scale\n\n            object.scale.copy( this._scaleStart ).multiply( _tempVector2 );\n\n            if ( this.scaleSnap ) {\n\n                if ( axis.search( 'X' ) !== - 1 ) {\n\n                    object.scale.x = Math.round( object.scale.x / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n                }\n\n                if ( axis.search( 'Y' ) !== - 1 ) {\n\n                    object.scale.y = Math.round( object.scale.y / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n                }\n\n                if ( axis.search( 'Z' ) !== - 1 ) {\n\n                    object.scale.z = Math.round( object.scale.z / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n                }\n\n            }\n\n        } else if ( mode === 'rotate' ) {\n\n            this._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n            const ROTATION_SPEED = 20 / this.worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );\n\n            let _inPlaneRotation = false;\n\n            if ( axis === 'XYZE' ) {\n\n                this.rotationAxis.copy( this._offset ).cross( this.eye ).normalize();\n                this.rotationAngle = this._offset.dot( _tempVector.copy( this.rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED;\n\n            } else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) {\n\n                this.rotationAxis.copy( _unit[ axis ] );\n\n                _tempVector.copy( _unit[ axis ] );\n\n                if ( space === 'local' ) {\n\n                    _tempVector.applyQuaternion( this.worldQuaternion );\n\n                }\n\n                _tempVector.cross( this.eye );\n\n                // When _tempVector is 0 after cross with this.eye the vectors are parallel and should use in-plane rotation logic.\n                if ( _tempVector.length() === 0 ) {\n\n                    _inPlaneRotation = true;\n\n                } else {\n\n                    this.rotationAngle = this._offset.dot( _tempVector.normalize() ) * ROTATION_SPEED;\n\n                }\n\n\n            }\n\n            if ( axis === 'E' || _inPlaneRotation ) {\n\n                this.rotationAxis.copy( this.eye );\n                this.rotationAngle = this.pointEnd.angleTo( this.pointStart );\n\n                this._startNorm.copy( this.pointStart ).normalize();\n                this._endNorm.copy( this.pointEnd ).normalize();\n\n                this.rotationAngle *= ( this._endNorm.cross( this._startNorm ).dot( this.eye ) < 0 ? 1 : - 1 );\n\n            }\n\n            // Apply rotation snap\n\n            if ( this.rotationSnap ) this.rotationAngle = Math.round( this.rotationAngle / this.rotationSnap ) * this.rotationSnap;\n\n            // Apply rotate\n            if ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) {\n\n                object.quaternion.copy( this._quaternionStart );\n                object.quaternion.multiply( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) ).normalize();\n\n            } else {\n\n                this.rotationAxis.applyQuaternion( this._parentQuaternionInv );\n                object.quaternion.copy( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) );\n                object.quaternion.multiply( this._quaternionStart ).normalize();\n\n            }\n\n        }\n\n        this.dispatchEvent( _changeEvent );\n        this.dispatchEvent( _objectChangeEvent );\n\n    }\n\n    pointerUp( pointer ) {\n\n\t\tif ( pointer !== null && pointer.button !== 0 ) return;\n\n        if ( this.dragging && ( this.axis !== null ) ) {\n\n            _mouseUpEvent.mode = this.mode;\n            this.dispatchEvent( _mouseUpEvent );\n\n        }\n\n        this.dragging = false;\n        this.axis = null;\n\n    }\n\n    dispose() {\n\n        this.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n        this.domElement.removeEventListener( 'pointermove', this._onPointerHover );\n        this.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n        this.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n        this.traverse( function ( child ) {\n\n            if ( child.geometry ) child.geometry.dispose();\n            if ( child.material ) child.material.dispose();\n\n        } );\n\n    }\n\n    // Set current object\n    attach( object ) {\n\n        this.object = object;\n        this.visible = true;\n\n        return this;\n\n    }\n\n    // Detach from object\n    detach() {\n\n        this.object = undefined;\n        this.visible = false;\n        this.dragging = false;\n        this.axis = null;\n\n        return this;\n\n    }\n\n    reset() {\n\n        if ( ! this.enabled ) return;\n\n        if ( this.dragging ) {\n\n            this.object.position.copy( this._positionStart );\n            this.object.quaternion.copy( this._quaternionStart );\n            this.object.scale.copy( this._scaleStart );\n\n            this.dispatchEvent( _changeEvent );\n            this.dispatchEvent( _objectChangeEvent );\n\n            this.pointStart.copy( this.pointEnd );\n\n        }\n\n    }\n\n    getRaycaster() {\n\n        return _raycaster;\n\n    }\n\n    // TODO: deprecate\n\n    getMode() {\n\n        return this.mode;\n\n    }\n\n    setMode( mode ) {\n\n        this.mode = mode;\n\n    }\n\n    setTranslationSnap( translationSnap ) {\n\n        this.translationSnap = translationSnap;\n\n    }\n\n    setRotationSnap( rotationSnap ) {\n\n        this.rotationSnap = rotationSnap;\n\n    }\n\n    setScaleSnap( scaleSnap ) {\n\n        this.scaleSnap = scaleSnap;\n\n    }\n\n    setSize( size ) {\n\n        this.size = size;\n\n    }\n\n    setSpace( space ) {\n\n        this.space = space;\n\n    }\n\n}\n\nTransformControls.ObjectConstructors = {\n    'MeshBasicMaterial': MeshBasicMaterial,\n    'LineBasicMaterial': LineBasicMaterial,\n};\n\n// mouse / touch event handlers\n\nfunction getPointer( event ) {\n\n    if ( this.domElement.ownerDocument.pointerLockElement ) {\n\n        return {\n            x: 0,\n            y: 0,\n            button: event.button,\n            buttons: event.buttons\n        };\n\n    } else {\n\n        const rect = this.domElement.getBoundingClientRect();\n\n        return {\n            x: ( event.clientX - rect.left ) / rect.width * 2 - 1,\n            y: - ( event.clientY - rect.top ) / rect.height * 2 + 1,\n            button: event.button,\n            buttons: event.buttons\n        };\n\n    }\n\n}\n\nfunction onPointerHover( event ) {\n\n    if ( ! this.enabled ) return;\n\n    switch ( event.pointerType ) {\n\n        case 'mouse':\n        case 'pen':\n            this.pointerHover( this._getPointer( event ) );\n            break;\n\n    }\n\n}\n\nfunction onPointerDown( event ) {\n\n    if ( ! this.enabled ) return;\n\n    if ( ! document.pointerLockElement ) {\n\n        this.domElement.setPointerCapture( event.pointerId );\n\n    }\n\n    this.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\n    this.pointerHover( this._getPointer( event ) );\n    this.pointerDown( this._getPointer( event ) );\n\n}\n\nfunction onPointerMove( event ) {\n\n    if ( ! this.enabled ) return;\n\n    this.pointerMove( this._getPointer( event ) );\n\n}\n\nfunction onPointerUp( event ) {\n\n    if ( ! this.enabled ) return;\n\n    this.domElement.releasePointerCapture( event.pointerId );\n\n    this.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\n    this.pointerUp( this._getPointer( event ) );\n\n}\n\nfunction intersectObjectWithRay( object, raycaster, includeInvisible ) {\n\n    const allIntersections = raycaster.intersectObject( object, true );\n\n    for ( let i = 0; i < allIntersections.length; i ++ ) {\n\n        if ( allIntersections[ i ].object.visible || includeInvisible ) {\n\n            return allIntersections[ i ];\n\n        }\n\n    }\n\n    return false;\n\n}\n\n//\n\n// Reusable utility variables\n\nconst _tempEuler = new Euler();\nconst _alignVector = new Vector3( 0, 1, 0 );\nconst _zeroVector = new Vector3( 0, 0, 0 );\nconst _lookAtMatrix = new Matrix4();\nconst _tempQuaternion2 = new Quaternion();\nconst _identityQuaternion = new Quaternion();\nconst _dirVector = new Vector3();\nconst _tempMatrix = new Matrix4();\n\nconst _unitX = new Vector3( 1, 0, 0 );\nconst _unitY = new Vector3( 0, 1, 0 );\nconst _unitZ = new Vector3( 0, 0, 1 );\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\nclass TransformControlsGizmo extends Object3D {\n\n    constructor() {\n\n        super();\n\n        this.isTransformControlsGizmo = true;\n\n        this.type = 'TransformControlsGizmo';\n\n        // shared materials\n\n        const gizmoMaterial = new TransformControls.ObjectConstructors.MeshBasicMaterial( {\n            allowOverride: false,\n            depthTest: false,\n            depthWrite: false,\n            fog: false,\n            toneMapped: false,\n            transparent: true\n        } );\n\n        const gizmoLineMaterial = new TransformControls.ObjectConstructors.LineBasicMaterial( {\n            allowOverride: false,\n            depthTest: false,\n            depthWrite: false,\n            fog: false,\n            toneMapped: false,\n            transparent: true\n        } );\n\n        // Make unique material for each axis/color\n\n        const matInvisible = gizmoMaterial.clone();\n        matInvisible.opacity = 0.15;\n\n        const matHelper = gizmoLineMaterial.clone();\n        matHelper.opacity = 1;\n\n        const matRed = gizmoMaterial.clone();\n        matRed.color.setHex( 0xEF0065 );\n        matRed.opacity = 0.95;\n\n        const matGreen = gizmoMaterial.clone();\n        matGreen.color.setHex( 0x1EBE00 );\n        matGreen.opacity = 0.95;\n\n        const matBlue = gizmoMaterial.clone();\n        matBlue.color.setHex( 0x0093FD );\n        matBlue.opacity = 0.95;\n\n        const matRed2 = gizmoMaterial.clone();\n        matRed2.color.setHex( 0xFD94C1 );\n        matRed2.__color = matRed.color.getHex()\n\n        const matGreen2 = gizmoMaterial.clone();\n        matGreen2.color.setHex( 0xBEFC7A );\n        matGreen2.__color = matGreen.color.getHex()\n\n        const matBlue2 = gizmoMaterial.clone();\n        matBlue2.color.setHex( 0xADE8FC );\n        matBlue2.__color = matBlue.color.getHex()\n\n        const matRedTransparent = gizmoMaterial.clone();\n        matRedTransparent.color.setHex( 0xEF0065 );\n        matRedTransparent.opacity = 0.75;\n\n        const matGreenTransparent = gizmoMaterial.clone();\n        matGreenTransparent.color.setHex( 0x1EBE00 );\n        matGreenTransparent.opacity = 0.75;\n\n        const matBlueTransparent = gizmoMaterial.clone();\n        matBlueTransparent.color.setHex( 0x0093FD );\n        matBlueTransparent.opacity = 0.75;\n\n        const matWhiteTransparent = gizmoMaterial.clone();\n        matWhiteTransparent.color.setHex( 0xc4bdbd );\n        matWhiteTransparent.opacity = 0.75;\n\n        const matYellowTransparent = gizmoMaterial.clone();\n        matYellowTransparent.color.setHex( 0xffff5b );\n        matYellowTransparent.opacity = 0.25;\n\n        // const matYellow = gizmoMaterial.clone();\n        // matYellow.color.setHex( 0xffff00 );\n\n        const matGray = gizmoMaterial.clone();\n        matGray.color.setHex( 0x787878 );\n        matGray.opacity = 0.75\n\n        // reusable geometry\n\n        const arrowGeometry = new CylinderGeometry( 0, 0.04, 0.1, 12 );\n        arrowGeometry.translate( 0, 0.05, 0 );\n\n        const scaleHandleGeometry = new BoxGeometry( 0.08, 0.08, 0.08 );\n        scaleHandleGeometry.translate( 0, 0.04, 0 );\n\n        const lineGeometry = new BufferGeometry();\n        lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0,\t1, 0, 0 ], 3 ) );\n\n        const lineGeometry2 = new CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );\n        lineGeometry2.translate( 0, 0.25, 0 );\n\n        function CircleGeometry( radius, arc ) {\n\n            const geometry = new TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );\n            geometry.rotateY( Math.PI / 2 );\n            geometry.rotateX( Math.PI / 2 );\n            return geometry;\n\n        }\n\n        function CircleGeometry2( radius, arc ) {\n\n            const geometry = new TorusGeometry( radius, 0.1, 4, 24, arc * Math.PI * 2 );\n            geometry.rotateY( Math.PI / 2 );\n            geometry.rotateX( Math.PI / 2 );\n            return geometry;\n\n        }\n\n        // Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position\n\n        function TranslateHelperGeometry() {\n\n            const geometry = new BufferGeometry();\n\n            geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) );\n\n            return geometry;\n\n        }\n\n        // Gizmo definitions - custom hierarchy definitions for setupGizmo() function\n\n        const gizmoTranslate = {\n            X: [\n                [ new Mesh( arrowGeometry, matRed2 ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n                // [ new Mesh( arrowGeometry, matRed2 ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n                [ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]\n            ],\n            Y: [\n                [ new Mesh( arrowGeometry, matGreen2 ), [ 0, 0.5, 0 ]],\n                // [ new Mesh( arrowGeometry, matGreen2 ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]],\n                [ new Mesh( lineGeometry2, matGreen ) ]\n            ],\n            Z: [\n                [ new Mesh( arrowGeometry, matBlue2 ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n                // [ new Mesh( arrowGeometry, matBlue2 ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]],\n                [ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]\n            ],\n            XYZ: [\n                [ new Mesh( new OctahedronGeometry( 0.1, 2 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ]]\n            ],\n            XY: [\n                [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matBlueTransparent.clone() ), [ 0.2, 0.2, 0 ]]\n            ],\n            YZ: [\n                [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matRedTransparent.clone() ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]]\n            ],\n            XZ: [\n                [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matGreenTransparent.clone() ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]]\n            ]\n        };\n\n        const pickerTranslate = {\n            X: [\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n                // [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n            ],\n            Y: [\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n                // [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n            ],\n            Z: [\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n                // [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n            ],\n            XYZ: [\n                [ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ]\n            ],\n            XY: [\n                [ new Mesh( new BoxGeometry( 0.25, 0.25, 0.01 ), matInvisible ), [ 0.2, 0.2, 0 ]]\n            ],\n            YZ: [\n                [ new Mesh( new BoxGeometry( 0.25, 0.25, 0.01 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]]\n            ],\n            XZ: [\n                [ new Mesh( new BoxGeometry( 0.25, 0.25, 0.01 ), matInvisible ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]]\n            ]\n        };\n\n        const helperTranslate = {\n            START: [\n                [ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n            ],\n            END: [\n                [ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n            ],\n            DELTA: [\n                [ new Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ]\n            ],\n            X: [\n                [ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n            ],\n            Y: [\n                [ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n            ],\n            Z: [\n                [ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n            ]\n        };\n\n        const gizmoRotate = {\n            XYZE: [\n                [ new Mesh( new SphereGeometry( 0.1, 10, 8 ), matWhiteTransparent ) ],\n                [ new Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]\n            ],\n            X: [\n                [ new Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ],\n                [ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n                [ new Mesh( arrowGeometry.clone().translate(0.5, 0, 0), matRed2 ), [ 0, 0, 0 ], [ - Math.PI / 2, - Math.PI / 2, - Math.PI / 2 ]],\n            ],\n            Y: [\n                [ new Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]],\n                [ new Mesh( lineGeometry2, matGreen ) ],\n                [ new Mesh( arrowGeometry.clone().rotateZ(-Math.PI/2).translate(0, 0.5, 0), matGreen2 ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n            ],\n            Z: [\n                [ new Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]],\n                [ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]],\n                [ new Mesh( arrowGeometry.clone().rotateZ(-Math.PI).translate(0, 0, 0.5), matBlue2 ), [ 0, 0, 0 ], [0, Math.PI / 2, 0 ]],\n            ],\n            // E: [\n            //     [ new Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]\n            // ]\n        };\n\n        const helperRotate = {\n            AXIS: [\n                [ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n            ]\n        };\n\n        const pickerRotate = {\n            XYZE: [\n                [ new Mesh( new SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]\n            ],\n            X: [\n                [ new Mesh( CircleGeometry2( 0.5, 0.5 ), matInvisible )],\n            ],\n            Y: [\n                [ new Mesh( CircleGeometry2( 0.5, 0.5 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n            ],\n            Z: [\n                [ new Mesh( CircleGeometry2( 0.5, 0.5 ), matInvisible ), [ 0, 0, 0 ], [ 0, Math.PI / 2, 0 ]],\n            ],\n            // E: [\n            //     [ new Mesh( new TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]\n            // ]\n        };\n\n        const gizmoScale = {\n            X: [\n                [ new Mesh( scaleHandleGeometry, matRed2 ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n                [ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n                // [ new Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n            ],\n            Y: [\n                [ new Mesh( scaleHandleGeometry, matGreen2 ), [ 0, 0.5, 0 ]],\n                [ new Mesh( lineGeometry2, matGreen ) ],\n                // [ new Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]],\n            ],\n            Z: [\n                [ new Mesh( scaleHandleGeometry, matBlue2 ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n                [ new Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n                // [ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]\n            ],\n            XY: [\n                [ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]\n            ],\n            YZ: [\n                [ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n            ],\n            XZ: [\n                [ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n            ],\n            XYZ: [\n                [ new Mesh( new BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent.clone() ) ],\n            ]\n        };\n\n        const pickerScale = {\n            X: [\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n            ],\n            Y: [\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n            ],\n            Z: [\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n                [ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n            ],\n            XY: [\n                [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]],\n            ],\n            YZ: [\n                [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],\n            ],\n            XZ: [\n                [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],\n            ],\n            XYZ: [\n                [ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]],\n            ]\n        };\n\n        const helperScale = {\n            X: [\n                [ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n            ],\n            Y: [\n                [ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n            ],\n            Z: [\n                [ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n            ]\n        };\n\n        // Creates an Object3D with gizmos described in custom hierarchy definition.\n\n        function setupGizmo( gizmoMap ) {\n\n            const gizmo = new Object3D();\n\n            for ( const name in gizmoMap ) {\n\n                for ( let i = gizmoMap[ name ].length; i --; ) {\n\n                    const object = gizmoMap[ name ][ i ][ 0 ].clone();\n                    const position = gizmoMap[ name ][ i ][ 1 ];\n                    const rotation = gizmoMap[ name ][ i ][ 2 ];\n                    const scale = gizmoMap[ name ][ i ][ 3 ];\n                    const tag = gizmoMap[ name ][ i ][ 4 ];\n\n                    // name and tag properties are essential for picking and updating logic.\n                    object.name = name;\n                    object.tag = tag;\n\n                    if ( position ) {\n\n                        object.position.set( position[ 0 ], position[ 1 ], position[ 2 ] );\n\n                    }\n\n                    if ( rotation ) {\n\n                        object.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] );\n\n                    }\n\n                    if ( scale ) {\n\n                        object.scale.set( scale[ 0 ], scale[ 1 ], scale[ 2 ] );\n\n                    }\n\n                    object.updateMatrix();\n\n                    const tempGeometry = object.geometry.clone();\n                    tempGeometry.applyMatrix4( object.matrix );\n                    object.geometry = tempGeometry;\n                    object.renderOrder = Infinity;\n\n                    object.position.set( 0, 0, 0 );\n                    object.rotation.set( 0, 0, 0 );\n                    object.scale.set( 1, 1, 1 );\n\n                    gizmo.add( object );\n\n                }\n\n            }\n\n            return gizmo;\n\n        }\n\n        // Gizmo creation\n\n        this.gizmo = {};\n        this.picker = {};\n        this.helper = {};\n\n        this.add( this.gizmo[ 'translate' ] = setupGizmo( gizmoTranslate ) );\n        this.add( this.gizmo[ 'rotate' ] = setupGizmo( gizmoRotate ) );\n        this.add( this.gizmo[ 'scale' ] = setupGizmo( gizmoScale ) );\n        this.add( this.picker[ 'translate' ] = setupGizmo( pickerTranslate ) );\n        this.add( this.picker[ 'rotate' ] = setupGizmo( pickerRotate ) );\n        this.add( this.picker[ 'scale' ] = setupGizmo( pickerScale ) );\n        this.add( this.helper[ 'translate' ] = setupGizmo( helperTranslate ) );\n        this.add( this.helper[ 'rotate' ] = setupGizmo( helperRotate ) );\n        this.add( this.helper[ 'scale' ] = setupGizmo( helperScale ) );\n\n        // Pickers should be hidden always\n\n        this.picker[ 'translate' ].visible = false;\n        this.picker[ 'rotate' ].visible = false;\n        this.picker[ 'scale' ].visible = false;\n\n    }\n\n    // updateMatrixWorld will update transformations and appearance of individual handles\n\n    updateMatrixWorld( force ) {\n\n        const isMultiDummy = this.object && this.object.userData && this.object.userData.isMultiSelectDummy;\n        const space = ( this.mode === 'scale' && !isMultiDummy ) ? 'local' : isMultiDummy ? 'world' : this.space;\n\n        const quaternion = ( space === 'local' ) ? this.worldQuaternion : _identityQuaternion;\n\n        // Show only gizmos for current transform mode\n\n        this.gizmo[ 'translate' ].visible = this.mode === 'translate';\n        this.gizmo[ 'rotate' ].visible = this.mode === 'rotate';\n        this.gizmo[ 'scale' ].visible = this.mode === 'scale';\n\n        this.helper[ 'translate' ].visible = this.mode === 'translate';\n        this.helper[ 'rotate' ].visible = this.mode === 'rotate';\n        this.helper[ 'scale' ].visible = this.mode === 'scale';\n\n\n        let handles = [];\n        handles = handles.concat( this.picker[ this.mode ].children );\n        handles = handles.concat( this.gizmo[ this.mode ].children );\n        handles = handles.concat( this.helper[ this.mode ].children );\n\n        for ( let i = 0; i < handles.length; i ++ ) {\n\n            const handle = handles[ i ];\n\n            // hide aligned to camera\n\n            handle.visible = true;\n            handle.rotation.set( 0, 0, 0 );\n            handle.position.copy( this.worldPosition );\n\n            let factor;\n\n            if ( this.camera.isOrthographicCamera ) {\n\n                factor = ( this.camera.top - this.camera.bottom ) / this.camera.zoom;\n\n            } else {\n\n                factor = this.worldPosition.distanceTo( this.cameraPosition ) * Math.min( 1.9 * Math.tan( Math.PI * this.camera.fov / 360 ) / this.camera.zoom, 7 );\n\n            }\n\n            handle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 );\n\n            // TODO: simplify helpers and consider decoupling from gizmo\n\n            if ( handle.tag === 'helper' ) {\n\n                handle.visible = false;\n\n                if ( handle.name === 'AXIS' ) {\n\n                    handle.visible = !! this.axis;\n\n                    if ( this.axis === 'X' ) {\n\n                        _tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, 0 ) );\n                        handle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n                        if ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n                            handle.visible = false;\n\n                        }\n\n                    }\n\n                    if ( this.axis === 'Y' ) {\n\n                        _tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, Math.PI / 2 ) );\n                        handle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n                        if ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n                            handle.visible = false;\n\n                        }\n\n                    }\n\n                    if ( this.axis === 'Z' ) {\n\n                        _tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n                        handle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n                        if ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n                            handle.visible = false;\n\n                        }\n\n                    }\n\n                    if ( this.axis === 'XYZE' ) {\n\n                        _tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n                        _alignVector.copy( this.rotationAxis );\n                        handle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( _zeroVector, _alignVector, _unitY ) );\n                        handle.quaternion.multiply( _tempQuaternion );\n                        handle.visible = this.dragging;\n\n                    }\n\n                    if ( this.axis === 'E' ) {\n\n                        handle.visible = false;\n\n                    }\n\n\n                } else if ( handle.name === 'START' ) {\n\n                    handle.position.copy( this.worldPositionStart );\n                    handle.visible = this.dragging;\n\n                } else if ( handle.name === 'END' ) {\n\n                    handle.position.copy( this.worldPosition );\n                    handle.visible = this.dragging;\n\n                } else if ( handle.name === 'DELTA' ) {\n\n                    handle.position.copy( this.worldPositionStart );\n                    handle.quaternion.copy( this.worldQuaternionStart );\n                    _tempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( - 1 );\n                    _tempVector.applyQuaternion( this.worldQuaternionStart.clone().invert() );\n                    handle.scale.copy( _tempVector );\n                    handle.visible = this.dragging;\n\n                } else {\n\n                    handle.quaternion.copy( quaternion );\n\n                    if ( this.dragging ) {\n\n                        handle.position.copy( this.worldPositionStart );\n\n                    } else {\n\n                        handle.position.copy( this.worldPosition );\n\n                    }\n\n                    if ( this.axis ) {\n\n                        handle.visible = this.axis.search( handle.name ) !== - 1;\n\n                    }\n\n                }\n\n                // If updating helper, skip rest of the loop\n                continue;\n\n            }\n\n            // Align handles to current local or world rotation\n\n            handle.quaternion.copy( quaternion );\n\n            if ( this.mode === 'translate' || this.mode === 'scale' ) {\n\n                // Hide translate and scale axis facing the camera\n\n                const AXIS_HIDE_THRESHOLD = 0.99;\n                const PLANE_HIDE_THRESHOLD = 0.2;\n\n                if ( handle.name === 'X' ) {\n\n                    if ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n                        handle.scale.set( 1e-10, 1e-10, 1e-10 );\n                        handle.visible = false;\n\n                    }\n\n                }\n\n                if ( handle.name === 'Y' ) {\n\n                    if ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n                        handle.scale.set( 1e-10, 1e-10, 1e-10 );\n                        handle.visible = false;\n\n                    }\n\n                }\n\n                if ( handle.name === 'Z' ) {\n\n                    if ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n                        handle.scale.set( 1e-10, 1e-10, 1e-10 );\n                        handle.visible = false;\n\n                    }\n\n                }\n\n                if ( handle.name === 'XY' ) {\n\n                    if ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n                        handle.scale.set( 1e-10, 1e-10, 1e-10 );\n                        handle.visible = false;\n\n                    }\n\n                }\n\n                if ( handle.name === 'YZ' ) {\n\n                    if ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n                        handle.scale.set( 1e-10, 1e-10, 1e-10 );\n                        handle.visible = false;\n\n                    }\n\n                }\n\n                if ( handle.name === 'XZ' ) {\n\n                    if ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n                        handle.scale.set( 1e-10, 1e-10, 1e-10 );\n                        handle.visible = false;\n\n                    }\n\n                }\n\n            } else if ( this.mode === 'rotate' ) {\n\n                // Align handles to current local or world rotation\n\n                _tempQuaternion2.copy( quaternion );\n                _alignVector.copy( this.eye ).applyQuaternion( _tempQuaternion.copy( quaternion ).invert() );\n\n                if ( handle.name.search( 'E' ) !== - 1 ) {\n\n                    handle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( this.eye, _zeroVector, _unitY ) );\n\n                }\n\n                if ( handle.name === 'X' ) {\n\n                    _tempQuaternion.setFromAxisAngle( _unitX, Math.atan2( - _alignVector.y, _alignVector.z ) );\n                    _tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n                    handle.quaternion.copy( _tempQuaternion );\n\n                }\n\n                if ( handle.name === 'Y' ) {\n\n                    _tempQuaternion.setFromAxisAngle( _unitY, Math.atan2( _alignVector.x, _alignVector.z ) );\n                    _tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n                    handle.quaternion.copy( _tempQuaternion );\n\n                }\n\n                if ( handle.name === 'Z' ) {\n\n                    _tempQuaternion.setFromAxisAngle( _unitZ, Math.atan2( _alignVector.y, _alignVector.x ) );\n                    _tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n                    handle.quaternion.copy( _tempQuaternion );\n\n                }\n\n            }\n\n            // Hide disabled axes\n            handle.visible = handle.visible && ( handle.name.indexOf( 'X' ) === - 1 || this.showX );\n            handle.visible = handle.visible && ( handle.name.indexOf( 'Y' ) === - 1 || this.showY );\n            handle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );\n            handle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) );\n\n            // highlight selected axis\n\n            handle.material._color = handle.material._color || handle.material.color.clone();\n            handle.material._opacity = handle.material._opacity || handle.material.opacity;\n\n            handle.material.color.copy( handle.material._color );\n            handle.material.opacity = handle.material._opacity;\n\n            if ( this.enabled && this.axis ) {\n\n                if ( handle.name === this.axis ) {\n\n                    if(handle.material.__color) handle.material.color.setHex( handle.material.__color );\n                    handle.material.opacity = 1.0;\n\n                } else if ( this.axis.split( '' ).some( function ( a ) {\n\n                    return handle.name === a;\n\n                } ) ) {\n\n                    if(handle.material.__color) handle.material.color.setHex( handle.material.__color );\n                    handle.material.opacity = 1.0;\n\n                }\n\n            }\n\n        }\n\n        super.updateMatrixWorld( force );\n\n    }\n\n}\n\n//\n\nclass TransformControlsPlane extends Mesh {\n\n    constructor() {\n\n        super(\n            new PlaneGeometry( 100000, 100000, 2, 2 ),\n            new TransformControls.ObjectConstructors.MeshBasicMaterial( { visible: false, wireframe: true, side: DoubleSide, transparent: true, opacity: 0.1, toneMapped: false, allowOverride: false } )\n        );\n\n        this.isTransformControlsPlane = true;\n\n        this.type = 'TransformControlsPlane';\n\n    }\n\n    updateMatrixWorld( force ) {\n\n        const isMultiDummy2 = this.object && this.object.userData && this.object.userData.isMultiSelectDummy;\n        let space = isMultiDummy2 ? 'world' : this.space;\n\n        this.position.copy( this.worldPosition );\n\n        if ( this.mode === 'scale' && !isMultiDummy2 ) space = 'local'; // scale always oriented to local rotation\n\n        _v1.copy( _unitX ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n        _v2.copy( _unitY ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n        _v3.copy( _unitZ ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\n        // Align the plane for current transform mode, axis and space.\n\n        _alignVector.copy( _v2 );\n\n        switch ( this.mode ) {\n\n            case 'translate':\n            case 'scale':\n                switch ( this.axis ) {\n\n                    case 'X':\n                        _alignVector.copy( this.eye ).cross( _v1 );\n                        _dirVector.copy( _v1 ).cross( _alignVector );\n                        break;\n                    case 'Y':\n                        _alignVector.copy( this.eye ).cross( _v2 );\n                        _dirVector.copy( _v2 ).cross( _alignVector );\n                        break;\n                    case 'Z':\n                        _alignVector.copy( this.eye ).cross( _v3 );\n                        _dirVector.copy( _v3 ).cross( _alignVector );\n                        break;\n                    case 'XY':\n                        _dirVector.copy( _v3 );\n                        break;\n                    case 'YZ':\n                        _dirVector.copy( _v1 );\n                        break;\n                    case 'XZ':\n                        _alignVector.copy( _v3 );\n                        _dirVector.copy( _v2 );\n                        break;\n                    case 'XYZ':\n                    case 'E':\n                        _dirVector.set( 0, 0, 0 );\n                        break;\n\n                }\n\n                break;\n            case 'rotate':\n            default:\n                // special case for rotate\n                _dirVector.set( 0, 0, 0 );\n\n        }\n\n        if ( _dirVector.length() === 0 ) {\n\n            // If in rotate mode, make the plane parallel to camera\n            this.quaternion.copy( this.cameraQuaternion );\n\n        } else {\n\n            _tempMatrix.lookAt( _tempVector.set( 0, 0, 0 ), _dirVector, _alignVector );\n\n            this.quaternion.setFromRotationMatrix( _tempMatrix );\n\n        }\n\n        super.updateMatrixWorld( force );\n\n    }\n\n}\n\nexport { TransformControls, TransformControlsGizmo, TransformControlsPlane };\n","/* eslint-disable */\nimport {\n    BoxGeometry,\n    Camera,\n    CylinderGeometry,\n    Group,\n    LineBasicMaterial,\n    MathUtils,\n    Matrix4,\n    Mesh,\n    Object3DEventMap,\n    MeshBasicMaterial,\n    Object3D,\n    OrthographicCamera,\n    PerspectiveCamera,\n    Plane,\n    Quaternion,\n    Raycaster,\n    Ray,\n    SphereGeometry,\n    TorusGeometry,\n    Vector2,\n    Vector3,\n} from 'three'\n\n// ============================================================================\n// Math helpers (ported from drei)\n// ============================================================================\n\nconst _vec1 = new Vector3()\nconst _vec2 = new Vector3()\n\nfunction calculateOffset(clickPoint: Vector3, normal: Vector3, rayStart: Vector3, rayDir: Vector3): number {\n    const e1 = normal.dot(normal)\n    const e2 = normal.dot(clickPoint) - normal.dot(rayStart)\n    const e3 = normal.dot(rayDir)\n    if (e3 === 0) return -e2 / e1\n    _vec1.copy(rayDir).multiplyScalar(e1 / e3).sub(normal)\n    _vec2.copy(rayDir).multiplyScalar(e2 / e3).add(rayStart).sub(clickPoint)\n    return -_vec1.dot(_vec2) / _vec1.dot(_vec1)\n}\n\n\nfunction decomposeIntoBasis(e1: Vector3, e2: Vector3, offset: Vector3): [number, number] {\n    const i1 = Math.abs(e1.x) >= Math.abs(e1.y) && Math.abs(e1.x) >= Math.abs(e1.z) ? 0\n        : Math.abs(e1.y) >= Math.abs(e1.x) && Math.abs(e1.y) >= Math.abs(e1.z) ? 1 : 2\n    const order = [0, 1, 2].sort((a, b) => Math.abs(e2.getComponent(b)) - Math.abs(e2.getComponent(a)))\n    const i2 = i1 === order[0] ? order[1] : order[0]\n    const a1 = e1.getComponent(i1), a2 = e1.getComponent(i2)\n    const b1 = e2.getComponent(i1), b2 = e2.getComponent(i2)\n    const c1 = offset.getComponent(i1), c2 = offset.getComponent(i2)\n    const y = (c2 - c1 * (a2 / a1)) / (b2 - b1 * (a2 / a1))\n    const x = (c1 - y * b1) / a1\n    return [x, y]\n}\n\n\n// ============================================================================\n// Reusable temps\n// ============================================================================\n\nconst _mL0 = new Matrix4()\nconst _mW0 = new Matrix4()\nconst _mP = new Matrix4()\nconst _mPInv = new Matrix4()\nconst _mW = new Matrix4()\nconst _mL = new Matrix4()\nconst _mL0Inv = new Matrix4()\nconst _mdL = new Matrix4()\nconst _offsetMatrix = new Matrix4()\nconst _rotMatrix = new Matrix4()\nconst _scaleMatrix = new Matrix4()\nconst _pointer = new Vector2()\nconst _worldPos = new Vector3()\nconst _camPos = new Vector3()\nconst _posNew = new Vector3()\n// const _scaleV = new Vector3()\nconst _ray = new Ray()\nconst _intersection = new Vector3()\nconst _upV = new Vector3(0, 1, 0)\nconst _xDir = new Vector3(1, 0, 0)\nconst _yDir = new Vector3(0, 1, 0)\nconst _zDir = new Vector3(0, 0, 1)\n\n// ============================================================================\n// Handle types\n// ============================================================================\n\ntype HandleType = 'arrow' | 'slider' | 'rotator' | 'scaler'\n\ninterface HandleInfo {\n    type: HandleType\n    axis: 0 | 1 | 2\n    gizmoMeshes: Mesh[]      // visible meshes\n    pickerMeshes: Mesh[]     // invisible picker meshes\n    materials: MeshBasicMaterial[]\n    // drag state\n    clickInfo: any\n    extraState: any\n}\n\n// ============================================================================\n// PivotControls\n// ============================================================================\n\nexport interface PivotControlsEventMap {\n    change: {}\n    objectChange: {}\n    mouseDown: { mode: string }\n    mouseUp: { mode: string }\n    'dragging-changed': { value: boolean }\n}\n\n/**\n * PivotControls - A gizmo that shows all transform handles simultaneously\n * (translation arrows, plane sliders, rotation arcs, scaling spheres).\n * Follows the same architecture as TransformControls — single class,\n * mesh-based geometry, ObjectConstructors for material injection.\n */\nexport class PivotControls extends Group<PivotControlsEventMap & Object3DEventMap> {\n\n    static ObjectConstructors: {\n        MeshBasicMaterial: typeof MeshBasicMaterial\n        LineBasicMaterial: typeof LineBasicMaterial\n    } = {\n        MeshBasicMaterial: MeshBasicMaterial,\n        LineBasicMaterial: LineBasicMaterial,\n    }\n\n    camera: Camera\n    domElement: HTMLCanvasElement\n    object: Object3D | undefined\n\n    enabled = true\n    autoTransform = true\n    /** Scale multiplier for the gizmo, same as TransformControls 'size'. Applied per-frame. */\n    gizmoScale = 1.25\n    activeAxes: [boolean, boolean, boolean] = [true, true, true]\n    disableAxes = false\n    disableSliders = false\n    disableRotations = false\n    disableScaling = false\n    translationLimits?: ([number, number] | undefined)[]\n    rotationLimits?: ([number, number] | undefined)[]\n    scaleLimits?: ([number, number] | undefined)[]\n    axisColors: [number, number, number] = [0xEF0065, 0x1EBE00, 0x0093FD]\n    hoveredColor = 0xffff40\n    handleOpacity = 0.95\n    /** Coordinate space for transformations. 'world' or 'local'. */\n    space: 'world' | 'local' = 'world'\n    /** Snap values when shift is held. Set to null to disable snapping for that transform. */\n    translationSnap: number | null = 0.5\n    rotationSnap: number | null = 15 // degrees\n    scaleSnap: number | null = 0.1\n    /** Whether gizmo materials use depth testing. false = always visible through objects. */\n    depthTest = false\n    /** When true, gizmo maintains constant screen size regardless of camera distance (default). */\n    fixed = true\n    /** When true, alt/option+drag on a scale sphere applies uniform scale. */\n    uniformScaleEnabled = true\n    /** Show value annotations during drag. */\n    annotations = true\n\n    private _gizmoGroup: Group\n    private _handles: HandleInfo[] = []\n    private _raycaster = new Raycaster()\n    private _activeHandle: HandleInfo | null = null\n    private _dragging = false\n    private _hoveredHandle: HandleInfo | null = null\n    private _translation: [number, number, number] = [0, 0, 0]\n    private _uniformScaling = false\n    private _annotationEl: HTMLDivElement | null = null\n\n    private _onPointerDown: (e: PointerEvent) => void\n    private _onPointerMove: (e: PointerEvent) => void\n    private _onPointerUp: (e: PointerEvent) => void\n\n    constructor(camera: Camera, domElement: HTMLCanvasElement) {\n        super()\n        this.camera = camera\n        this.domElement = domElement\n\n        this._gizmoGroup = new Group()\n        this.add(this._gizmoGroup)\n\n        this._buildHandles()\n\n        this._onPointerDown = this._handlePointerDown.bind(this)\n        this._onPointerMove = this._handlePointerMove.bind(this)\n        this._onPointerUp = this._handlePointerUp.bind(this)\n\n        domElement.addEventListener('pointerdown', this._onPointerDown)\n        domElement.addEventListener('pointermove', this._onPointerMove)\n        domElement.addEventListener('pointerup', this._onPointerUp)\n\n        this._onKeyDown = this._handleKeyDown.bind(this)\n        window.addEventListener('keydown', this._onKeyDown)\n    }\n\n    // ========================================================================\n    // Keyboard shortcuts (consistent with TransformControls2)\n    // ========================================================================\n\n    private _onKeyDown: (e: KeyboardEvent) => void\n\n    private _handleKeyDown(event: KeyboardEvent): void {\n        if (!this.enabled || !this.object) return\n        if (event.metaKey || event.ctrlKey) return\n        if ((event.target as any)?.tagName === 'TEXTAREA' || (event.target as any)?.tagName === 'INPUT') return\n\n        switch (event.code) {\n\n        case 'KeyQ':\n            this.space = this.space === 'local' ? 'world' : 'local'\n            break\n\n        case 'Equal':\n        case 'NumpadAdd':\n        case 'Plus':\n            this.gizmoScale = this.gizmoScale + 0.1\n            break\n\n        case 'Minus':\n        case 'NumpadSubtract':\n        case 'Underscore':\n            this.gizmoScale = Math.max(this.gizmoScale - 0.1, 0.1)\n            break\n\n        case 'KeyX':\n            this.activeAxes[0] = !this.activeAxes[0]\n            this.updateHandleVisibility()\n            break\n\n        case 'KeyY':\n            this.activeAxes[1] = !this.activeAxes[1]\n            this.updateHandleVisibility()\n            break\n\n        case 'KeyZ':\n            this.activeAxes[2] = !this.activeAxes[2]\n            this.updateHandleVisibility()\n            break\n\n        case 'Space':\n            this.enabled = !this.enabled\n            break\n\n        default:\n            return\n        }\n\n        this.dispatchEvent({type: 'change'})\n    }\n\n    // ========================================================================\n    // Annotation overlay\n    // ========================================================================\n\n    private _ensureAnnotationEl(): HTMLDivElement {\n        if (!this._annotationEl) {\n            const el = document.createElement('div')\n            el.style.cssText = 'position:absolute;pointer-events:none;display:none;' +\n                'background:#151520;color:white;padding:6px 8px;border-radius:7px;' +\n                'white-space:nowrap;z-index:1000;'\n            this.domElement.parentElement?.appendChild(el)\n            this._annotationEl = el\n        }\n        return this._annotationEl\n    }\n\n    private _showAnnotation(text: string, worldPos: Vector3): void {\n        if (!this.annotations) return\n        const el = this._ensureAnnotationEl()\n        el.textContent = text\n        el.style.display = 'block'\n\n        // Project world position to screen\n        const v = worldPos.clone().project(this.camera)\n        const rect = this.domElement.getBoundingClientRect()\n        const x = (v.x * 0.5 + 0.5) * rect.width\n        const y = (-v.y * 0.5 + 0.5) * rect.height\n        el.style.left = (rect.left + x + 12) + 'px'\n        el.style.top = (rect.top + y - 12) + 'px'\n    }\n\n    private _hideAnnotation(): void {\n        if (this._annotationEl) this._annotationEl.style.display = 'none'\n    }\n\n    private _updateAnnotation(h: HandleInfo): void {\n        if (!this.annotations || !this.object) return\n        const axisLabels = ['X', 'Y', 'Z']\n        let text = ''\n        if (h.type === 'arrow') {\n            text = `${axisLabels[h.axis]}: ${this._translation[h.axis].toFixed(2)}`\n        } else if (h.type === 'slider') {\n            const a1 = (h.axis + 1) % 3, a2 = (h.axis + 2) % 3\n            text = `${axisLabels[a1]}: ${this._translation[a1].toFixed(2)}, ${axisLabels[a2]}: ${this._translation[a2].toFixed(2)}`\n        } else if (h.type === 'rotator') {\n            const deg = (h.extraState.angle * 180 / Math.PI).toFixed(0)\n            text = `${axisLabels[h.axis]}: ${deg}°`\n        } else if (h.type === 'scaler') {\n            const label = this._uniformScaling ? 'Uniform' : axisLabels[h.axis]\n            text = `${label}: ${h.extraState.scaleCur.toFixed(2)}`\n        }\n        this._showAnnotation(text, this.position)\n    }\n\n    // ========================================================================\n    // Build gizmo geometry\n    // ========================================================================\n\n    private _buildHandles(): void {\n        this._handles = []\n        this._gizmoGroup.clear()\n\n        const OC = PivotControls.ObjectConstructors\n        // Build geometry at unit scale. gizmoScale is applied in updateGizmoScale() per frame.\n        const s = 1\n\n        const dt = this.depthTest\n\n        const makeMat = (color: number, opacity = this.handleOpacity) => new OC.MeshBasicMaterial({\n            allowOverride: false,\n            depthTest: dt,\n            depthWrite: dt,\n            fog: false,\n            toneMapped: false,\n            transparent: true,\n            color,\n            opacity,\n        })\n\n        const makePickerMat = () => new OC.MeshBasicMaterial({\n            allowOverride: false,\n            depthTest: false,\n            depthWrite: false,\n            fog: false,\n            toneMapped: false,\n            transparent: true,\n            opacity: 0.15,\n            visible: false,\n        })\n\n        const dirs = [_xDir, _yDir, _zDir]\n\n        // --- Axis arrows (translate) ---\n        for (let i = 0; i < 3; i++) {\n            const mat = makeMat(this.axisColors[i])\n            const pMat = makePickerMat()\n\n            // Shaft: thin cylinder\n            const shaftGeom = new CylinderGeometry(0.0075 * s, 0.0075 * s, 0.5 * s, 3)\n            shaftGeom.translate(0, 0.25 * s, 0)\n            const shaft = new Mesh(shaftGeom, mat)\n            shaft.renderOrder = 500\n            shaft.raycast = () => {}\n\n            // Cone tip\n            const coneGeom = new CylinderGeometry(0, 0.04 * s, 0.1 * s, 12)\n            coneGeom.translate(0, 0.05 * s, 0)\n            const cone = new Mesh(coneGeom, mat)\n            cone.position.set(0, 0.5 * s, 0)\n            cone.renderOrder = 500\n            cone.raycast = () => {}\n\n            // Picker\n            const pickerGeom = new CylinderGeometry(0.2 * s, 0, 0.6 * s, 4)\n            pickerGeom.translate(0, 0.3 * s, 0)\n            const picker = new Mesh(pickerGeom, pMat)\n            picker.visible = false\n\n            // Orient along axis direction\n            const q = new Quaternion().setFromUnitVectors(_upV, dirs[i])\n            const group = new Group()\n            group.quaternion.copy(q)\n            group.add(shaft, cone, picker)\n            this._gizmoGroup.add(group)\n\n            const handle: HandleInfo = {\n                type: 'arrow', axis: i as 0|1|2,\n                gizmoMeshes: [shaft, cone], pickerMeshes: [picker],\n                materials: [mat], clickInfo: null, extraState: null,\n            }\n            picker.userData._pivotHandle = handle\n            this._handles.push(handle)\n        }\n\n        // --- Plane sliders (translate on plane) ---\n        // axis 2 = XY plane, axis 1 = XZ plane, axis 0 = YZ plane\n        const sliderDefs: [number, Vector3, Vector3][] = [[2, _xDir, _yDir], [1, _zDir, _xDir], [0, _yDir, _zDir]]\n        for (const [axis, d1, d2] of sliderDefs) {\n            const mat = makeMat(this.axisColors[axis], 0.75)\n            const pMat = makePickerMat()\n\n            const planeSize = 0.2 * s\n            const planeGeom = new BoxGeometry(planeSize, planeSize, 0.01 * s)\n            const planeMesh = new Mesh(planeGeom, mat)\n            planeMesh.renderOrder = 500\n            planeMesh.raycast = () => {}\n\n            const pickerGeom = new BoxGeometry(planeSize * 1.25, planeSize * 1.25, 0.01 * s)\n            const picker = new Mesh(pickerGeom, pMat)\n            picker.visible = false\n\n            // Position offset like TransformControls XY/YZ/XZ\n            const d1n = d1.clone().normalize()\n            const d2n = d2.clone().normalize()\n            const normal = d1n.clone().cross(d2n)\n            const pos = d1n.clone().multiplyScalar(planeSize).add(d2n.clone().multiplyScalar(planeSize))\n\n            const group = new Group()\n            const basis = new Matrix4().makeBasis(d1n, d2n, normal)\n            group.applyMatrix4(basis)\n            group.position.copy(pos)\n            group.add(planeMesh, picker)\n            this._gizmoGroup.add(group)\n\n            const handle: HandleInfo = {\n                type: 'slider', axis: axis as 0|1|2,\n                gizmoMeshes: [planeMesh], pickerMeshes: [picker],\n                materials: [mat], clickInfo: null, extraState: null,\n            }\n            picker.userData._pivotHandle = handle\n            this._handles.push(handle)\n        }\n\n        // --- Axis rotators ---\n        // axis 2 = around Z (XY plane), axis 1 = around Y (XZ plane), axis 0 = around X (YZ plane)\n        const rotatorDefs: [number, Vector3, Vector3][] = [[2, _xDir, _yDir], [1, _zDir, _xDir], [0, _yDir, _zDir]]\n        for (const [axis, d1, d2] of rotatorDefs) {\n            const mat = makeMat(this.axisColors[axis])\n            const pMat = makePickerMat()\n\n            // Visible: quarter torus (like TransformControls CircleGeometry)\n            const r = 0.5 * s\n            const torusGeom = new TorusGeometry(r, 0.0075 * s, 3, 16, Math.PI / 2)\n            const torus = new Mesh(torusGeom, mat)\n            torus.renderOrder = 500\n            torus.raycast = () => {}\n\n            // Picker: thicker quarter torus (like TransformControls CircleGeometry2)\n            const pickerGeom = new TorusGeometry(r, 0.1 * s, 4, 12, Math.PI / 2)\n            const picker = new Mesh(pickerGeom, pMat)\n            picker.visible = false\n\n            const d1n = d1.clone().normalize()\n            const d2n = d2.clone().normalize()\n            const normal = d1n.clone().cross(d2n)\n            const group = new Group()\n            const basis = new Matrix4().makeBasis(d1n, d2n, normal)\n            group.applyMatrix4(basis)\n            group.add(torus, picker)\n            this._gizmoGroup.add(group)\n\n            const handle: HandleInfo = {\n                type: 'rotator', axis: axis as 0|1|2,\n                gizmoMeshes: [torus], pickerMeshes: [picker],\n                materials: [mat], clickInfo: null, extraState: { angle0: 0, angle: 0 },\n            }\n            picker.userData._pivotHandle = handle\n            this._handles.push(handle)\n        }\n\n        // --- Scaling spheres ---\n        for (let i = 0; i < 3; i++) {\n            const mat = makeMat(this.axisColors[i])\n            const r = 0.04 * s\n\n            const sphereGeom = new SphereGeometry(r, 12, 12)\n            const sphere = new Mesh(sphereGeom, mat)\n            sphere.renderOrder = 500\n\n            const q = new Quaternion().setFromUnitVectors(_upV, dirs[i])\n            const group = new Group()\n            group.quaternion.copy(q)\n            // Place sphere at the end of the arrow\n            sphere.position.set(0, 0.6 * s + r, 0)\n            group.add(sphere)\n            this._gizmoGroup.add(group)\n\n            const handle: HandleInfo = {\n                type: 'scaler', axis: i as 0|1|2,\n                gizmoMeshes: [sphere], pickerMeshes: [sphere], // sphere is its own picker\n                materials: [mat], clickInfo: null, extraState: { scale0: 1, scaleCur: 1 },\n            }\n            sphere.userData._pivotHandle = handle\n            this._handles.push(handle)\n        }\n\n        this.updateHandleVisibility()\n\n        this._gizmoGroup.traverse(c => {\n            c.castShadow = false\n            c.receiveShadow = false\n            c.userData.__keepShadowDef = true\n        })\n    }\n\n    updateHandleVisibility(): void {\n        if (!this._handles) return\n        for (const h of this._handles) {\n            let vis = true\n            if (h.type === 'arrow') vis = !this.disableAxes && this.activeAxes[h.axis]\n            else if (h.type === 'scaler') vis = !this.disableScaling && this.activeAxes[h.axis]\n            else if (h.type === 'slider') {\n                // slider axis 2 = XY (needs X,Y active), 1 = XZ (needs X,Z), 0 = YZ (needs Y,Z)\n                const pairs: [number,number][] = [[1,2],[0,2],[0,1]]\n                const [a,b] = pairs[h.axis]\n                vis = !this.disableSliders && this.activeAxes[a] && this.activeAxes[b]\n            } else if (h.type === 'rotator') {\n                const pairs: [number,number][] = [[1,2],[0,2],[0,1]]\n                const [a,b] = pairs[h.axis]\n                vis = !this.disableRotations && this.activeAxes[a] && this.activeAxes[b]\n            }\n            for (const m of h.gizmoMeshes) m.visible = vis\n            for (const m of h.pickerMeshes) {\n                // pickers are always invisible but we toggle their raycast-ability via parent\n                if (m.parent) m.parent.visible = vis\n            }\n        }\n    }\n\n    // ========================================================================\n    // Public API\n    // ========================================================================\n\n    attach(object: Object3D): this {\n        this.object = object\n        this.visible = true\n        this._translation = [0, 0, 0]\n        this.updateHandleVisibility()\n        this.updateMatrixWorld(true)\n        this.dispatchEvent({type: 'change'})\n        return this\n    }\n\n    detach(): this {\n        if (this._dragging) this._endDrag()\n        this.object = undefined\n        this.visible = false\n        this._activeHandle = null\n        this._hideAnnotation()\n        this.dispatchEvent({type: 'change'})\n        return this\n    }\n\n    updateGizmoScale(): void {\n        if (!this.object || !this.visible) return\n\n        this.object.updateWorldMatrix(true, false)\n        const objectWorldPos = new Vector3().setFromMatrixPosition(this.object.matrixWorld)\n        this.position.copy(objectWorldPos)\n\n        // In local space, orient gizmo to match object's world rotation (without scale)\n        // Force world space for multi-select dummy (has no meaningful rotation)\n        if (this.space === 'local' && !this.object.userData?.isMultiSelectDummy) {\n            this.object.matrixWorld.decompose(_worldPos, this.quaternion, _camPos) // _camPos used as temp for scale\n        } else {\n            this.quaternion.identity()\n        }\n\n        if (this.fixed) {\n            // Fixed screen-size scaling (same formula as TransformControls)\n            _worldPos.copy(objectWorldPos)\n            _camPos.setFromMatrixPosition(this.camera.matrixWorld)\n\n            let factor: number\n            if ((this.camera as OrthographicCamera).isOrthographicCamera) {\n                const cam = this.camera as OrthographicCamera\n                factor = (cam.top - cam.bottom) / cam.zoom\n            } else {\n                const cam = this.camera as PerspectiveCamera\n                factor = _worldPos.distanceTo(_camPos) *\n                    Math.min(1.9 * Math.tan(Math.PI * cam.fov / 360) / cam.zoom, 7)\n            }\n            this._gizmoGroup.scale.setScalar(factor * this.gizmoScale / 4)\n        } else {\n            // World-space scale\n            this._gizmoGroup.scale.setScalar(this.gizmoScale)\n        }\n\n        // Visual feedback: enlarge all scale spheres during uniform scaling\n        for (const h of this._handles) {\n            if (h.type === 'scaler') {\n                const scaleFactor = this._uniformScaling ? 1.8 : 1\n                for (const m of h.gizmoMeshes) m.scale.setScalar(scaleFactor)\n            }\n        }\n    }\n\n    rebuild(): void {\n        this._buildHandles()\n    }\n\n    dispose(): void {\n        this.domElement.removeEventListener('pointerdown', this._onPointerDown)\n        this.domElement.removeEventListener('pointermove', this._onPointerMove)\n        this.domElement.removeEventListener('pointerup', this._onPointerUp)\n        window.removeEventListener('keydown', this._onKeyDown)\n        if (this._annotationEl) {\n            this._annotationEl.remove()\n            this._annotationEl = null\n        }\n    }\n\n    // ========================================================================\n    // Pointer handling\n    // ========================================================================\n\n    private _getNDC(event: PointerEvent): Vector2 {\n        const rect = this.domElement.getBoundingClientRect()\n        _pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\n        _pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\n        return _pointer\n    }\n\n    private _getAllPickers(): Object3D[] {\n        const result: Object3D[] = []\n        for (const h of this._handles) {\n            for (const m of h.pickerMeshes) result.push(m)\n        }\n        return result\n    }\n\n    private _findHandle(object: Object3D): HandleInfo | null {\n        let obj: Object3D | null = object\n        while (obj) {\n            if (obj.userData._pivotHandle) return obj.userData._pivotHandle as HandleInfo\n            obj = obj.parent\n        }\n        return null\n    }\n\n    private _handlePointerDown(event: PointerEvent): void {\n        if (!this.enabled || !this.object || !this.visible) return\n\n        this._raycaster.setFromCamera(this._getNDC(event), this.camera)\n        const intersects = this._raycaster.intersectObjects(this._getAllPickers(), true)\n        if (intersects.length === 0) return\n\n        const handle = this._findHandle(intersects[0].object)\n        if (!handle) return\n\n        event.stopPropagation()\n        this._activeHandle = handle\n        this._dragging = true\n\n        _mL0.copy(this.object.matrix)\n        _mW0.copy(this.object.matrixWorld)\n\n        this._onDragStart(handle, intersects[0].point, event)\n        this.domElement.setPointerCapture(event.pointerId)\n\n        this.dispatchEvent({type: 'mouseDown', mode: this._getMode(handle)})\n        this.dispatchEvent({type: 'dragging-changed', value: true})\n    }\n\n    private _handlePointerMove(event: PointerEvent): void {\n        if (!this.enabled || !this.object || !this.visible) return\n\n        this._raycaster.setFromCamera(this._getNDC(event), this.camera)\n\n        if (this._dragging && this._activeHandle) {\n            const deltaWorld = this._onDragMove(this._activeHandle, this._raycaster.ray, event)\n            if (deltaWorld) {\n                this._applyTransform(deltaWorld)\n                this._updateAnnotation(this._activeHandle)\n            }\n        } else {\n            // Hover\n            const intersects = this._raycaster.intersectObjects(this._getAllPickers(), true)\n            const newHover = intersects.length > 0 ? this._findHandle(intersects[0].object) : null\n\n            if (newHover !== this._hoveredHandle) {\n                // Reset old\n                if (this._hoveredHandle) {\n                    for (const mat of this._hoveredHandle.materials)\n                        mat.color.set(this.axisColors[this._hoveredHandle.axis])\n                }\n                // Highlight new\n                if (newHover) {\n                    for (const mat of newHover.materials)\n                        mat.color.set(this.hoveredColor)\n                }\n                this._hoveredHandle = newHover\n                this.dispatchEvent({type: 'change'})\n            }\n        }\n    }\n\n    private _handlePointerUp(event: PointerEvent): void {\n        if (!this._dragging || !this._activeHandle) return\n\n        event.stopPropagation()\n        this.domElement.releasePointerCapture(event.pointerId)\n        this._endDrag()\n    }\n\n    private _endDrag(): void {\n        if (!this._activeHandle) return\n        this._onDragEnd(this._activeHandle)\n        this._hideAnnotation()\n\n        const mode = this._getMode(this._activeHandle)\n        this._activeHandle = null\n        this._dragging = false\n\n        this.dispatchEvent({type: 'mouseUp', mode})\n        this.dispatchEvent({type: 'dragging-changed', value: false})\n    }\n\n    // ========================================================================\n    // Per-handle drag logic\n    // ========================================================================\n\n    private _onDragStart(h: HandleInfo, point: Vector3, _event: PointerEvent): void {\n        const parent = h.gizmoMeshes[0].parent!\n        parent.updateWorldMatrix(true, true)\n\n        if (h.type === 'arrow') {\n            const rotation = new Matrix4().extractRotation(parent.matrixWorld)\n            const dir = _upV.clone().applyMatrix4(rotation).normalize()\n            h.clickInfo = { clickPoint: point.clone(), dir }\n            h.extraState = this._translation[h.axis]\n\n        } else if (h.type === 'slider') {\n            const e1 = new Vector3().setFromMatrixColumn(parent.matrixWorld, 0).normalize()\n            const e2 = new Vector3().setFromMatrixColumn(parent.matrixWorld, 1).normalize()\n            const normal = new Vector3().setFromMatrixColumn(parent.matrixWorld, 2).normalize()\n            const origin = new Vector3().setFromMatrixPosition(parent.matrixWorld)\n            const plane = new Plane().setFromNormalAndCoplanarPoint(normal, origin)\n            h.clickInfo = { clickPoint: point.clone(), e1, e2, plane }\n            h.extraState = {\n                x0: this._translation[(h.axis + 1) % 3],\n                y0: this._translation[(h.axis + 2) % 3],\n            }\n\n        } else if (h.type === 'rotator') {\n            const origin = new Vector3().setFromMatrixPosition(parent.matrixWorld)\n            const normal = new Vector3().setFromMatrixColumn(parent.matrixWorld, 2).normalize()\n            // Compute a perpendicular direction in screen space for linear rotation\n            const eye = new Vector3().setFromMatrixPosition(this.camera.matrixWorld).sub(origin).normalize()\n            const tangent = normal.clone().cross(eye)\n            if (tangent.length() === 0) tangent.copy(eye).cross(_upV) // fallback\n            tangent.normalize()\n            const rotSpeed = 20 / origin.distanceTo(new Vector3().setFromMatrixPosition(this.camera.matrixWorld))\n            h.clickInfo = { clickPoint: point.clone(), origin, normal, tangent, rotSpeed }\n            h.extraState = { angle: 0 }\n\n        } else if (h.type === 'scaler') {\n            const rotation = new Matrix4().extractRotation(parent.matrixWorld)\n            const dir = _upV.clone().applyMatrix4(rotation).normalize()\n            const mPLG = parent.matrixWorld.clone()\n            const mPLGInv = mPLG.clone().invert()\n            h.clickInfo = { clickPoint: point.clone(), dir, mPLG, mPLGInv }\n        }\n    }\n\n    private _onDragMove(h: HandleInfo, ray: Ray, event: PointerEvent): Matrix4 | null {\n        if (!h.clickInfo) return null\n\n        if (h.type === 'arrow') {\n            const { clickPoint, dir } = h.clickInfo\n            const offset0 = h.extraState as number\n            const limits = this.translationLimits?.[h.axis]\n            let offset = calculateOffset(clickPoint, dir, ray.origin, ray.direction)\n            if (event.shiftKey && this.translationSnap !== null) {\n                const snap = this.translationSnap\n                offset = Math.round(offset / snap) * snap\n            }\n            if (limits) {\n                if (limits[0] !== undefined) offset = Math.max(offset, limits[0] - offset0)\n                if (limits[1] !== undefined) offset = Math.min(offset, limits[1] - offset0)\n            }\n            this._translation[h.axis] = offset0 + offset\n            _offsetMatrix.makeTranslation(dir.x * offset, dir.y * offset, dir.z * offset)\n            return _offsetMatrix\n\n        } else if (h.type === 'slider') {\n            const { clickPoint, e1, e2, plane } = h.clickInfo\n            const { x0, y0 } = h.extraState\n\n            _ray.copy(ray)\n            _ray.intersectPlane(plane, _intersection)\n            _ray.direction.negate()\n            _ray.intersectPlane(plane, _intersection)\n            _intersection.sub(clickPoint)\n\n            let [ox, oy] = decomposeIntoBasis(e1, e2, _intersection)\n            if (event.shiftKey && this.translationSnap !== null) {\n                const snap = this.translationSnap\n                ox = Math.round(ox / snap) * snap\n                oy = Math.round(oy / snap) * snap\n            }\n            const limX = this.translationLimits?.[(h.axis + 1) % 3]\n            const limY = this.translationLimits?.[(h.axis + 2) % 3]\n            if (limX) {\n                if (limX[0] !== undefined) ox = Math.max(ox, limX[0] - x0)\n                if (limX[1] !== undefined) ox = Math.min(ox, limX[1] - x0)\n            }\n            if (limY) {\n                if (limY[0] !== undefined) oy = Math.max(oy, limY[0] - y0)\n                if (limY[1] !== undefined) oy = Math.min(oy, limY[1] - y0)\n            }\n            this._translation[(h.axis + 1) % 3] = x0 + ox\n            this._translation[(h.axis + 2) % 3] = y0 + oy\n            _offsetMatrix.makeTranslation(ox * e1.x + oy * e2.x, ox * e1.y + oy * e2.y, ox * e1.z + oy * e2.z)\n            return _offsetMatrix\n\n        } else if (h.type === 'rotator') {\n            const { clickPoint, origin, normal, tangent, rotSpeed } = h.clickInfo\n            const limits = this.rotationLimits?.[h.axis] as [number,number] | undefined\n\n            // Linear rotation: project ray-plane intersection offset onto tangent direction\n            // This gives continuous rotation without atan2 wrapping (same approach as TransformControls)\n            const plane = new Plane().setFromNormalAndCoplanarPoint(normal, origin)\n            _ray.copy(ray)\n            if (!_ray.intersectPlane(plane, _intersection)) {\n                _ray.direction.negate()\n                _ray.intersectPlane(plane, _intersection)\n            }\n            _intersection.sub(clickPoint)\n            let da = _intersection.dot(tangent) * rotSpeed\n\n            if (event.shiftKey && this.rotationSnap !== null) {\n                const snapRad = this.rotationSnap * Math.PI / 180\n                da = Math.round(da / snapRad) * snapRad\n            }\n            if (limits) {\n                da = MathUtils.clamp(da, limits[0], limits[1])\n            }\n            h.extraState.angle = da\n\n            _rotMatrix.makeRotationAxis(normal, da)\n            _posNew.copy(origin).applyMatrix4(_rotMatrix).sub(origin).negate()\n            _rotMatrix.setPosition(_posNew)\n            return _rotMatrix\n\n        } else if (h.type === 'scaler') {\n            const { clickPoint, dir, mPLG, mPLGInv } = h.clickInfo\n            const limits = this.scaleLimits?.[h.axis] as [number,number] | undefined\n\n            const offsetW = calculateOffset(clickPoint, dir, ray.origin, ray.direction)\n            let upscale = Math.pow(2, offsetW * 0.2)\n\n            // Shift = snap, Alt = uniform scale\n            if (event.shiftKey && this.scaleSnap !== null) {\n                upscale = Math.round(upscale / this.scaleSnap) * this.scaleSnap\n                if (upscale === 0) upscale = this.scaleSnap\n            }\n            const isUniform = this.uniformScaleEnabled && event.altKey\n            this._uniformScaling = isUniform\n\n            const min = limits ? limits[0] : 1e-5\n            upscale = Math.max(upscale, min / h.extraState.scale0)\n            if (limits && limits[1] !== undefined) upscale = Math.min(upscale, limits[1] / h.extraState.scale0)\n            h.extraState.scaleCur = h.extraState.scale0 * upscale\n\n            if (isUniform) {\n                // Uniform scale: apply same factor to all axes\n                _scaleMatrix.makeScale(upscale, upscale, upscale)\n            } else {\n                // Single-axis scale in the handle's local space (local Y = world axis direction)\n                _scaleMatrix.makeScale(1, upscale, 1).premultiply(mPLG).multiply(mPLGInv)\n            }\n            return _scaleMatrix\n        }\n\n        return null\n    }\n\n    private _onDragEnd(h: HandleInfo): void {\n        if (h.type === 'rotator') h.extraState.angle0 = h.extraState.angle\n        if (h.type === 'scaler') h.extraState.scale0 = h.extraState.scaleCur\n        this._uniformScaling = false\n        h.clickInfo = null\n    }\n\n    // ========================================================================\n    // Transform application (drei matrix math)\n    // ========================================================================\n\n    private _applyTransform(mdW: Matrix4): void {\n        if (!this.object) return\n        if (this.object.parent) {\n            _mP.copy(this.object.parent.matrixWorld)\n        } else {\n            _mP.identity()\n        }\n        _mPInv.copy(_mP).invert()\n        _mW.copy(_mW0).premultiply(mdW)\n        _mL.copy(_mW).premultiply(_mPInv)\n        _mL0Inv.copy(_mL0).invert()\n        _mdL.copy(_mL).multiply(_mL0Inv)\n\n        if (this.autoTransform) {\n            this.object.matrix.copy(_mL)\n            this.object.matrix.decompose(this.object.position, this.object.quaternion, this.object.scale)\n        }\n        this.dispatchEvent({type: 'objectChange'})\n        this.dispatchEvent({type: 'change'})\n    }\n\n    private _getMode(h: HandleInfo): string {\n        if (h.type === 'arrow' || h.type === 'slider') return 'translate'\n        if (h.type === 'rotator') return 'rotate'\n        if (h.type === 'scaler') return 'scale'\n        return 'unknown'\n    }\n}\n","import {EventDispatcher, MathUtils, Object3D, Spherical, Vector3} from 'three'\nimport {IEvent, now, serialize} from 'ts-browser-helpers'\nimport {uiInput, uiPanelContainer, uiToggle} from 'uiconfig.js'\nimport {ICameraControls, ICameraControlsEventMap} from '../../core'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _lookDirection = new Vector3()\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _spherical = new Spherical()\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _target = new Vector3()\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _changeEvent: IEvent<'change'> = {type: 'change'}\n\n// todo bug - this is not showing in the UI. To test, switch to threeFirstPerson controlsMode for Default Camera in the tweakpane editor\n@uiPanelContainer('First Person Controls')\nexport class FirstPersonControls2 extends EventDispatcher<ICameraControlsEventMap> implements ICameraControls {\n    readonly object: Object3D\n    readonly domElement: HTMLElement | Document\n\n    // API\n    @serialize() @uiToggle() enabled = true\n    @serialize() @uiToggle() enableKeys = true\n\n    @serialize() @uiInput() movementSpeed = 1.0\n    @serialize() @uiInput() lookSpeed = 0.005\n\n    @serialize() @uiToggle() lookVertical = true\n    @serialize() @uiToggle() autoForward = false\n\n    @serialize() @uiToggle() activeLook = true\n\n    @serialize() @uiToggle() heightSpeed = false\n    @serialize() @uiInput() heightCoef = 1.0\n    @serialize() @uiInput() heightMin = 0.0\n    @serialize() @uiInput() heightMax = 1.0\n\n    @serialize() @uiToggle() constrainVertical = false\n    @serialize() @uiInput() verticalMin = 0\n    @serialize() @uiInput() verticalMax = Math.PI\n\n    @serialize() @uiToggle() mouseDragOn = false\n\n    // internals\n\n    autoSpeedFactor = 0.0\n\n    pointerX = 0\n    pointerY = 0\n\n    moveForward = false\n    moveBackward = false\n    moveLeft = false\n    moveRight = false\n    moveUp = false\n    moveDown = false\n\n    viewHalfX = 0\n    viewHalfY = 0\n\n    // private variables\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    private lat = 0\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    private lon = 0\n\n    constructor(object: Object3D, domElement: HTMLElement|Document) {\n        super()\n\n        this.object = object\n        this.domElement = domElement\n\n        this.onPointerMove = this.onPointerMove.bind(this)\n        this.onPointerDown = this.onPointerDown.bind(this)\n        this.onPointerUp = this.onPointerUp.bind(this)\n        this.onKeyDown = this.onKeyDown.bind(this)\n        this.onKeyUp = this.onKeyUp.bind(this)\n        this.onContextMenu = this.onContextMenu.bind(this)\n\n        this.domElement.addEventListener('contextmenu', this.onContextMenu)\n        ;(this.domElement as HTMLElement).addEventListener('pointermove', this.onPointerMove)\n        ;(this.domElement as HTMLElement).addEventListener('pointerdown', this.onPointerDown)\n        ;(this.domElement as HTMLElement).addEventListener('pointerup', this.onPointerUp)\n\n        window.addEventListener('keydown', this.onKeyDown)\n        window.addEventListener('keyup', this.onKeyUp)\n\n        this.handleResize()\n\n        this.setOrientation()\n\n    }\n\n    setOrientation() {\n\n        const quaternion = this.object.quaternion\n\n        _lookDirection.set(0, 0, -1).applyQuaternion(quaternion)\n        _spherical.setFromVector3(_lookDirection)\n\n        this.lat = 90 - MathUtils.radToDeg(_spherical.phi)\n        this.lon = MathUtils.radToDeg(_spherical.theta)\n\n    }\n\n    handleResize() {\n\n        if (this.domElement === document) {\n\n            this.viewHalfX = window.innerWidth / 2\n            this.viewHalfY = window.innerHeight / 2\n\n        } else {\n\n            this.viewHalfX = (this.domElement as HTMLElement).offsetWidth / 2\n            this.viewHalfY = (this.domElement as HTMLElement).offsetHeight / 2\n\n        }\n\n    }\n\n    onPointerDown(event: PointerEvent) {\n\n        if (this.domElement !== document) {\n\n            (this.domElement as HTMLElement).focus()\n\n        }\n\n        if (this.activeLook) {\n\n            switch (event.button) {\n\n            case 0: this.moveForward = true; break\n            case 2: this.moveBackward = true; break\n            default: break\n\n            }\n\n        }\n\n        this.mouseDragOn = true\n\n    }\n\n    onPointerUp(event: PointerEvent) {\n\n        if (this.activeLook) {\n\n            switch (event.button) {\n\n            case 0: this.moveForward = false; break\n            case 2: this.moveBackward = false; break\n            default: break\n\n            }\n\n        }\n\n        this.mouseDragOn = false\n\n    }\n\n    onPointerMove(event: PointerEvent) {\n\n        if (this.domElement === document) {\n\n            this.pointerX = event.pageX - this.viewHalfX\n            this.pointerY = event.pageY - this.viewHalfY\n\n        } else {\n\n            this.pointerX = event.pageX - (this.domElement as HTMLElement).offsetLeft - this.viewHalfX\n            this.pointerY = event.pageY - (this.domElement as HTMLElement).offsetTop - this.viewHalfY\n\n        }\n\n    }\n\n    onKeyDown(event: KeyboardEvent) {\n        if (!this.enableKeys) return\n\n        switch (event.code) {\n\n        case 'ArrowUp':\n        case 'KeyW': this.moveForward = true; break\n\n        case 'ArrowLeft':\n        case 'KeyA': this.moveLeft = true; break\n\n        case 'ArrowDown':\n        case 'KeyS': this.moveBackward = true; break\n\n        case 'ArrowRight':\n        case 'KeyD': this.moveRight = true; break\n\n        case 'KeyR': this.moveUp = true; break\n        case 'KeyF': this.moveDown = true; break\n\n        default: break\n\n        }\n\n    }\n\n    onKeyUp(event: KeyboardEvent) {\n        if (!this.enableKeys) return\n\n        switch (event.code) {\n\n        case 'ArrowUp':\n        case 'KeyW': this.moveForward = false; break\n\n        case 'ArrowLeft':\n        case 'KeyA': this.moveLeft = false; break\n\n        case 'ArrowDown':\n        case 'KeyS': this.moveBackward = false; break\n\n        case 'ArrowRight':\n        case 'KeyD': this.moveRight = false; break\n\n        case 'KeyR': this.moveUp = false; break\n        case 'KeyF': this.moveDown = false; break\n\n        default: break\n\n        }\n\n    }\n\n    lookAt(x: number|Vector3, y?: number, z?: number) {\n\n        if ((x as Vector3).isVector3) {\n\n            _target.copy(x as Vector3)\n\n        } else {\n\n            if (y === undefined || z === undefined) console.error('FirstPersonControls2.lookAt: y and z parameters are required')\n            else _target.set(x as number, y, z)\n\n        }\n\n        this.object.lookAt(_target)\n\n        this.setOrientation()\n\n        return this\n\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    private targetPosition = new Vector3()\n\n    private _lastTime = -1 // in ms\n\n    update() {\n        const time = now() // in ms\n        const delta = (this._lastTime < 0 ? 16 : Math.min(time - this._lastTime, 1000)) / 1000 // in secs\n        this._lastTime = time\n        // console.log(delta)\n\n        if (!this.enabled) return\n\n        if (this.heightSpeed) {\n\n            const y = MathUtils.clamp(this.object.position.y, this.heightMin, this.heightMax)\n            const heightDelta = y - this.heightMin\n\n            this.autoSpeedFactor = delta * (heightDelta * this.heightCoef)\n\n        } else {\n\n            this.autoSpeedFactor = 0.0\n\n        }\n\n        const actualMoveSpeed = delta * this.movementSpeed\n\n        if (this.moveForward || this.autoForward && !this.moveBackward) this.object.translateZ(-(actualMoveSpeed + this.autoSpeedFactor))\n        if (this.moveBackward) this.object.translateZ(actualMoveSpeed)\n\n        if (this.moveLeft) this.object.translateX(-actualMoveSpeed)\n        if (this.moveRight) this.object.translateX(actualMoveSpeed)\n\n        if (this.moveUp) this.object.translateY(actualMoveSpeed)\n        if (this.moveDown) this.object.translateY(-actualMoveSpeed)\n\n        let actualLookSpeed = delta * this.lookSpeed\n\n        if (!this.activeLook) {\n\n            actualLookSpeed = 0\n\n        }\n\n        let verticalLookRatio = 1\n\n        if (this.constrainVertical) {\n\n            verticalLookRatio = Math.PI / (this.verticalMax - this.verticalMin)\n\n        }\n\n        this.lon -= this.pointerX * actualLookSpeed\n        if (this.lookVertical) this.lat -= this.pointerY * actualLookSpeed * verticalLookRatio\n\n        this.lat = Math.max(-85, Math.min(85, this.lat))\n\n        let phi = MathUtils.degToRad(90 - this.lat)\n        const theta = MathUtils.degToRad(this.lon)\n\n        if (this.constrainVertical) {\n\n            phi = MathUtils.mapLinear(phi, 0, Math.PI, this.verticalMin, this.verticalMax)\n\n        }\n\n        const position = this.object.position\n\n        this.targetPosition.setFromSphericalCoords(1, phi, theta).add(position)\n\n        this.object.lookAt(this.targetPosition)\n        this.dispatchEvent(_changeEvent)\n\n    }\n\n    dispose() {\n\n        this.domElement.removeEventListener('contextmenu', this.onContextMenu)\n        ;(this.domElement as HTMLElement).removeEventListener('pointerdown', this.onPointerDown)\n        ;(this.domElement as HTMLElement).removeEventListener('pointermove', this.onPointerMove)\n        ;(this.domElement as HTMLElement).removeEventListener('pointerup', this.onPointerUp)\n\n        window.removeEventListener('keydown', this.onKeyDown)\n        window.removeEventListener('keyup', this.onKeyUp)\n\n    }\n\n    onContextMenu(event: Event) {\n        if (!this.enableKeys) return\n\n        event.preventDefault()\n\n    }\n\n}\n\n","import {Euler, EventDispatcher, Object3D, Vector3} from 'three'\nimport {serialize} from 'ts-browser-helpers'\nimport {uiInput, uiPanelContainer, uiToggle} from 'uiconfig.js'\nimport {ICameraControls} from '../../core'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _euler = new Euler(0, 0, 0, 'YXZ')\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _vector = new Vector3()\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _changeEvent = {type: 'change'} as const\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _lockEvent = {type: 'lock'} as const\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _unlockEvent = {type: 'unlock'} as const\n\nexport interface PointerLockControls2EventMap {\n    change: Record<string, unknown>\n    lock: Record<string, unknown>\n    unlock: Record<string, unknown>\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _PI_2 = Math.PI / 2\n\n\n@uiPanelContainer('Pointer Lock Controls')\nexport class PointerLockControls2 extends EventDispatcher<PointerLockControls2EventMap> implements ICameraControls<PointerLockControls2EventMap> {\n    readonly domElement: HTMLElement\n    readonly object: Object3D\n    isLocked = false\n\n    @uiToggle() @serialize() enabled = true\n\n    // Set to constrain the pitch of the camera\n    // Range is 0 to Math.PI radians\n    @uiInput() @serialize() minPolarAngle = 0 // radians\n    @uiInput() @serialize() maxPolarAngle = Math.PI // radians\n\n    @uiInput() @serialize() pointerSpeed = 1.0\n\n    @uiToggle() @serialize() autoLockOnClick = true\n\n    constructor(camera: Object3D, domElement: HTMLElement) {\n\n        super()\n\n        this.domElement = domElement\n        this.object = camera\n        this.onElementClick = this.onElementClick.bind(this)\n        this.onMouseMove = this.onMouseMove.bind(this)\n        this.onPointerlockChange = this.onPointerlockChange.bind(this)\n        this.onPointerlockError = this.onPointerlockError.bind(this)\n\n        this.connect()\n    }\n\n\n    onElementClick(event: Event) {\n\n        if (this.isLocked) return\n        if (!this.autoLockOnClick) return\n\n        event.preventDefault()\n\n        this.lock()\n    }\n\n    private _movementX = 0\n    private _movementY = 0\n\n    onMouseMove(event: MouseEvent) {\n\n        if (!this.isLocked) return\n\n        this._movementX += event.movementX || (event as any).mozMovementX || (event as any).webkitMovementX || 0\n        this._movementY += event.movementY || (event as any).mozMovementY || (event as any).webkitMovementY || 0\n\n    }\n\n    onPointerlockChange() {\n\n        if (this.domElement.ownerDocument.pointerLockElement === this.domElement) {\n\n            this.dispatchEvent(_lockEvent)\n\n            this.isLocked = true\n\n        } else {\n\n            this.dispatchEvent(_unlockEvent)\n\n            this.isLocked = false\n\n        }\n\n    }\n\n    onPointerlockError() {\n\n        console.error('THREE.PointerLockControls: Unable to use Pointer Lock API')\n\n    }\n\n    connect() {\n\n        this.domElement.ownerDocument.addEventListener('mousemove', this.onMouseMove)\n        this.domElement.ownerDocument.addEventListener('pointerlockchange', this.onPointerlockChange)\n        this.domElement.ownerDocument.addEventListener('pointerlockerror', this.onPointerlockError)\n        this.domElement.addEventListener('click', this.onElementClick)\n\n    }\n\n    disconnect() {\n\n        this.domElement.ownerDocument.removeEventListener('mousemove', this.onMouseMove)\n        this.domElement.ownerDocument.removeEventListener('pointerlockchange', this.onPointerlockChange)\n        this.domElement.ownerDocument.removeEventListener('pointerlockerror', this.onPointerlockError)\n        this.domElement.removeEventListener('click', this.onElementClick)\n\n    }\n\n    dispose() {\n\n        this.disconnect()\n\n    }\n\n    // getObject() { // retaining this method for backward compatibility\n    //\n    //     return this.object\n    //\n    // }\n\n\n    private _forwardDirection = new Vector3(0, 0, -1)\n    getDirection(v: Vector3) {\n\n        return v.copy(this._forwardDirection).applyQuaternion(this.object.quaternion)\n\n    }\n\n    moveForward(distance: number) {\n\n        // move forward parallel to the xz-plane\n        // assumes camera.up is y-up\n\n        _vector.setFromMatrixColumn(this.object.matrix, 0)\n\n        _vector.crossVectors(this.object.up, _vector)\n\n        this.object.position.addScaledVector(_vector, distance)\n\n    }\n\n    moveRight(distance: number) {\n\n        _vector.setFromMatrixColumn(this.object.matrix, 0)\n\n        this.object.position.addScaledVector(_vector, distance)\n\n    }\n\n    lock() {\n\n        this.domElement.requestPointerLock()\n\n    }\n\n    unlock() {\n\n        this.domElement.ownerDocument.exitPointerLock()\n\n    }\n\n    update() {\n\n        if (Math.abs(this._movementX) < 0.0001 && Math.abs(this._movementY) < 0.0001) return\n\n        _euler.setFromQuaternion(this.object.quaternion)\n\n        _euler.y -= this._movementX * 0.002 * this.pointerSpeed\n        _euler.x -= this._movementY * 0.002 * this.pointerSpeed\n\n        this._movementX = 0\n        this._movementY = 0\n\n        _euler.x = Math.max(_PI_2 - this.maxPolarAngle, Math.min(_PI_2 - this.minPolarAngle, _euler.x))\n\n        this.object.quaternion.setFromEuler(_euler)\n\n        this.dispatchEvent(_changeEvent)\n\n    }\n\n}\n","import {Euler, EulerOrder, EventDispatcher, MathUtils, Object3D, Quaternion, Vector3} from 'three'\nimport {IEvent, now, serialize} from 'ts-browser-helpers'\nimport {uiButton, uiPanelContainer, uiSlider} from 'uiconfig.js'\nimport type {ICameraControls, ICameraControlsEventMap} from '../../core'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _zee = new Vector3(0, 0, 1)\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _euler = new Euler()\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _q0 = new Quaternion()\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _q1 = new Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5)) // - PI/2 around the x-axis\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _q2 = new Quaternion() // - PI/2 around the x-axis\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _changeEvent: IEvent<'change'> = {type: 'change'}\n\nconst EPS = 0.000001\n\n@uiPanelContainer('Device Orientation Controls')\nexport class DeviceOrientationControls2 extends EventDispatcher<ICameraControlsEventMap> implements ICameraControls {\n    object: Object3D\n    enabled = false // do not serialize this as it signifies weather this is active.\n    deviceOrientation?: DeviceOrientationEvent\n    screenOrientation?: ScreenOrientation\n    lastOrder: EulerOrder = 'XYZ'\n    @serialize()\n    @uiSlider('Damping', [0, 1], 0.01)\n        dampingFactor = 0.05\n    lastQuaternion = new Quaternion()\n\n    constructor(object: Object3D) {\n\n        super()\n\n        if (window.isSecureContext === false) {\n\n            console.error('DeviceOrientationControls2: DeviceOrientationEvent is only available in secure contexts (https)')\n\n        }\n\n        this.object = object\n\n        this.lastOrder = this.object.rotation.order\n        this.object.rotation.reorder('YXZ')\n\n        // this.enabled = true\n\n        this.connect()\n\n    }\n\n    onDeviceOrientationChangeEvent = (event: DeviceOrientationEvent) => {\n        this.deviceOrientation = event\n    }\n\n    onScreenOrientationChangeEvent = () => {\n        this.screenOrientation = screen.orientation\n    }\n\n    private _initQuaternion = new Quaternion()\n    private _initQuaternionInvert = new Quaternion()\n    private _initQuaternionDest = new Quaternion()\n\n    @uiButton('Reset View')\n    resetView() {\n        (this._initQuaternionDest as any).__init = false\n    }\n\n    @uiButton()\n    connect() {\n        if (this.enabled) return\n\n        this.onScreenOrientationChangeEvent() // run once on load\n\n        // iOS 13+\n\n        if (window.DeviceOrientationEvent !== undefined && typeof (window.DeviceOrientationEvent as any).requestPermission === 'function') {\n\n            (window.DeviceOrientationEvent as any).requestPermission().then((response: string)=>{\n\n                if (response == 'granted') {\n\n                    window.addEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n                    window.addEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n\n                }\n\n            }).catch((error: any)=>{\n\n                console.error('DeviceOrientationControls2: Unable to use DeviceOrientation API:', error)\n\n            })\n\n        } else {\n\n            window.addEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n            window.addEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n\n        }\n\n        this.enabled = true\n        this._initQuaternion.copy(this.object.quaternion)\n        this._initQuaternionInvert.copy(this.object.quaternion).invert()\n\n    }\n\n    @uiButton()\n    disconnect() {\n        if (!this.enabled) return\n\n        window.removeEventListener('orientationchange', this.onScreenOrientationChangeEvent)\n        window.removeEventListener('deviceorientation', this.onDeviceOrientationChangeEvent)\n        this._initQuaternion.identity()\n        this._initQuaternionInvert.identity()\n        this._initQuaternionDest = new Quaternion() // need to set a new instance here.\n        this.object.rotation.reorder(this.lastOrder)\n        this.lastOrder = 'XYZ'\n\n        this.enabled = false\n\n    }\n\n    update() {\n\n        if (!this.enabled) return\n\n        const device = this.deviceOrientation\n\n        if (device) {\n\n            const alpha = device.alpha !== null ? MathUtils.degToRad(device.alpha) : 0 // Z\n\n            const beta = device.beta !== null ? MathUtils.degToRad(device.beta) : 0 // X'\n\n            const gamma = device.gamma !== null ? MathUtils.degToRad(device.gamma) : 0 // Y''\n\n            const orient = this.screenOrientation ? MathUtils.degToRad(this.screenOrientation.angle) : 0 // O\n\n            this.setObjectQuaternion(alpha, beta, gamma, orient)\n\n            if (8 * (1 - this.lastQuaternion.dot(this.object.quaternion)) > EPS) {\n\n                this.lastQuaternion.copy(this.object.quaternion)\n                this.dispatchEvent(_changeEvent)\n\n            }\n\n        }\n\n    }\n\n    dispose() {\n\n        this.disconnect()\n\n    }\n\n    private _lastTime = -1\n\n    // The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\n    setObjectQuaternion(alpha: number, beta: number, gamma: number, orient: number): void {\n        // if(_lastTime < 0)\n        const time = now() / 1000\n\n        _euler.set(beta, alpha, -gamma, 'YXZ') // 'ZXY' for the device, but 'YXZ' for us\n\n        _q2.setFromEuler(_euler) // orient the device\n\n        _q2.multiply(_q1) // camera looks out the back of the device, not the top\n\n        _q2.multiply(_q0.setFromAxisAngle(_zee, -orient)) // adjust for screen orientation\n\n        // debugger\n        if (!(this._initQuaternionDest as any).__init) {\n            this._initQuaternionDest.copy(_q2).invert()\n            ;(this._initQuaternionDest as any).__init = true\n        }\n\n        _q2.premultiply(this._initQuaternionDest)\n\n        const mTime = 1 / 60\n        this.object.quaternion.multiply(this._initQuaternionInvert)\n        this.object.quaternion.slerp(_q2, this.dampingFactor / (Math.min(1, time - this._lastTime) / mTime))\n        this.object.quaternion.multiply(this._initQuaternion)\n        // console.log(time - this._lastTime, mTime)\n\n        this._lastTime = time\n    }\n\n}\n","import {Camera, PerspectiveCamera, Vector3} from 'three'\nimport {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js'\n\nconst offset2 = new Vector3()\nconst targetDeltaX = new Vector3()\nconst targetDeltaY = new Vector3()\nconst targetDeltaZ = new Vector3()\nconst targetDelta = new Vector3()\nconst panOffset2 = new Vector3()\nlet scaleOffset = 1\nconst upVec = new Vector3(0, 1, 0)\n\nexport class OrbitControls2 extends OrbitControls {\n\n    throttleUpdate = 60\n    constructor(object: Camera, domElement: HTMLElement) {\n        super(object, domElement)\n        const sup = this.update\n        this.update = ()=>this._update(sup)\n    }\n\n    readonly targetOffset = new Vector3(0, 0, 0)\n\n    private _update(sup: ()=>boolean): boolean {\n\n        this.target.add(this.targetOffset)\n\n        offset2.copy(this.object.position).sub(this.target)\n\n        scaleOffset = offset2.length()\n\n        panOffset2.copy(this.target)\n\n        const ret = sup()\n\n        panOffset2.sub(this.target) // get the panOffset of this frame from OrbitControls\n\n        // if (panOffset2.length() > 0.0001)\n        //     console.log(panOffset2.toArray())\n\n        // console.log(offset2.clone().normalize().cross(upVec))\n\n        offset2.copy(this.object.position).sub(this.target)\n\n        // panOffset2.multiplyScalar(-1)\n\n        // panOffset3.x = panOffset3.z\n        // console.log(panOffset3.z)\n\n        scaleOffset /= offset2.length()\n\n        this.target.add(panOffset2)\n\n        this.object.position.copy(this.target).add(offset2)\n\n        offset2.normalize()\n\n        targetDeltaX.crossVectors(upVec, offset2).normalize()\n        targetDeltaY.crossVectors(offset2, targetDeltaX).normalize()\n        targetDeltaZ.crossVectors(targetDeltaX, targetDeltaY).normalize().negate()\n\n        if (targetDeltaX.length() > 0.1) // check if not 0\n            this.object.up.crossVectors(offset2.clone().normalize(), targetDeltaX)\n\n        if (this.enablePan) {\n            targetDelta.set(0, 0, 0)\n                .addScaledVector(targetDeltaX, panOffset2.x)\n                .addScaledVector(targetDeltaY, panOffset2.y)\n                .addScaledVector(targetDeltaZ, panOffset2.z)\n            this.targetOffset.add(targetDelta)\n            this.targetOffset.multiplyScalar(1. / scaleOffset)\n        }\n\n        targetDelta.set(0, 0, 0)\n            .addScaledVector(targetDeltaX, -this.targetOffset.x)\n            .addScaledVector(targetDeltaY, -this.targetOffset.y)\n            .addScaledVector(targetDeltaZ, -this.targetOffset.z)\n\n        // console.log(targetDelta)\n        this.object.lookAt(targetDelta.add(this.target))\n\n        this.object.updateMatrixWorld()\n        if ((this.object as PerspectiveCamera).isCamera) {\n            (this.object as PerspectiveCamera).updateProjectionMatrix()\n        }\n\n        this.target.sub(this.targetOffset)\n\n        return ret\n    }\n}\n","import {Box2, Box3, BufferGeometry, Camera, Mesh, Object3D, Vector3} from 'three'\nimport type {IObject3D} from '../../core'\n\nexport class Box3B extends Box3 {\n    private static _box = new Box3B()\n    private _vector = new Vector3()\n\n    expandByObject(object: Object3D|IObject3D, precise = false, ignoreInvisible = false, ignoreObject?: (obj: Object3D)=>boolean): this {\n        if (object.userData?.bboxVisible === false) return this\n        if (!object.visible && ignoreInvisible) return this\n        if (ignoreObject && ignoreObject(object)) return this\n\n        // copied the whole function from three.js to pass in ignoreInvisible. add else block to support custom computeBoundingBox without BufferGeometry\n\n        // Computes the world-axis-aligned bounding box of an object (including its children),\n        // accounting for both the object's, and children's, world transforms\n\n        object.updateWorldMatrix(false, false)\n\n        const geometry = (object as IObject3D).geometry\n\n        if (geometry !== undefined) {\n\n            const positionAttribute = geometry.getAttribute('position')\n\n            // precise AABB computation based on vertex data requires at least a position attribute.\n            // instancing isn't supported so far and uses the normal (conservative) code path.\n\n            if (precise === true && positionAttribute !== undefined && Object.getPrototypeOf(geometry).computeBoundingBox === BufferGeometry.prototype.computeBoundingBox) {\n\n                for (let i = 0, l = positionAttribute.count; i < l; i++) {\n\n                    if ((object as Mesh).isMesh === true) {\n\n                        (object as Mesh).getVertexPosition(i, this._vector)\n\n                    } else {\n\n                        this._vector.fromBufferAttribute(positionAttribute, i)\n\n                    }\n\n                    this._vector.applyMatrix4(object.matrixWorld)\n                    this.expandByPoint(this._vector)\n\n                }\n\n            } else {\n\n                if ((object as IObject3D).boundingBox !== undefined) {\n\n                    // object-level bounding box\n\n                    if ((precise || (object as IObject3D).boundingBox === null) && typeof (object as IObject3D).computeBoundingBox === 'function') {\n\n                        // @ts-expect-error why?\n                        (object as IObject3D).computeBoundingBox()\n\n                    }\n\n                    // _box.copy(object.boundingBox)\n                    if ((object as IObject3D).boundingBox !== null) {\n\n                        Box3B._box.copy((object as IObject3D).boundingBox!)\n                        Box3B._box.applyMatrix4(object.matrixWorld)\n\n                        this.union(Box3B._box)\n\n                    } else {\n                        console.warn('Box3B - Unable to compute bounds for', object)\n                    }\n\n\n                } else {\n\n                    // geometry-level bounding box\n\n                    if (geometry.boundingBox === null) {\n\n                        geometry.computeBoundingBox()\n\n                    }\n\n                    if (geometry.boundingBox) {\n                        Box3B._box.copy(geometry.boundingBox)\n                        Box3B._box.applyMatrix4(object.matrixWorld)\n\n                        this.union(Box3B._box)\n                    } else {\n                        console.warn('Box3B - Unable to compute bounds for', object, geometry)\n                    }\n\n                }\n\n            }\n\n        } else if ((object as IObject3D).boundingBox !== undefined) {\n\n            // object-level bounding box\n\n            if ((precise || (object as IObject3D).boundingBox === null) && typeof (object as IObject3D).computeBoundingBox === 'function') {\n\n                // @ts-expect-error why?\n                (object as IObject3D).computeBoundingBox()\n\n            }\n\n            // _box.copy(object.boundingBox)\n            if ((object as IObject3D).boundingBox !== null) {\n\n                Box3B._box.copy((object as IObject3D).boundingBox!)\n                Box3B._box.applyMatrix4(object.matrixWorld)\n\n                this.union(Box3B._box)\n\n            } else {\n                console.warn('Box3B - Unable to compute bounds for', object)\n            }\n\n\n        }\n\n        const children = object.children\n\n        for (let i = 0, l = children.length; i < l; i++) {\n\n            this.expandByObject(children[ i ], precise, ignoreInvisible)\n\n        }\n\n        return this\n    }\n\n    expandByObjects(objects: (Object3D|IObject3D)[], precise = false, ignoreInvisible = false): this {\n        for (let i = 0, l = objects.length; i < l; i++) this.expandByObject(objects[i], precise, ignoreInvisible)\n        return this\n    }\n    /**\n     * Get corner points.\n     */\n    getPoints(): Vector3[] {\n        return [\n            new Vector3(this.min.x, this.min.y, this.min.z), // 000\n            new Vector3(this.min.x, this.min.y, this.max.z), // 001\n            new Vector3(this.min.x, this.max.y, this.min.z), // 010\n            new Vector3(this.min.x, this.max.y, this.max.z), // 011\n            new Vector3(this.max.x, this.min.y, this.min.z), // 100\n            new Vector3(this.max.x, this.min.y, this.max.z), // 101\n            new Vector3(this.max.x, this.max.y, this.min.z), // 110\n            new Vector3(this.max.x, this.max.y, this.max.z), // 111\n        ]\n    }\n\n    getScreenSpaceBounds(camera: Camera): Box2 {\n        const vertices = this.getPoints()\n        const box = new Box2()\n        for (const vertex of vertices) {\n            const vertexScreenSpace = vertex.project(camera)\n            box.min.min(vertexScreenSpace as any)\n            box.max.max(vertexScreenSpace as any)\n        }\n        return box\n    }\n\n}\n","import {Box2, BufferAttribute, Camera, InterleavedBufferAttribute, Mesh, Object3D, Vector2, Vector3} from 'three'\n\nexport function computeScreenSpaceBoundingBox(obj: Object3D, camera: Camera) {\n    let min: Vector2|undefined\n    let max: Vector2|undefined\n\n    // Is this an array of objects?\n    if (Array.isArray(obj)) {\n        for (const oo of obj) {\n            const box2 = computeScreenSpaceBoundingBox(oo, camera)\n            if (min === undefined || max === undefined) {\n                min = box2.min.clone()\n                max = box2.max.clone()\n            } else {\n                min.min(box2.min)\n                max.max(box2.max)\n            }\n        }\n    }\n\n    // Does this object have geometry?\n    const mesh = obj as Mesh\n    if (mesh.geometry !== undefined) {\n        const vertices = (mesh.geometry as any).vertices // legacy Geometry support\n        if (vertices === undefined\n            && mesh.geometry.attributes !== undefined\n            && 'position' in mesh.geometry.attributes) {\n            // Buffered geometry\n            const vertex = new Vector3()\n            const pos = mesh.geometry.attributes.position as any as BufferAttribute | InterleavedBufferAttribute\n            for (let i = 0; i < pos.count * pos.itemSize; i += pos.itemSize) {\n                vertex.set(pos.array[i], pos.array[i + 1], pos.array[1 + 2])\n                const vertexWorldCoord = vertex.applyMatrix4(obj.matrixWorld)\n                const vertexScreenSpace = vertexWorldCoord.project(camera)\n                const vertexScreenSpaced = new Vector2(vertexScreenSpace.x, vertexScreenSpace.y)\n                if (min === undefined || max === undefined) {\n                    min = vertexScreenSpaced.clone()\n                    max = vertexScreenSpaced.clone()\n                } else {\n                    min.min(vertexScreenSpaced)\n                    max.max(vertexScreenSpaced)\n                }\n            }\n        } else {\n            // legacy Geometry support\n            for (const vertex of vertices) {\n                const vertexWorldCoord = vertex.clone().applyMatrix4(obj.matrixWorld)\n                const vertexScreenSpace = vertexWorldCoord.project(camera)\n                const vertexScreenSpaced = new Vector2(vertexScreenSpace.x, vertexScreenSpace.y)\n                if (min === undefined || max === undefined) {\n                    min = vertexScreenSpaced.clone()\n                    max = vertexScreenSpaced.clone()\n                } else {\n                    min.min(vertexScreenSpaced)\n                    max.max(vertexScreenSpaced)\n                }\n            }\n        }\n    }\n\n    // Does this object have children?\n    if (obj.children !== undefined) {\n        for (const oo of obj.children) {\n            const box2 = computeScreenSpaceBoundingBox(oo, camera)\n            if (min === undefined || max === undefined) {\n                min = box2.min.clone()\n                max = box2.max.clone()\n            } else {\n                min.min(box2.min)\n                max.max(box2.max)\n            }\n        }\n    }\n\n    return new Box2(min, max)\n}\n","import {Cache as threeCache} from 'three'\n\nexport function overrideThreeCache(storage?: Cache | Storage) {\n    if ((threeCache as any)._orig) {\n        if ((threeCache as any)._storage) {\n            if ((threeCache as any)._storage === storage) return\n            Object.assign(threeCache, (threeCache as any)._orig)\n            delete (threeCache as any)._orig\n            delete (threeCache as any)._storage\n        }\n    }\n    const oldCache = {...threeCache}\n    ;(threeCache as any)._orig = oldCache\n    ;(threeCache as any)._storage = storage\n    threeCache.get = (url: string, responseType?: string, mimeType?: DOMParserSupportedType): Promise<any> | any => {\n        if (!responseType) return oldCache.get(url)\n        if (url.startsWith('data:') || url.startsWith('blob') || url.startsWith('chrome-extension')) return Promise.resolve(undefined)\n        return (storage as Cache|undefined)?.match(url).then(async response => {\n            if (!response) return undefined\n            switch (responseType) {\n            case 'arraybuffer':\n                return response.arrayBuffer()\n            case 'blob':\n                return response.blob()\n            case 'document':\n                return response.text()\n                    .then(text => {\n                        const parser = new DOMParser()\n                        return parser.parseFromString(text, mimeType ?? 'text/html')\n                    })\n            case 'json':\n                return response.json()\n            default:\n                if (mimeType === undefined) {\n                    return response.text()\n                } else {\n                    // sniff encoding\n                    const re = /charset=\"?([^;\"\\s]*)\"?/i\n                    const exec = re.exec(mimeType)\n                    const label = exec && exec[1] ? exec[1].toLowerCase() : undefined\n                    const decoder = new TextDecoder(label)\n                    return response.arrayBuffer().then(ab => decoder.decode(ab))\n                }\n            }\n        })\n    }\n    threeCache.add = async(url: string, data: BodyInit, responseType?: string) => {\n        if (!responseType) return oldCache.add(url, data)\n        if (url.startsWith('data:') || url.startsWith('blob') || url.startsWith('chrome-extension') || url.startsWith('asset://')) return\n        // noinspection JSIgnoredPromiseFromCall\n        if (await storage?.match(url)) await storage?.delete(url)\n        // todo this can throw - Request scheme 'x' is unsupported, check if scheme is supported\n        await storage?.put(url, new Response(data, {status: 200})).catch((e: any)=>{console.warn(e)})\n    }\n    threeCache.remove = (url: string, responseType?: string) => {\n        if (!responseType) return oldCache.remove(url)\n        // noinspection JSIgnoredPromiseFromCall\n        storage?.delete(url)\n    }\n}\n","import {Color, DataTexture, DataUtils, LinearSRGBColorSpace, RGBAFormat, UnsignedByteType, Vector4} from 'three'\n\n/**\n * Returns a 1x1 DataTexture from a `Color` object, in `LinearSRGBColorSpace`\n * @param color\n */\nexport function dataTextureFromColor(color: Color) {\n    const dataTexture = new DataTexture(new Uint8Array([Math.floor(color.r * 255), Math.floor(color.g * 255), Math.floor(color.b * 255), 255]), 1, 1, RGBAFormat, UnsignedByteType)\n    dataTexture.needsUpdate = true\n    dataTexture.colorSpace = LinearSRGBColorSpace\n    return dataTexture\n}\n\n/**\n * Returns a 1x1 DataTexture from a `Vector4` color, in `LinearSRGBColorSpace`.\n * This can be used to create a solid color with alpha to set on a material or the scene background.\n * @param color\n */\nexport function dataTextureFromVec4(color: Vector4) {\n    const dataTexture = new DataTexture(new Uint8Array([Math.floor(color.x * 255), Math.floor(color.y * 255), Math.floor(color.z * 255), Math.floor(color.w * 255)]), 1, 1, RGBAFormat, UnsignedByteType)\n    dataTexture.needsUpdate = true\n    dataTexture.colorSpace = LinearSRGBColorSpace\n    return dataTexture\n}\n\n/**\n * Convert half float buffer to rgbe\n * adapted from https://github.com/enkimute/hdrpng.js/blob/3a62b3ae2940189777df9f669df5ece3e78d9c16/hdrpng.js#L235\n * channels = 4 for RGBA data or 3 for RGB data. buffer from THREE.DataTexture\n * @param buffer\n * @param channels\n * @param res\n */\nexport function halfFloatToRgbe(buffer: Uint16Array, channels = 3, res?: Uint8ClampedArray): Uint8ClampedArray {\n    let r, g, b, v, s\n    const l = buffer.byteLength / (channels * 2) | 0\n    res = res || new Uint8ClampedArray(l * 4)\n    for (let i = 0;i < l;i++) {\n        r = DataUtils.fromHalfFloat(buffer[i * channels]) * 65504\n        g = DataUtils.fromHalfFloat(buffer[i * channels + 1]) * 65504\n        b = DataUtils.fromHalfFloat(buffer[i * channels + 2]) * 65504\n        v = Math.max(Math.max(r, g), b)\n        const e = Math.ceil(Math.log2(v)); s = Math.pow(2, e - 8)\n        res[i * 4] = r / s | 0\n        res[i * 4 + 1] = g / s | 0\n        res[i * 4 + 2] = b / s | 0\n        res[i * 4 + 3] = e + 128\n    }\n    return res\n}\n","import {FnCaller, getOrCall, objectHasOwn, safeSetProperty, ValOrArr, ValOrFunc} from 'ts-browser-helpers'\n\n/**\n *\n * @param uniforms - object for setting uniform value (like ShaderMaterial.uniforms\n * @param propKey - uniform name\n * @param thisTarget - if `this` is the uniform (because uniforms = this wont work). It also adds _ in front of the name\n */\nexport function uniform({uniforms, propKey, thisTarget = false, onChange}: {uniforms?: any, propKey?: string|symbol, thisTarget?:boolean, onChange?: (...args: any[]) => any} = {}): PropertyDecorator {\n    // backing up properties as values are different when called again, no idea why.\n    const cUniforms = !!uniforms\n    const cPropKey = !!propKey\n    const isThis = thisTarget\n\n    return (targetPrototype: any, propertyKey: string|symbol, descriptor?: TypedPropertyDescriptor<any>) => {\n        const getUniform = (target: any)=>{\n            const uniforms1 = isThis ? target : cUniforms ? uniforms : target.uniforms || target._uniforms || target.extraUniforms\n            let propKey1 = cPropKey ? propKey : propertyKey\n            if (isThis) propKey1 = '_' + (propKey1 as string)\n            let a = uniforms1[propKey1!]\n            if (!a) {\n                a = {value: null}\n                uniforms1[propKey1!] = a\n            }\n            return a\n        }\n        const prop = {\n            get() {\n                return getUniform(this).value\n            },\n            set(newVal: any) {\n                const u = getUniform(this)\n                const val = u.value\n                if (val === newVal) return\n                u.value = newVal\n                safeSetProperty(this, 'uniformsNeedUpdate', true, true)\n                onChange && FnCaller.callFunction(onChange, this, [propertyKey, newVal])\n            },\n            // configurable: true,\n            // enumerable: true,\n        } as any\n        // https://github.com/babel/babel/blob/909ed3473968c2ccd75f89e17c37ef4771cc3ff8/packages/babel-helpers/src/helpers/applyDecoratedDescriptor.ts#L11\n        if (descriptor) {\n            if (objectHasOwn(descriptor, 'value')) delete descriptor.value\n            if (objectHasOwn(descriptor, 'writable')) delete descriptor.writable\n            // @ts-expect-error not in ts? old prop?\n            if (objectHasOwn(descriptor, 'initializer')) delete (descriptor as any).initializer\n            return Object.assign(descriptor, prop)\n        }\n        Object.defineProperty(targetPrototype, propertyKey, prop)\n    }\n}\n\n// todo migrate to new decorators - https://2ality.com/2022/10/javascript-decorators.html\n/**\n * Decorator to create a three.js style define in this.material or this and bind to a property.\n * see also - {@link matDefineBool}\n * @param key - define name\n * @param customDefines - object for setting define value (like ShaderMaterial.defines), otherwise this.material.defines is taken\n * @param thisMat - access this.defines instead of this.material.defines\n * @param onChange - function to call when the value changes. The function is called with the following parameters: [key, newVal]. Note: needsUpdate is set to true for this/material if onChange is not provided.\n * @param processVal - function that processes the value before setting it.\n * @param invProcessVal - function that processes the value before returning it.\n */\nexport function matDefine(key?: string|symbol, customDefines?: any, thisMat = false, onChange?: (...args: any[]) => any, processVal?: (newVal: any)=>any, invProcessVal?: (val:any)=>any): PropertyDecorator {\n    // backing up properties as values are different when called again, no idea why.\n    const cDefines = !!customDefines\n    const cPropKey = !!key\n\n    return (targetPrototype: any, propertyKey: string|symbol, descriptor?: TypedPropertyDescriptor<any>) => {\n        const getTarget = (mat: any)=>{\n            const t = cDefines ? customDefines : mat.defines || mat._defines || mat.extraDefines\n            const p = cPropKey ? key : propertyKey\n            return {t, p}\n        }\n        const prop = {\n            get() {\n                const {t, p} = getTarget(thisMat ? this : this.material)\n                let res = t[p]\n                if (invProcessVal) res = invProcessVal(res)\n                return res\n            },\n            set(newVal: any) {\n                const {t, p} = getTarget(thisMat ? this : this.material)\n                if (processVal) newVal = processVal(newVal)\n                // boolean values are supported in material extender.\n                // else if (typeof newVal === 'boolean') { // just in case\n                //     console.error('Boolean values are not supported for defines. Use @matDefineBool instead.')\n                //     newVal = newVal ? '1' : '0'\n                // }\n                safeSetProperty(t, p, newVal, true)\n                if (newVal === undefined) delete t[p]\n                if (onChange && typeof onChange === 'function') {\n                    FnCaller.callFunction(onChange, this, [p, newVal])\n                } else {\n                    safeSetProperty(thisMat ? this : this.material, 'needsUpdate', true, true)\n                }\n            },\n            // configurable: true,\n            // enumerable: true,\n        } as any\n        // https://github.com/babel/babel/blob/909ed3473968c2ccd75f89e17c37ef4771cc3ff8/packages/babel-helpers/src/helpers/applyDecoratedDescriptor.ts#L11\n        if (descriptor) {\n            if (objectHasOwn(descriptor, 'value')) delete descriptor.value\n            if (objectHasOwn(descriptor, 'writable')) delete descriptor.writable\n            // @ts-expect-error not in ts? old prop?\n            if (objectHasOwn(descriptor, 'initializer')) delete (descriptor as any).initializer\n            return Object.assign(descriptor, prop)\n        }\n        Object.defineProperty(targetPrototype, propertyKey, prop)\n    }\n}\n\n/**\n * Same as {@link matDefine} but for boolean values. It sets the value to '1' or '0'/undefined.\n * @param key - define name\n * @param customDefines - object for setting define value (like ShaderMaterial.defines), otherwise this.material.defines is taken\n * @param thisMat - access this.defines instead of this.material.defines\n * @param onChange - function to call when the value changes. If a string, it is used as a property name in `this` and called. If a function, it is called. The function is called with the following parameters: key, newVal\n * @param deleteOnFalse - sets to undefined instead of '0' when false. Note deleteOnFalse doesn't work with tweakpane ui because the value will be undefined.\n */\nexport function matDefineBool(key?: string|symbol, customDefines?: any, thisMat = false, onChange?: (...args: any[]) => any, deleteOnFalse = false): PropertyDecorator {\n    // noinspection RedundantConditionalExpressionJS\n    return matDefine(key, customDefines, thisMat, onChange, (v: any)=>v ? '1' : deleteOnFalse ? undefined : '0', (v: any|undefined)=>v && v !== '0' ? true : false)\n}\n\n/**\n * Binds a property to a value in an object. If the object is a string, it is used as a property name in `this`.\n *\n * @param obj - object to bind to. If a string, it is used as a property name in `this`. If a function, it is called and the result is used as the object/string.\n * @param key - key to bind to. If a string, it is used as a property name in `this`. If a function, it is called and the result is used as the key/string.\n * @param onChange - function to call when the value changes. If a string, it is used as a property name in `this` and called. If a function, it is called. The function is called with the following parameters: key, newVal\n * @param onChangeParams - if true, the parameters passed to the onChange function are [key, newVal]. If false, no parameters are passed. Default = `true`\n * @param processVal - function that processes the value before setting it.\n * @param invProcessVal - function that processes the value before returning it.\n * @param allowUndefined - if `false` - when setting the value to `undefined`, the property will be `delete`d. (this could throw an error if it cant be deleted, set to `true` then).\n */\nexport function bindToValue({obj, key, processVal, invProcessVal, onChange, onChangeParams = true, allowUndefined = false}: {obj?: ValOrFunc<any>, key?: ValOrFunc<ValOrArr<string | symbol>>, onChange?: ((...args: any[]) => any)|string, processVal?: (newVal: any) => any, invProcessVal?: (val: any) => any, onChangeParams?: boolean, allowUndefined?: boolean}): PropertyDecorator {\n    const cPropKey = !!key\n\n    return (targetPrototype: any, propertyKey: string|symbol, descriptor?: TypedPropertyDescriptor<any>) => {\n        const getTarget = (_this: any)=>{\n            let t = getOrCall(obj) || _this\n            if (typeof t === 'string') t = _this[t]\n            let p1 = cPropKey ? getOrCall(key) || propertyKey : propertyKey\n            let p: string|symbol\n            if (Array.isArray(p1)) {\n                while (p1.length > 1 && t && typeof t === 'object') {\n                    t = t[p1[0]]\n                    p1 = p1.slice(1)\n                }\n                p = p1.length ? p1[0] : propertyKey\n            } else p = p1\n            return {t, p: p}\n        }\n        const prop = {\n            get() {\n                const {t, p} = getTarget(this)\n                if (!t || typeof t !== 'object') return\n                let res = t[p]\n                if (invProcessVal) res = invProcessVal(res)\n                return res\n            },\n            set(newVal: any) {\n                const {t, p} = getTarget(this)\n                if (!t || typeof t !== 'object') return\n                if (processVal) newVal = processVal(newVal)\n                const r = safeSetProperty(t, p, newVal, true)\n                if (r && newVal === undefined && !allowUndefined) delete t[p]\n                let oc = onChange\n                if (oc && (typeof oc === 'string' || typeof oc === 'symbol')) oc = this[oc] // todo just call it here directly\n                if (oc && typeof oc === 'function') FnCaller.callFunction(oc, this, onChangeParams ? [p, newVal] : [])\n            },\n            // configurable: true,\n            // enumerable: true,\n        } as any\n        // https://github.com/babel/babel/blob/909ed3473968c2ccd75f89e17c37ef4771cc3ff8/packages/babel-helpers/src/helpers/applyDecoratedDescriptor.ts#L11\n        if (descriptor) {\n            if (objectHasOwn(descriptor, 'value')) delete descriptor.value\n            if (objectHasOwn(descriptor, 'writable')) delete descriptor.writable\n            // @ts-expect-error not in ts? old prop?\n            if (objectHasOwn(descriptor, 'initializer')) delete (descriptor as any).initializer\n            return Object.assign(descriptor, prop)\n        }\n        Object.defineProperty(targetPrototype, propertyKey, prop)\n    }\n}\n","import {ColorSpace, LinearSRGBColorSpace, NoColorSpace, RGBM16ColorSpace, SRGBColorSpace} from 'three'\n\n// three.js WebGLProgram.js\nexport function getTexelDecodingFunction(functionName: string, colorSpace: ColorSpace) {\n\n    let fn\n    switch (colorSpace) {\n\n    case NoColorSpace:\n    case LinearSRGBColorSpace:\n        fn = ''\n        break\n    case SRGBColorSpace:\n        // fn = 'sRGBToLinear' // todo required?\n        fn = ''\n        break\n    case RGBM16ColorSpace:\n        fn = 'RGBM16ToLinear'\n        break\n    default:\n        console.warn('THREE.WebGLProgram: Unsupported color space:', colorSpace)\n        fn = ''\n        break\n\n    }\n\n    // return `vec4 ${functionName}( vec4 value ) { return ${components[ 0 ]}ToLinear${components[ 1 ]}; }`;\n    // return `vec4 ${functionName}( vec4 value ) { return ${fn} ( value ); }`\n    return `#define ${functionName}( value ) ${fn} ( value )`\n\n}\n\nexport function getTexelDecoding(mapName: string, colorSpace?: ColorSpace) {\n\n    return getTexelDecodingFunction(mapName + 'TexelToLinear', colorSpace ?? LinearSRGBColorSpace) + '\\n'\n\n}\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param  {Array<BufferGeometry>} geometries\n * @param  {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '.  .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\tconst doHash = tolerance > 0; // disable merging if tolerance is 0 or negative\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new BufferAttribute(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\tif ( morphAttr ) {\n\n\t\t\ttmpMorphAttributes[ name ] = new BufferAttribute(\n\t\t\t\tnew morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize ),\n\t\t\t\tmorphAttr.itemSize,\n\t\t\t\tmorphAttr.normalized\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l && doHash; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( doHash && hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newarray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewarray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttr ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttr.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttr[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( doHash )\n\t\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new BufferAttribute(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new BufferAttribute(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\n\nfunction mergeBufferGeometries( geometries, useGroups = false ) {\n\n\tconsole.warn( 'THREE.BufferGeometryUtils: mergeBufferGeometries() has been renamed to mergeGeometries().' ); // @deprecated, r151\n\treturn mergeGeometries( geometries, useGroups );\n\n}\n\nfunction mergeBufferAttributes( attributes ) {\n\n\tconsole.warn( 'THREE.BufferGeometryUtils: mergeBufferAttributes() has been renamed to mergeAttributes().' ); // @deprecated, r151\n\treturn mergeAttributes( attributes );\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals,\n\tmergeBufferGeometries,\n\tmergeBufferAttributes,\n};\n","import {BufferGeometry, MathUtils, Object3D, Quaternion} from 'three'\nimport {mergeVertices} from 'three/examples/jsm/utils/BufferGeometryUtils.js'\nimport {IGeometry, IMaterial, IObject3D, IScene, ITexture} from '../../core'\nimport {deepAccessObject} from 'ts-browser-helpers'\n\n/**\n * Convert geometry to BufferGeometry with indexed attributes.\n */\nexport function toIndexedGeometry<T extends BufferGeometry<any, any> = BufferGeometry<any, any>>(geometry: T, tolerance = -1): T {\n    return mergeVertices(geometry, tolerance) as T\n}\n\nexport function generateUUID() {\n    return MathUtils.generateUUID()\n}\n\n/**\n * Check if a single or multiple object/geometry/material/texture is in the scene.\n * This is used internally to check if a material is used by any object in the scene, and if not, it can be disposed.\n * @param sceneObj\n */\nexport function isInScene(...sceneObj: (IGeometry|IMaterial|IObject3D|ITexture)[]): boolean {\n    if (sceneObj.length > 1) return sceneObj.some((a)=>isInScene(a))\n    const o = sceneObj[0]\n    if ((<ITexture>o).isTexture) return Array.from((<ITexture>o).appliedObjects || []).some((m) => isInScene(m)) ?? false\n\n    const objects =\n        (<IObject3D>o).isObject3D ? [<IObject3D>o] :\n            (<IGeometry|IMaterial>o).appliedMeshes\n    for (const obj of objects) {\n        let inScene = false\n        obj.traverseAncestors((ob: IObject3D) => (<IScene>ob).isScene && (inScene = true))\n        if (inScene) return true\n    }\n    return false\n}\n\n/**\n * Convert a world-space quaternion to local-space quaternion.\n * https://github.com/mrdoob/three.js/pull/20243\n * @param object\n * @param quaternion\n * @param _q\n */\nexport function worldToLocalQuaternion(object: Object3D, quaternion: Quaternion, _q = new Quaternion()) {\n    return quaternion.premultiply(object.getWorldQuaternion(_q).invert())\n}\n\n/**\n * Convert a local-space quaternion to world-space quaternion.\n * https://github.com/mrdoob/three.js/pull/20243\n * @param object\n * @param quaternion\n * @param _q\n */\nexport function localToWorldQuaternion(object: Object3D, quaternion: Quaternion, _q = new Quaternion()) {\n    return quaternion.premultiply(object.getWorldQuaternion(_q))\n}\n\n/**\n * Check if a texture/map exists at a given property of an object/material.\n * @param prop\n * @param object\n * @param maps\n * @param deep\n */\nexport function checkTexMapReference(prop: string, object: IObject3D|IMaterial|IObject3D['userData']|IMaterial['userData'], maps: Map<string, ITexture>, deep = false) {\n    const val = deep ?\n        deepAccessObject(prop, object, false) :\n        prop in object ? (object as any)[prop] : undefined\n    if (val && val.isTexture) {\n        maps.set(prop, val)\n    }\n}\n","import {\n    ColorSpace,\n    DataTexture,\n    DataUtils,\n    FloatType,\n    HalfFloatType,\n    LinearSRGBColorSpace,\n    Texture, TextureImageData,\n    TextureDataType,\n    UnsignedByteType,\n    WebGLRenderer,\n} from 'three'\nimport {canvasFlipY, LinearToSRGB} from 'ts-browser-helpers'\n\nexport function getTextureDataType(renderer?: WebGLRenderer): TextureDataType {\n    if (!renderer) return UnsignedByteType\n    const halfFloatSupport = renderer.extensions.has('EXT_color_buffer_half_float') || renderer.capabilities.isWebGL2 && renderer.extensions.has('EXT_color_buffer_float')\n    const floatSupport = renderer.capabilities.isWebGL2 || renderer.extensions.has('OES_texture_float') || renderer.extensions.has('WEBGL_color_buffer_float')\n    return halfFloatSupport ? HalfFloatType : floatSupport ? FloatType : UnsignedByteType\n}\n\nexport function textureDataToImageData(imgData: TextureImageData | ImageData | {data: Float32Array|Uint16Array|Uint8Array, width: number, height: number}, colorSpace?: ColorSpace, outData?: ImageData) {\n    const data = outData?.data ?? new Uint8ClampedArray(imgData.height * imgData.width * 4)\n    const isFloat32 = imgData.data instanceof Float32Array\n    const isUint16 = imgData.data instanceof Uint16Array\n\n    for (let i = 0; i < data.length; i++) {\n\n        if (isFloat32) { // Float32\n            data[i] = imgData.data[i] * 255\n        } else if (isUint16) { // Uint16 (half float)\n            data[i] = DataUtils.fromHalfFloat(imgData.data[i]) * 255\n        } else { // Uint8\n            data[i] = imgData.data[i]\n        }\n\n        if (colorSpace === LinearSRGBColorSpace) {\n            data[i] = LinearToSRGB(data[i] / 255.0) * 255\n        }\n        // todo: rgbm?\n\n    }\n    return outData ?? new ImageData(data, imgData.width, imgData.height)\n}\n\n/**\n *\n * @param texture\n * @param maxWidth\n * @param flipY\n * @param canvas\n */\nexport function textureToCanvas(texture: Texture|DataTexture, maxWidth: number, flipY = false) {\n    let img\n    if ((texture as DataTexture).isDataTexture) img = textureDataToImageData(texture.image, texture.colorSpace)\n    else img = texture.image\n    return texImageToCanvas(img, maxWidth, flipY)\n}\n\nexport function texImageToCanvas(image: TexImageSource, maxWidth: number, flipY = false) {\n    let width, height\n    if (!window.VideoFrame) window.VideoFrame = HTMLVideoElement as any\n    if (image instanceof window.VideoFrame) {\n        width = image.displayWidth\n        height = image.displayHeight\n    } else {\n        width = image.width || (image as HTMLVideoElement).videoWidth || (image as HTMLImageElement).naturalWidth || 1\n        height = image.height || (image as HTMLVideoElement).videoHeight || (image as HTMLImageElement).naturalHeight || 1\n    }\n    if (window.VideoFrame as any === HTMLVideoElement) delete (window as any).VideoFrame\n    const canvas = document.createElement('canvas')\n    // resize it to the size of our image\n    canvas.width = Math.min(maxWidth, width)\n    canvas.height = Math.floor(1.0 + canvas.width * height / width)\n\n    const ctx = canvas.getContext('2d')\n    if (!ctx) {\n        console.error('textureToDataUrl: could not get canvas context')\n        return canvas\n    }\n\n    if (flipY === true) {\n\n        ctx.translate(0, canvas.height)\n        ctx.scale(1, -1)\n\n    }\n\n    let needsFlipY = false\n    if ((image as ImageData).data !== undefined) { // THREE.DataTexture\n        const imageData = image as ImageData\n\n        if (width !== canvas.width || height !== canvas.height) {\n            const tempCanvas = document.createElement('canvas')\n            tempCanvas.width = width\n            tempCanvas.height = height\n            const tempCtx = tempCanvas.getContext('2d')\n            if (!tempCtx) {\n                console.error('textureToDataUrl: could not get temp canvas context')\n                ctx.putImageData(imageData, 0, 0)\n            } else {\n                tempCtx.putImageData(imageData, 0, 0) // for resize\n                ctx.drawImage(tempCanvas, 0, 0, canvas.width, canvas.height)\n            }\n        } else {\n            ctx.putImageData(imageData, 0, 0)\n            if (flipY) needsFlipY = true // because of putImageData\n        }\n\n    } else {\n        ctx.drawImage(image as any, 0, 0, canvas.width, canvas.height)\n    }\n    return !needsFlipY ? canvas : canvasFlipY(canvas)\n}\n\nexport function textureToDataUrl(texture: Texture|DataTexture, maxWidth: number, flipY: boolean, mimeType?: string, quality?: number) {\n    return textureToCanvas(texture, maxWidth, flipY).toDataURL(mimeType, quality)\n}\nexport async function textureToBlob(texture: Texture|DataTexture, maxWidth: number, flipY: boolean, mimeType?: string, quality?: number) {\n    const canvas = textureToCanvas(texture, maxWidth, flipY)\n    return new Promise<Blob>((resolve, reject) => {\n        canvas.toBlob(blob => {\n            if (blob) resolve(blob)\n            else reject(new Error('Failed to create blob'))\n        }, mimeType, quality)\n    })\n}\n","import {\n    AdditiveBlending,\n    AnyMapping,\n    BasicDepthPacking,\n    Blending,\n    ByteType,\n    ColorSpace,\n    CubeReflectionMapping,\n    CubeUVReflectionMapping,\n    CustomBlending,\n    DepthPackingStrategies,\n    DisplayP3ColorSpace,\n    EquirectangularReflectionMapping,\n    FloatType,\n    HalfFloatType,\n    IntType,\n    LinearSRGBColorSpace,\n    MultiplyBlending,\n    NoBlending,\n    NormalBlending,\n    RGBADepthPacking,\n    RGBM16ColorSpace,\n    ShortType,\n    SRGBColorSpace,\n    SubtractiveBlending,\n    TextureDataType,\n    UnsignedByteType,\n    UnsignedInt248Type,\n    UnsignedIntType,\n    UnsignedShort4444Type,\n    UnsignedShort5551Type,\n    UnsignedShortType,\n    UVMapping,\n} from 'three'\nimport {UiObjectConfig} from 'uiconfig.js'\n\nconst blending: Record<string, Blending> = {\n    None: NoBlending,\n    Normal: NormalBlending,\n    Additive: AdditiveBlending,\n    Subtractive: SubtractiveBlending,\n    Multiply: MultiplyBlending,\n    Custom: CustomBlending,\n}\n\nconst mapping: Record<string, AnyMapping> = {\n    UV: UVMapping,\n    Cube: CubeReflectionMapping,\n    // CubeRefraction: CubeRefractionMapping,\n    CubeUV: CubeUVReflectionMapping,\n    Equirectangular: EquirectangularReflectionMapping,\n    // EquirectangularRefraction: EquirectangularRefractionMapping,\n}\n\nconst colorSpace: Record<string, ColorSpace> = {\n    None: '',\n    SRGB: SRGBColorSpace,\n    LinearSRGB: LinearSRGBColorSpace,\n    RGBM16: RGBM16ColorSpace,\n    DisplayP3: DisplayP3ColorSpace,\n}\n\nconst textureDataType: Record<string, TextureDataType> = {\n    UnsignedByte: UnsignedByteType,\n    Byte: ByteType,\n    Short: ShortType,\n    UnsignedShort: UnsignedShortType,\n    Int: IntType,\n    UnsignedInt: UnsignedIntType,\n    Float: FloatType,\n    HalfFloat: HalfFloatType,\n    UnsignedShort4444: UnsignedShort4444Type,\n    UnsignedShort5551: UnsignedShort5551Type,\n    UnsignedInt248: UnsignedInt248Type,\n}\n\nconst depthPackingStrategies: Record<string, DepthPackingStrategies> = {\n    Basic: BasicDepthPacking,\n    RGBADepthPacking: RGBADepthPacking,\n}\n\nfunction makeMapping<T extends string|number|symbol>(a: Record<string, T>) {\n    return {\n        map: a,\n        inv: Object.fromEntries(Object.entries(a).map(([k, v]) => [v, k])) as Record<T, string>,\n        uiConfig: Object.entries(a).map(([k, v]) => ({label: k, value: v})) as UiObjectConfig[],\n    } as const\n}\nexport const threeConstMappings = {\n    Blending: makeMapping(blending),\n    AnyMapping: makeMapping(mapping),\n    ColorSpace: makeMapping(colorSpace),\n    TextureDataType: makeMapping(textureDataType),\n    DepthPackingStrategies: makeMapping(depthPackingStrategies),\n} as const\n","import {Texture} from 'three'\n\nexport const whiteImageData = new ImageData(new Uint8ClampedArray([255, 255, 255, 255]), 1, 1)\nexport const whiteTexture = new Texture(whiteImageData)\n","import {EventDispatcher, Intersection, Object3D, Raycaster, Vector2} from 'three'\nimport {JSUndoManager, now, onChangeDispatchEvent} from 'ts-browser-helpers'\nimport {ICamera, IMaterial, IObject3D, ITexture, IGeometry, IWidget} from '../../core'\n\nexport type SelectionObject = IObject3D | IMaterial | ITexture | IGeometry | null\nexport type SelectionObjectArr = IObject3D[] | IMaterial[] | ITexture[] | IGeometry[]\nexport type SelectionModeType = 'object' | 'material' | 'texture' | 'geometry'\nexport type PickingModeType = 'auto' | SelectionModeType\n\nexport interface HitIntersects{\n    selectedObject: IObject3D | null,\n    intersect: Intersection<IObject3D> | null,\n    intersects: Intersection<IObject3D>[],\n    mouse: Vector2,\n    selectedWidget?: (IWidget&IObject3D) | null,\n    selectedHandle?: Object3D | null,\n    /** When set to true by a hitObject listener, the picker will skip selection changes for this click. */\n    consumed?: boolean,\n}\n\nexport interface ObjectPickerEventMap{\n    hoverObjectChanged: {object: IObject3D | null, material: IMaterial | null, value: SelectionObject, intersects?: HitIntersects},\n    selectedObjectChanged: {object: IObject3D | null, objects: SelectionObjectArr, material: IMaterial | null, value: SelectionObject, lastValue: SelectionObject, lastValues: SelectionObjectArr, intersects?: HitIntersects},\n    hitObject: {time: number, intersects: HitIntersects} // selectedObject should be renamed to hitObject\n    selectionModeChanged: {detail: {key: 'selectionMode', value: SelectionModeType, oldValue: SelectionModeType}}\n    pickingModeChanged: {detail: {key: 'pickingMode', value: PickingModeType, oldValue: PickingModeType}}\n    multiSelectChanged: {detail: {key: 'multiSelectEnabled', value: boolean, oldValue: boolean}}\n}\n\nexport class ObjectPicker extends EventDispatcher<ObjectPickerEventMap> {\n    private _firstHit: IObject3D | undefined\n\n    hoverEnabled = false\n    /** Allow selecting multiple objects with Shift/Ctrl+Click. */\n    @onChangeDispatchEvent('multiSelectChanged')\n        multiSelectEnabled = true\n    @onChangeDispatchEvent('selectionModeChanged')\n        selectionMode: SelectionModeType = 'object'\n    @onChangeDispatchEvent('pickingModeChanged')\n        pickingMode: PickingModeType = 'auto'\n\n    /**\n     * Time threshold for a pointer click event\n     */\n    static PointerClickMaxTime = 200\n    /**\n     * Distance threshold for a pointer click event\n     */\n    static PointerClickMaxDistance = 0.1 // 1/20 of the canvas\n\n    undoManager?: JSUndoManager\n    private _root: IObject3D\n    extraObjects: IObject3D[] = []\n    private _camera: ICamera\n    private _mouseDownTime: number\n    private _mouseDownPos: Vector2 = new Vector2()\n    private _mouseUpTime: number\n    private _time: number\n    public selectionCondition: (o: IObject3D) => boolean\n    public raycaster: Raycaster\n    public mouse: Vector2\n    private _selected: SelectionObjectArr\n    private _selectedIntersects: HitIntersects|undefined\n    private _hovering: SelectionObjectArr\n    private _hoveringIntersects: HitIntersects|undefined\n    public cursorStyles: {default: string; down: string}\n    public domElement: HTMLElement\n    constructor(root: IObject3D, domElement: HTMLElement, camera: ICamera, selectionCondition?: (o:IObject3D)=>boolean) {\n        super()\n        this._root = root\n        this._camera = camera\n        this.domElement = domElement\n\n        this._time = this.time\n        this._mouseDownTime = 0\n        this._mouseUpTime = 1\n\n        this.selectionCondition = selectionCondition ?? (\n            (selectedObject: any) => {\n                return selectedObject.userData.userSelectable !== false && selectedObject.userData.bboxVisible !== false && selectedObject.material != null && selectedObject.material.type !== 'ShadowMaterial' // sample to select only mesh with material and not shadowmaterial.\n            })\n\n        this.raycaster = new Raycaster()\n        this.raycaster.params.Line2 = {threshold: 0.01} // for picking fat lines. todo separate thresh for world and localspace?\n\n        this.mouse = new Vector2()\n        this._selected = []\n        this._hovering = []\n\n        this.cursorStyles = {\n            default: 'grab',\n            down: 'grabbing',\n        }\n\n        this.domElement.style.touchAction = 'none'\n        // this.domElement.style.cursor = this.cursorStyles.default\n        this.domElement.addEventListener('pointermove', this._onPointerMove)\n        this.domElement.addEventListener('pointerleave', this._onPointerLeave)\n        this.domElement.addEventListener('pointerout', this._onPointerLeave)\n        this.domElement.addEventListener('pointercancel', this._onPointerCancel)\n        this.domElement.addEventListener('pointerenter', this._onPointerEnter)\n        this.domElement.addEventListener('pointerdown', this._onPointerDown)\n        this.domElement.addEventListener('pointerup', this._onPointerUp)\n\n    }\n\n    dispose() {\n        this.setSelected(null)\n        this.setHoverObject(null)\n\n        this.domElement.removeEventListener('pointermove', this._onPointerMove)\n        this.domElement.removeEventListener('pointerleave', this._onPointerLeave)\n        this.domElement.removeEventListener('pointerout', this._onPointerLeave)\n        this.domElement.removeEventListener('pointercancel', this._onPointerCancel)\n        this.domElement.removeEventListener('pointerenter', this._onPointerEnter)\n        this.domElement.removeEventListener('pointerdown', this._onPointerDown)\n        this.domElement.removeEventListener('pointerup', this._onPointerUp)\n    }\n\n    get camera() {\n        return this._camera\n    }\n\n    set camera(value) {\n        this._camera = value\n    }\n\n    get selectedObject(): SelectionObject {\n        return this._selected.length > 0 ? this._selected[0] : null\n    }\n\n    get selectedObjects(): SelectionObjectArr {\n        return [...this._selected] as SelectionObjectArr\n    }\n\n    // set selectedObject(object) {\n    //     this.setSelected(object)\n    // }\n\n    protected _onSelectedRemoved = (e: {target: IObject3D|IMaterial}) => {\n        const obj = e.target\n        if (this._selected.includes(obj as any)) {\n            const newSelection = this._selected.filter(o => o !== obj)\n            this.setSelected(newSelection.length ? newSelection.length === 1 ? newSelection[0] : newSelection as any : null, false)\n        }\n    }\n\n    setSelected(object: SelectionObject, record = true, intersects?: HitIntersects) {\n        // Auto-switch selection mode based on object type\n        if (object) {\n            if ((object as IObject3D)?.isObject3D && this.selectionMode !== 'object') {\n                this.selectionMode = 'object'\n            } else if ((object as IMaterial)?.isMaterial && this.selectionMode !== 'material') {\n                this.selectionMode = 'material'\n            } else if ((object as ITexture)?.isTexture && this.selectionMode !== 'texture') {\n                this.selectionMode = 'texture'\n            } else if ((object as IGeometry)?.isBufferGeometry && this.selectionMode !== 'geometry') {\n                this.selectionMode = 'geometry'\n            }\n        }\n\n        const currentIntersects = this._selectedIntersects\n        // Check if selection actually changed\n        if (Array.isArray(object)) {\n            if (this._selected.length === object.length && this._selected.every((o, i) => o === (object as any)[i])) return\n        } else {\n            if (!this._selected.length && !object || this._selected.length === 1 && this._selected[0] === object\n                && currentIntersects?.selectedObject === intersects?.selectedObject\n                && currentIntersects?.selectedWidget === intersects?.selectedWidget\n                && currentIntersects?.selectedHandle === intersects?.selectedHandle\n            ) return\n        }\n        const current = [...this._selected]\n        this._selected = object ? Array.isArray(object) ? [...object] : [object] : []\n        this._selectedIntersects = intersects || undefined\n\n        for (const currentElement of current) {\n            if (!currentElement) continue\n            // should work for all asset types, not just IObject3D, todo fix type\n            ;(currentElement as IObject3D).removeEventListener && (currentElement as IObject3D).removeEventListener('__unregister', this._onSelectedRemoved)\n        }\n        for (const newElement of this._selected) {\n            if (!newElement) continue\n            // unregister event is for remove from scene\n            ;(newElement as IObject3D).addEventListener && (newElement as IObject3D).addEventListener('__unregister', this._onSelectedRemoved)\n        }\n\n        const obj = this.selectedObject\n        this.dispatchEvent({\n            type: 'selectedObjectChanged',\n            object: (obj as IObject3D)?.isObject3D ? (obj as IObject3D) : null,\n            objects: [...this._selected] as SelectionObjectArr,\n            material: (obj as IMaterial)?.isMaterial ? (obj as IMaterial) : null,\n            value: obj,\n            lastValue: current.length ? current[0] : null,\n            lastValues: [...current] as SelectionObjectArr,\n            intersects,\n        })\n\n        record && this.undoManager?.record({\n            undo: () => this.setSelected(current.length ? current.length === 1 ? current[0] : current as any : null, false, currentIntersects),\n            redo: () => this.setSelected(object, false, intersects),\n        })\n    }\n\n    get hoverObject(): SelectionObject {\n        return this._hovering.length > 0 ? this._hovering[0] : null\n    }\n\n    // set hoverObject(object: SelectionObject | SelectionObject[] | null) {\n    setHoverObject(object: SelectionObject, _record = true, intersects?: HitIntersects) {\n        if (!this._hovering.length && !object || this._hovering.length === 1 && this._hovering[0] === object\n            && this._hoveringIntersects?.selectedObject === intersects?.selectedObject\n            && this._hoveringIntersects?.selectedWidget === intersects?.selectedWidget\n            && this._hoveringIntersects?.selectedHandle === intersects?.selectedHandle\n        ) return\n        this._hovering = (object ? Array.isArray(object) ? [...object] : [object] : []) as SelectionObjectArr\n        this._hoveringIntersects = intersects || undefined\n\n        const obj = this.hoverObject\n        this.dispatchEvent({\n            type: 'hoverObjectChanged',\n            object: (obj as IObject3D)?.isObject3D ? (obj as IObject3D) : null,\n            material: (obj as IMaterial)?.isMaterial ? (obj as IMaterial) : null,\n            value: obj,\n            intersects,\n        })\n    }\n\n    get time() {\n        this._time = now()\n        return this._time\n    }\n\n    get isMouseDown() {\n        return this.mouseDownDeltaTime < 0\n    }\n\n    get mouseDownDeltaTime() {\n        return this._mouseUpTime - this._mouseDownTime\n    }\n\n    private _onPointerMove = (event: PointerEvent) => {\n        if (event.isPrimary === false) return\n        this.updateMouseFromEvent(event)\n\n        if (this.hoverEnabled) {\n            const {obj, intersects} = this._hitObject()\n            this.setHoverObject(obj, true, intersects || undefined)\n        }\n\n    }\n\n    private _onPointerLeave = (event: PointerEvent) => {\n        if (event.isPrimary === false) return\n        this.domElement.style.cursor = this.cursorStyles.default\n\n        // this.updateMouseFromEvent(event);\n\n        if (this.hoverEnabled || this.hoverObject)\n            this.setHoverObject(null)\n\n    }\n\n    private _onPointerEnter = (_: PointerEvent) => {\n        // todo dispatch event?\n    }\n    private _onPointerCancel = (_: PointerEvent) => {\n        // todo dispatch event?\n    }\n\n    updateMouseFromEvent(event: PointerEvent) {\n        const rect = this.domElement.getBoundingClientRect()\n        this.mouse.x = (event.clientX - rect.x) / rect.width * 2 - 1\n        this.mouse.y = -((event.clientY - rect.y) / rect.height) * 2 + 1\n    }\n\n    private _onPointerDown = (event: PointerEvent) => {\n        if (event.isPrimary === false) return\n        this.domElement.style.cursor = this.cursorStyles.down\n\n        this._mouseDownTime = this.time\n        this._mouseDownPos.copy(this.mouse)\n\n        return undefined\n    }\n\n    private _onPointerUp = (event: PointerEvent) => {\n        if (event.isPrimary === false) return\n        this.domElement.style.cursor = this.cursorStyles.default\n\n        this._mouseUpTime = this.time\n        const delta = this.mouseDownDeltaTime\n        const dist = this._mouseDownPos.distanceTo(this.mouse)\n        if (delta < ObjectPicker.PointerClickMaxTime && dist < ObjectPicker.PointerClickMaxDistance) {\n            // click\n            this._onPointerClick(event)\n        }\n\n        return undefined\n    }\n\n    private _onPointerClick = (event: PointerEvent) => {\n        if (event.isPrimary === false) return\n        this.updateMouseFromEvent(event)\n        const {obj, intersects} = this._hitObject()\n\n        if (intersects?.consumed) return\n\n        if (this.multiSelectEnabled && (event.shiftKey || event.ctrlKey || event.metaKey) && obj && this.selectionMode === 'object') {\n            // Multi-select toggle: add if not selected, remove if selected. Last clicked is primary (index 0).\n            const current = [...this._selected] as IObject3D[]\n            const idx = current.indexOf(obj as IObject3D)\n            if (idx >= 0) {\n                current.splice(idx, 1)\n            } else {\n                current.unshift(obj as IObject3D) // insert at front — primary/active object\n            }\n            // Don't pass intersects for multi-select — the click is for selection management,\n            // not for identifying a handle/widget target for transform controls.\n            this.setSelected(current.length ? current.length === 1 ? current[0] : current as any : null, true)\n        } else {\n            this.setSelected(obj, true, intersects || undefined)\n        }\n    }\n\n    private _hitObject() {\n        const intersects = this.checkIntersection()\n        if (intersects) this.dispatchEvent({type: 'hitObject', time: this.time, intersects})\n        else this.dispatchEvent({\n            type: 'hitObject',\n            time: this.time,\n            intersects: {selectedObject: null, intersect: null, intersects: [], mouse: this.mouse.clone()},\n        })\n\n        let obj: SelectionObject = intersects?.selectedObject || null\n\n        // Handle selection based on current mode\n        if (obj) {\n            const mode = this.pickingMode === 'auto' ? this.selectionMode : this.pickingMode\n            switch (mode) {\n            case 'material':\n                if (obj.material) {\n                    obj = Array.isArray(obj.material) ? obj.material[0] : obj.material\n                }\n                break\n            case 'texture':\n                // Find the first texture from the material\n                if (obj.material) {\n                    const material = Array.isArray(obj.material) ? obj.material[0] : obj.material\n                    // Look for common texture properties\n                    obj = material.map || material.normalMap || material.roughnessMap || material.metalnessMap ||\n                            material.aoMap || null\n                } else {\n                    obj = null\n                }\n                break\n            case 'geometry':\n                obj = obj.geometry || null\n                break\n            case 'object':\n            default:\n                // obj remains as the intersected object\n                break\n            }\n        }\n        return {obj, intersects}\n    }\n\n    checkIntersection(): HitIntersects | null {\n        const camera = this._camera\n\n        if (!camera) return null\n\n        this.raycaster.setFromCamera(this.mouse, camera)\n\n        let intersects = this.raycaster.intersectObjects<IObject3D>([this._root, ...this.extraObjects], true)\n\n        const uniqueIds: number[] = []\n\n        const uniqueIntersects = intersects.filter(element => {\n            const isDuplicate = uniqueIds.includes(element.object.id)\n\n            if (!isDuplicate) {\n                uniqueIds.push(element.object.id)\n                return true\n            }\n\n            return false\n        })\n\n        intersects = uniqueIntersects\n\n        let selectedObject:IObject3D | null = null\n        let intersect: Intersection<IObject3D> | undefined\n\n        const intersects2 = []\n        for (const intersect1 of intersects) {\n            selectedObject = intersect1.object\n            intersect = intersect1\n            while (selectedObject != null && (!selectedObject.visible || !this.selectionCondition(selectedObject))) {\n                selectedObject = selectedObject.parent\n            }\n            if (selectedObject != null) {\n                intersect1.object = selectedObject\n                intersects2.push(intersect1)\n            }\n        }\n        intersects = intersects2\n\n        if (intersects.length > 0) {\n            selectedObject = intersects[0].object\n            intersect = intersects[0]\n\n            if (this._firstHit && selectedObject.id !== this._firstHit.id) {\n                selectedObject = intersect.object\n            } else {\n                for (let i = 0; i < intersects.length; i++) {\n                    if (this.selectedObject && this.selectedObject.id === intersects[i].object.id) {\n                        const n = i + 1 // Use ( i + 1 ) % intersects.length for looping through objects\n                        if (n < intersects.length) {\n                            intersect = intersects[n]\n                            selectedObject = intersect.object\n                        } else {\n                            return null\n                        }\n                    }\n                }\n            }\n            this._firstHit = intersects[0].object\n        }\n\n        if (selectedObject && intersect) {\n\n            if (selectedObject) // sorted by distance\n                return {selectedObject, intersect, intersects, mouse: this.mouse.clone()}\n\n            return null\n\n        } else {\n            return null\n        }\n\n    }\n\n    isHovering() {\n        return this.hoverObject != null // if something is highlighted.\n    }\n\n    isSelected() {\n        return this.selectedObject != null // if something is selected.\n    }\n\n}\n","import {IGeometry, IMaterial, IObject3D} from '../../core'\nimport {BufferAttribute, InstancedMesh} from 'three'\n// noinspection ES6PreferShortImport\nimport {copyObject3DUserData} from '../../utils/serialization'\n\nexport function autoGPUInstanceMeshes(matOrGeom: IMaterial|IGeometry) {\n    if (!(<IMaterial>matOrGeom).isMaterial && !(<IGeometry>matOrGeom).isBufferGeometry) return\n    const meshes = Array.from(matOrGeom.appliedMeshes).filter((m: any) =>\n        !m.isInstancedMesh &&\n            !!m.parent &&\n            m.children.length === 0 &&\n            !Array.isArray(m.material)\n    )\n    if (meshes.length < 2) return\n    const getKey = (m: IObject3D) => {\n        return m.parent!.uuid + '_' + m.geometry?.uuid + '_' + (m.material as IMaterial)?.uuid // + '_' + (m.matrix.determinant()<0)\n    }\n    const keyMeshMap = new Map<string, IObject3D[]>()\n    for (const mesh1 of meshes) {\n        const key = getKey(mesh1)\n        if (!keyMeshMap.has(key)) keyMeshMap.set(key, [])\n        keyMeshMap.get(key)!.push(mesh1)\n        mesh1.updateMatrix()\n    }\n    const keys = keyMeshMap.keys()\n    for (const key of keys) {\n        const iMeshes = keyMeshMap.get(key)!\n        const baseMesh = iMeshes[0]\n        if (!baseMesh) continue\n        if (iMeshes.length < 2) continue\n        const inst = new InstancedMesh(baseMesh.geometry, baseMesh.material, iMeshes.length)\n        const ud = baseMesh.userData\n        baseMesh.userData = {}\n        inst.copy(baseMesh)\n        copyObject3DUserData(inst.userData, ud)\n        const parent = baseMesh.parent!\n        inst.position.set(0, 0, 0)\n        inst.rotation.set(0, 0, 0)\n        inst.scale.set(1, 1, 1)\n        inst.updateMatrix()\n\n        const translationAttr = new Float32Array(inst.count * 3)\n        const rotationAttr = new Float32Array(inst.count * 4)\n        const scaleAttr = new Float32Array(inst.count * 3)\n\n        // const pos = new Vector3()\n        // const quat = new Quaternion()\n        // const scale = new Vector3()\n\n        for (let i = 0; i < iMeshes.length; i++) {\n            const m = iMeshes[i]\n            // const mat = inst.matrix.clone().invert().multiply(m.matrix)\n            const mat = m.matrix\n            // mat.decompose(pos, quat, scale)\n            if (mat.determinant() < 0) {\n                mat.elements[0] *= -1\n                mat.elements[1] *= -1\n                mat.elements[2] *= -1\n            }\n            inst.setMatrixAt(i, mat)\n            m.position.toArray(translationAttr, i * 3)\n            m.quaternion.toArray(rotationAttr, i * 4)\n            m.scale.toArray(scaleAttr, i * 3)\n            m.removeFromParent()\n            // ;(m.material as any)?.appliedMeshes?.delete(m)\n            // m.geometry?.appliedMeshes?.delete(m)\n            m.material = undefined\n            m.geometry = undefined\n        }\n        // (inst.material as IMaterial).appliedMeshes?.add(inst)\n        // inst.geometry.userData.__appliedMeshes.add(inst)\n\n        // todo set position to center of all instances\n\n        // @ts-expect-error todo not in ts\n        inst.sourceTrs = {\n            TRANSLATION: new BufferAttribute(translationAttr, 3),\n            ROTATION: new BufferAttribute(rotationAttr, 4),\n            SCALE: new BufferAttribute(scaleAttr, 3),\n        }\n\n        inst.instanceMatrix.needsUpdate = true\n        parent.add(inst)\n        ;(parent as any).setDirty()\n    }\n}\n\n// added to three.js\n// export class GLTFMeshGpuInstancingExporter implements GLTFExporterPlugin {\n//     name = 'EXT_mesh_gpu_instancing'\n//     constructor(public writer: GLTFWriter2) {\n//     }\n//\n//     writeNode(object: any, nodeDef: any): void {\n//         if (!object.isInstancedMesh) return\n//\n//         const writer = this.writer\n//\n//         const mesh = object as InstancedMesh\n//\n//         // @ts-expect-error not in ts\n//         let attributes: any = mesh.sourceTrs\n//         if (!attributes) {\n//             const translationAttr = new Float32Array(mesh.count * 3)\n//             const rotationAttr = new Float32Array(mesh.count * 4)\n//             const scaleAttr = new Float32Array(mesh.count * 3)\n//\n//             const matrix = new Matrix4()\n//             const position = new Vector3()\n//             const quaternion = new Quaternion()\n//             const scale = new Vector3()\n//\n//             for (let i = 0; i < mesh.count; i++) {\n//                 mesh.getMatrixAt(i, matrix)\n//                 matrix.decompose(position, quaternion, scale)\n//\n//                 position.toArray(translationAttr, i * 3)\n//                 quaternion.toArray(rotationAttr, i * 4)\n//                 scale.toArray(scaleAttr, i * 3)\n//             }\n//             attributes = {\n//                 TRANSLATION: new BufferAttribute(translationAttr, 3),\n//                 ROTATION: new BufferAttribute(rotationAttr, 4),\n//                 SCALE: new BufferAttribute(scaleAttr, 3),\n//             }\n//         }\n//\n//         attributes = {\n//             // @ts-expect-error todo add to ts\n//             TRANSLATION: writer.processAccessor(attributes.TRANSLATION),\n//             ROTATION: (writer as any).processAccessor(attributes.ROTATION),\n//             SCALE: (writer as any).processAccessor(attributes.SCALE),\n//         }\n//\n//         if (mesh.instanceColor)\n//             attributes._COLOR_0 = (writer as any).processAccessor(mesh.instanceColor)\n//\n//         writer.extensionsUsed[ this.name ] = true\n//         // @ts-expect-error todo add to ts\n//         writer.extensionsRequired[ this.name ] = true\n//\n//         nodeDef.extensions = nodeDef.extensions || {}\n//         nodeDef.extensions[ this.name ] = {attributes}\n//     }\n// }\n","/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - see http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nconst HorizontalBlurShader = {\n\n\tname: 'HorizontalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'h': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float h;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { HorizontalBlurShader };\n","/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - see http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nconst VerticalBlurShader = {\n\n\tname: 'VerticalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'v': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float v;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { VerticalBlurShader };\n","import {ShaderMaterial, Texture, WebGLRenderTarget} from 'three'\nimport {HorizontalBlurShader} from 'three/examples/jsm/shaders/HorizontalBlurShader.js'\nimport {VerticalBlurShader} from 'three/examples/jsm/shaders/VerticalBlurShader.js'\nimport {ThreeViewer} from '../../viewer'\nimport {IRenderTarget} from '../../rendering'\n\nexport class HVBlurHelper {\n    horizontalBlurMaterial = new ShaderMaterial(HorizontalBlurShader)\n\n    verticalBlurMaterial = new ShaderMaterial(VerticalBlurShader)\n\n    constructor(private _viewer: ThreeViewer) {\n        this.horizontalBlurMaterial.depthTest = false\n        this.verticalBlurMaterial.depthTest = false\n    }\n\n    blur(source: Texture, dest: IRenderTarget & WebGLRenderTarget, tempTarget: IRenderTarget & WebGLRenderTarget, amountMultiplier = 1) {\n        this.horizontalBlurMaterial.uniforms.h.value = amountMultiplier\n        this.verticalBlurMaterial.uniforms.v.value = amountMultiplier\n        this._viewer.renderManager.blit(tempTarget, {\n            material: this.horizontalBlurMaterial,\n            clear: true,\n            source: source, // this._depthPass.target.texture,\n        })\n        // this._viewer.renderManager.blit(this._depthPass.target, {\n        this._viewer.renderManager.blit(dest, {\n            material: this.verticalBlurMaterial,\n            clear: true,\n            source: tempTarget.texture,\n        })\n    }\n\n    dispose() {\n        this.horizontalBlurMaterial.dispose()\n        this.verticalBlurMaterial.dispose()\n    }\n\n}\n","import {Object3D, PerspectiveCamera, Scene, Vector3} from 'three'\nimport {Box3B} from '../math/Box3B'\nimport {IWebGLRenderer} from '../../core'\n\n/**\n * Returns a snapshot of the object.\n * Does a simple render, does not run the full pipeline.\n *\n * Ideally, call this from preRender and object must be in root, for usage see {@link MaterialPreviewGenerator}.\n * @param renderer\n * @param object\n * @param root\n * @param channel\n * @param camOffset\n * @param camera\n */\nexport function snapObject(\n    renderer: IWebGLRenderer,\n    object: Object3D,\n    root?: Scene,\n    channel = 7,\n    camOffset = new Vector3(0, 0, 1.5),\n    camera = new PerspectiveCamera(45, 1, 0.1, 1000)\n): string {\n    const oldVisible = object.visible\n    object.visible = true\n\n    const bbox = new Box3B().expandByObject(object, true, true)\n    const center = bbox.getCenter(new Vector3())\n    const bboxSize = bbox.getSize(new Vector3())\n    camera.position.copy(center).add(camOffset.clone().multiplyScalar(Math.max(bboxSize.x, bboxSize.y, bboxSize.z)))\n    camera.lookAt(center)\n\n    if (object) {\n        object.traverseVisible(obj => {\n            obj.layers.enable(channel)\n        })\n        // console.log((object as any).material)\n    }\n    if (channel > 0)\n        camera.layers.set(channel)\n    else\n        camera.layers.enableAll()\n\n    // scene.environment = this.viewer.scene.getEnvironment() as any\n\n    renderer.setRenderTarget(null)\n\n    renderer.clear()\n    if (typeof renderer.renderWithModes === 'function') {\n        renderer.renderWithModes({\n            backgroundRender: false,\n            // mainRenderPass: false,\n            // screenSpaceRendering: false,\n            // shadowMapRender: false,\n        }, ()=>{\n            renderer.render(root ?? object, camera)\n        })\n    } else {\n        renderer.render(root ?? object, camera)\n    }\n\n    // renderer.setRenderTarget(target)\n    // this._renderer.render(root, camera)\n    // todo use webp when possible.\n    const snap = renderer.domElement.toDataURL('image/png')\n\n    renderer.clear()\n\n    object.visible = oldVisible\n    object.traverseVisible(obj => {\n        obj.layers.disable(channel)\n    })\n    camera.layers.enableAll()\n    return snap\n}\n","import {BoxGeometry, CylinderGeometry, HemisphereLight, Light, Mesh, Scene, SphereGeometry, Vector3} from 'three'\nimport {IDisposable} from 'ts-browser-helpers'\nimport {snapObject} from './snapObject'\nimport {IMaterial, ITexture, IWebGLRenderer} from '../../core'\n\nexport class MaterialPreviewGenerator implements IDisposable {\n    private _scene: Scene\n    private _channel: number\n    private _lights: Light[] = []\n\n    constructor() {\n\n        const scene = new Scene()\n\n        this._channel = 7\n        const hemisphericLight = new HemisphereLight(0xffffff, 0x444444, 1)\n        hemisphericLight.position.set(0, 10, 0)\n        hemisphericLight.layers.set(this._channel)\n        scene.add(hemisphericLight)\n        this._lights.push(hemisphericLight)\n\n        this._scene = scene\n\n    }\n\n    dispose() {\n        [...this._lights].forEach(light => light.dispose())\n        Object.values(this.shapes).forEach(shape => {\n            if (shape.geometry) shape.geometry.dispose()\n        })\n    }\n\n    shapes: Record<string, Mesh> = {\n        sphere: new Mesh(new SphereGeometry(1)),\n        cube: new Mesh(new BoxGeometry(1, 1, 1)),\n        cylinder: new Mesh(new CylinderGeometry(0.5, 0.5, 1)),\n    }\n\n    // todo: show an overlay when this is happening\n    generate(material: IMaterial, renderer: IWebGLRenderer, environment?: ITexture|null, shape = 'sphere'): string {\n        const object = this.shapes[shape] || new Mesh(new SphereGeometry(1))\n        object.material = material\n\n        if (!object.geometry.attributes.tangent) object.geometry.computeTangents() // for anisotropy\n\n        this._scene.add(object)\n        this._scene.environment = environment ?? null\n\n        const envIntensity = material.envMapIntensity\n        // clamp since we have no tonemapping\n        if (typeof envIntensity === 'number') {\n            material.envMapIntensity = Math.max(envIntensity, 2)\n        }\n\n        const snap = snapObject(renderer, object, this._scene, this._channel, new Vector3(0, 0, 1.5))\n        // const snap = snapObject(this.viewer, (material.userData.__appliedMeshes as Set<Mesh>).values().next().value, undefined, this._channel)\n\n        if (typeof envIntensity === 'number')\n            material.envMapIntensity = envIntensity\n\n        this._scene.remove(object)\n\n        object.material = undefined as any\n\n        return snap\n    }\n\n}\n","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from 'three';\n\nconst _box = new Box3();\nconst _vector = new Vector3();\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isLineSegmentsGeometry = true;\n\n\t\tthis.type = 'LineSegmentsGeometry';\n\n\t\tconst positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\t\tconst uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\t\tconst index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\t\tthis.setIndex( index );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined ) {\n\n\t\t\tstart.applyMatrix4( matrix );\n\n\t\t\tend.applyMatrix4( matrix );\n\n\t\t\tstart.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetPositions( array ) {\n\n\t\tlet lineSegments;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tlineSegments = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tlineSegments = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\n\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\n\n\t\t//\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\n\t}\n\n\tsetColors( array ) {\n\n\t\tlet colors;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tcolors = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tcolors = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\n\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\n\n\t\treturn this;\n\n\t}\n\n\tfromWireframeGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromEdgesGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromMesh( mesh ) {\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tfromLineSegments( lineSegments ) {\n\n\t\tconst geometry = lineSegments.geometry;\n\n\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t_box.setFromBufferAttribute( end );\n\n\t\t\tthis.boundingBox.union( _box );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( start, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t_vector.fromBufferAttribute( end, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\t// todo\n\n\t}\n\n\tapplyMatrix( matrix ) {\n\n\t\tconsole.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' );\n\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n}\n\nexport { LineSegmentsGeometry };\n","/**\n * parameters = {\n *  color: <hex>,\n *  linewidth: <float>,\n *  dashed: <boolean>,\n *  dashScale: <float>,\n *  dashSize: <float>,\n *  dashOffset: <float>,\n *  gapSize: <float>,\n *  resolution: <Vector2>, // to be set by renderer\n * }\n */\n\nimport {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2\n} from 'three';\n\n\nUniformsLib.line = {\n\n\tworldUnits: { value: 1 },\n\tlinewidth: { value: 1 },\n\tresolution: { value: new Vector2( 1, 1 ) },\n\tdashOffset: { value: 0 },\n\tdashScale: { value: 1 },\n\tdashSize: { value: 1 },\n\tgapSize: { value: 1 } // todo FIX - maybe change to totalSize\n\n};\n\nShaderLib[ 'line' ] = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.line\n\t] ),\n\n\tvertexShader:\n\t/* glsl */`\n\t\t#include <common>\n\t\t#include <color_pars_vertex>\n\t\t#include <fog_pars_vertex>\n\t\t#include <logdepthbuf_pars_vertex>\n\t\t#include <clipping_planes_pars_vertex>\n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tworldStart = start.xyz;\n\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t#else\n\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\tvec3 tmpFwd = normalize( mix( start.xyz, end.xyz, 0.5 ) );\n\t\t\t\tvec3 worldUp = normalize( cross( worldDir, tmpFwd ) );\n\t\t\t\tvec3 worldFwd = cross( worldDir, worldUp );\n\t\t\t\tworldPos = position.y < 0.5 ? start: end;\n\n\t\t\t\t// height offset\n\t\t\t\tfloat hw = linewidth * 0.5;\n\t\t\t\tworldPos.xyz += position.x < 0.0 ? hw * worldUp : - hw * worldUp;\n\n\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t// cap extension\n\t\t\t\t\tworldPos.xyz += position.y < 0.5 ? - hw * worldDir : hw * worldDir;\n\n\t\t\t\t\t// add width to the box\n\t\t\t\t\tworldPos.xyz += worldFwd * hw;\n\n\t\t\t\t\t// endcaps\n\t\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\t\tworldPos.xyz -= worldFwd * 2.0 * hw;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t\t// project the worldpos\n\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t// segments overlap neatly\n\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t#else\n\n\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\tdir.x /= aspect;\n\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t// sign flip\n\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t// endcaps\n\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\toffset += - dir;\n\n\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\toffset += dir;\n\n\t\t\t\t}\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset *= linewidth;\n\n\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t// select end\n\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t// back to clip space\n\t\t\t\toffset *= clip.w;\n\n\t\t\t\tclip.xy += offset;\n\n\t\t\t#endif\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t#include <logdepthbuf_vertex>\n\t\t\t#include <clipping_planes_vertex>\n\t\t\t#include <fog_vertex>\n\n\t\t}\n\t\t`,\n\n\tfragmentShader:\n\t/* glsl */`\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\t\tuniform float linewidth;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashOffset;\n\t\t\tuniform float dashSize;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#include <common>\n\t\t#include <color_pars_fragment>\n\t\t#include <fog_pars_fragment>\n\t\t#include <logdepthbuf_pars_fragment>\n\t\t#include <clipping_planes_pars_fragment>\n\n\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\tfloat mua;\n\t\t\tfloat mub;\n\n\t\t\tvec3 p13 = p1 - p3;\n\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\tmua = numer / denom;\n\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\treturn vec2( mua, mub );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <clipping_planes_fragment>\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\tfloat alpha = opacity;\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\tfloat len = length( delta );\n\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t#else\n\n\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\n\t\t\t#include <logdepthbuf_fragment>\n\t\t\t#include <color_fragment>\n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\t\t\t#include <fog_fragment>\n\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t}\n\t\t`\n};\n\nclass LineMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttype: 'LineMaterial',\n\n\t\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\t\tclipping: true // required for clipping support\n\n\t\t} );\n\n\t\tthis.isLineMaterial = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget color() {\n\n\t\treturn this.uniforms.diffuse.value;\n\n\t}\n\n\tset color( value ) {\n\n\t\tthis.uniforms.diffuse.value = value;\n\n\t}\n\n\tget worldUnits() {\n\n\t\treturn 'WORLD_UNITS' in this.defines;\n\n\t}\n\n\tset worldUnits( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.WORLD_UNITS = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.WORLD_UNITS;\n\n\t\t}\n\n\t}\n\n\tget linewidth() {\n\n\t\treturn this.uniforms.linewidth.value;\n\n\t}\n\n\tset linewidth( value ) {\n\n\t\tif ( ! this.uniforms.linewidth ) return;\n\t\tthis.uniforms.linewidth.value = value;\n\n\t}\n\n\tget dashed() {\n\n\t\treturn 'USE_DASH' in this.defines;\n\n\t}\n\n\tset dashed( value ) {\n\n\t\tif ( ( value === true ) !== this.dashed ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.USE_DASH = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.USE_DASH;\n\n\t\t}\n\n\t}\n\n\tget dashScale() {\n\n\t\treturn this.uniforms.dashScale.value;\n\n\t}\n\n\tset dashScale( value ) {\n\n\t\tthis.uniforms.dashScale.value = value;\n\n\t}\n\n\tget dashSize() {\n\n\t\treturn this.uniforms.dashSize.value;\n\n\t}\n\n\tset dashSize( value ) {\n\n\t\tthis.uniforms.dashSize.value = value;\n\n\t}\n\n\tget dashOffset() {\n\n\t\treturn this.uniforms.dashOffset.value;\n\n\t}\n\n\tset dashOffset( value ) {\n\n\t\tthis.uniforms.dashOffset.value = value;\n\n\t}\n\n\tget gapSize() {\n\n\t\treturn this.uniforms.gapSize.value;\n\n\t}\n\n\tset gapSize( value ) {\n\n\t\tthis.uniforms.gapSize.value = value;\n\n\t}\n\n\tget opacity() {\n\n\t\treturn this.uniforms.opacity.value;\n\n\t}\n\n\tset opacity( value ) {\n\n\t\tif ( ! this.uniforms ) return;\n\t\tthis.uniforms.opacity.value = value;\n\n\t}\n\n\tget resolution() {\n\n\t\treturn this.uniforms.resolution.value;\n\n\t}\n\n\tset resolution( value ) {\n\n\t\tthis.uniforms.resolution.value.copy( value );\n\n\t}\n\n\tget alphaToCoverage() {\n\n\t\treturn 'USE_ALPHA_TO_COVERAGE' in this.defines;\n\n\t}\n\n\tset alphaToCoverage( value ) {\n\n\t\tif ( ! this.defines ) return;\n\n\t\tif ( ( value === true ) !== this.alphaToCoverage ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.USE_ALPHA_TO_COVERAGE = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.USE_ALPHA_TO_COVERAGE;\n\n\t\t}\n\n\t}\n\n}\n\nexport { LineMaterial };\n","import {\n\tBox3,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tSphere,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\nimport { LineMaterial } from '../lines/LineMaterial.js';\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nconst _start4 = new Vector4();\nconst _end4 = new Vector4();\n\nconst _ssOrigin = new Vector4();\nconst _ssOrigin3 = new Vector3();\nconst _mvMatrix = new Matrix4();\nconst _line = new Line3();\nconst _closestPoint = new Vector3();\n\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _clipToWorldVector = new Vector4();\n\nlet _ray, _lineWidth;\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth( camera, distance, resolution ) {\n\n\t// transform into clip space, adjust the x and y values by the pixel width offset, then\n\t// transform back into world space to get world offset. Note clip space is [-1, 1] so full\n\t// width does not need to be halved.\n\t_clipToWorldVector.set( 0, 0, - distance, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t_clipToWorldVector.x = _lineWidth / resolution.width;\n\t_clipToWorldVector.y = _lineWidth / resolution.height;\n\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\n\treturn Math.abs( Math.max( _clipToWorldVector.x, _clipToWorldVector.y ) );\n\n}\n\nfunction raycastWorldUnits( lineSegments, intersects ) {\n\n\tconst matrixWorld = lineSegments.matrixWorld;\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\tconst segmentCount = Math.min( geometry.instanceCount, instanceStart.count );\n\n\tfor ( let i = 0, l = segmentCount; i < l; i ++ ) {\n\n\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t_line.applyMatrix4( matrixWorld );\n\n\t\tconst pointOnLine = new Vector3();\n\t\tconst point = new Vector3();\n\n\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\t\tconst isInside = point.distanceTo( pointOnLine ) < _lineWidth * 0.5;\n\n\t\tif ( isInside ) {\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint,\n\t\t\t\tpointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv1: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nfunction raycastScreenSpace( lineSegments, camera, intersects ) {\n\n\tconst projectionMatrix = camera.projectionMatrix;\n\tconst material = lineSegments.material;\n\tconst resolution = material.resolution;\n\tconst matrixWorld = lineSegments.matrixWorld;\n\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\tconst segmentCount = Math.min( geometry.instanceCount, instanceStart.count );\n\n\tconst near = - camera.near;\n\n\t//\n\n\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t// applying the projection matrix.\n\t_ray.at( 1, _ssOrigin );\n\n\t// ndc space [ - 1.0, 1.0 ]\n\t_ssOrigin.w = 1;\n\t_ssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t_ssOrigin.applyMatrix4( projectionMatrix );\n\t_ssOrigin.multiplyScalar( 1 / _ssOrigin.w );\n\n\t// screen space\n\t_ssOrigin.x *= resolution.x / 2;\n\t_ssOrigin.y *= resolution.y / 2;\n\t_ssOrigin.z = 0;\n\n\t_ssOrigin3.copy( _ssOrigin );\n\n\t_mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\tfor ( let i = 0, l = segmentCount; i < l; i ++ ) {\n\n\t\t_start4.fromBufferAttribute( instanceStart, i );\n\t\t_end4.fromBufferAttribute( instanceEnd, i );\n\n\t\t_start4.w = 1;\n\t\t_end4.w = 1;\n\n\t\t// camera space\n\t\t_start4.applyMatrix4( _mvMatrix );\n\t\t_end4.applyMatrix4( _mvMatrix );\n\n\t\t// skip the segment if it's entirely behind the camera\n\t\tconst isBehindCameraNear = _start4.z > near && _end4.z > near;\n\t\tif ( isBehindCameraNear ) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\t// trim the segment if it extends behind camera near\n\t\tif ( _start4.z > near ) {\n\n\t\t\tconst deltaDist = _start4.z - _end4.z;\n\t\t\tconst t = ( _start4.z - near ) / deltaDist;\n\t\t\t_start4.lerp( _end4, t );\n\n\t\t} else if ( _end4.z > near ) {\n\n\t\t\tconst deltaDist = _end4.z - _start4.z;\n\t\t\tconst t = ( _end4.z - near ) / deltaDist;\n\t\t\t_end4.lerp( _start4, t );\n\n\t\t}\n\n\t\t// clip space\n\t\t_start4.applyMatrix4( projectionMatrix );\n\t\t_end4.applyMatrix4( projectionMatrix );\n\n\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t_start4.multiplyScalar( 1 / _start4.w );\n\t\t_end4.multiplyScalar( 1 / _end4.w );\n\n\t\t// screen space\n\t\t_start4.x *= resolution.x / 2;\n\t\t_start4.y *= resolution.y / 2;\n\n\t\t_end4.x *= resolution.x / 2;\n\t\t_end4.y *= resolution.y / 2;\n\n\t\t// create 2d segment\n\t\t_line.start.copy( _start4 );\n\t\t_line.start.z = 0;\n\n\t\t_line.end.copy( _end4 );\n\t\t_line.end.z = 0;\n\n\t\t// get closest point on ray to segment\n\t\tconst param = _line.closestPointToPointParameter( _ssOrigin3, true );\n\t\t_line.at( param, _closestPoint );\n\n\t\t// check if the intersection point is within clip space\n\t\tconst zPos = MathUtils.lerp( _start4.z, _end4.z, param );\n\t\tconst isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\tconst isInside = _ssOrigin3.distanceTo( _closestPoint ) < _lineWidth * 0.5;\n\n\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t_line.start.applyMatrix4( matrixWorld );\n\t\t\t_line.end.applyMatrix4( matrixWorld );\n\n\t\t\tconst pointOnLine = new Vector3();\n\t\t\tconst point = new Vector3();\n\n\t\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint: point,\n\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv1: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nclass LineSegments2 extends Mesh {\n\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineSegments2 = true;\n\n\t\tthis.type = 'LineSegments2';\n\n\t}\n\n\t// for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst worldUnits = this.material.worldUnits;\n\t\tconst camera = raycaster.camera;\n\n\t\tif ( camera === null && ! worldUnits ) {\n\n\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.' );\n\n\t\t}\n\n\t\tconst threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\t_ray = raycaster.ray;\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\t_lineWidth = material.linewidth + threshold;\n\n\t\t// check if we intersect the sphere bounds\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( matrixWorld );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tlet sphereMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tsphereMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToSphere = Math.max( camera.near, _sphere.distanceToPoint( _ray.origin ) );\n\t\t\tsphereMargin = getWorldSpaceHalfWidth( camera, distanceToSphere, material.resolution );\n\n\t\t}\n\n\t\t_sphere.radius += sphereMargin;\n\n\t\tif ( _ray.intersectsSphere( _sphere ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// check if we intersect the box bounds\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\t_box.copy( geometry.boundingBox ).applyMatrix4( matrixWorld );\n\n\t\t// increase the box bounds by the worst case line width\n\t\tlet boxMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tboxMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToBox = Math.max( camera.near, _box.distanceToPoint( _ray.origin ) );\n\t\t\tboxMargin = getWorldSpaceHalfWidth( camera, distanceToBox, material.resolution );\n\n\t\t}\n\n\t\t_box.expandByScalar( boxMargin );\n\n\t\tif ( _ray.intersectsBox( _box ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( worldUnits ) {\n\n\t\t\traycastWorldUnits( this, intersects );\n\n\t\t} else {\n\n\t\t\traycastScreenSpace( this, camera, intersects );\n\n\t\t}\n\n\t}\n\n}\n\nexport { LineSegments2 };\n","import {\n    BackSide,\n    Camera,\n    CanvasTexture,\n    Clock,\n    Color,\n    Euler,\n    LinearFilter,\n    Material,\n    Mesh,\n    MeshBasicMaterial,\n    Object3D, Object3DEventMap,\n    OrthographicCamera,\n    PerspectiveCamera,\n    Quaternion,\n    Raycaster,\n    RepeatWrapping,\n    SphereGeometry,\n    Sprite,\n    SpriteMaterial,\n    SRGBColorSpace,\n    Vector2,\n    Vector3,\n    Vector4,\n    WebGLRenderer,\n} from 'three'\nimport {LineSegmentsGeometry} from 'three/examples/jsm/lines/LineSegmentsGeometry.js'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {LineMaterial} from 'three/examples/jsm/lines/LineMaterial.js'\nimport {onChangeDispatchEvent} from 'ts-browser-helpers'\n\nconst [POS_X, POS_Y, POS_Z, NEG_X, NEG_Y, NEG_Z] = Array(6)\n    .fill(0)\n    .map((_, i) => i)\n\nconst axesColors = [\n    new Color(0xff3653),\n    new Color(0x8adb00),\n    new Color(0x2c8fff),\n]\n\nconst clock = new Clock()\nconst targetPosition = new Vector3()\nconst targetQuaternion = new Quaternion()\n// const euler = new Euler()\nconst q1 = new Quaternion()\nconst q2 = new Quaternion()\nconst point = new Vector3()\n// const dim = 128\nconst turnRate = 2 * Math.PI // turn rate in angles per second\nconst raycaster = new Raycaster()\nconst mouse = new Vector2()\n// const mouseStart = new Vector2()\n// const mouseAngle = new Vector2()\nconst dummy = new Object3D()\nlet radius = 0\n\nexport type GizmoOrientation = '+x' | '-x' | '+y' | '-y' | '+z' | '-z'\n\nexport type DomPlacement =\n    | 'top-left'\n    | 'top-right'\n    | 'top-center'\n    | 'center-right'\n    | 'center-left'\n    | 'center-center'\n    | 'bottom-left'\n    | 'bottom-right'\n    | 'bottom-center'\n\nexport interface ViewHelper2EventMap extends Object3DEventMap{\n    ['animating-changed']: {detail: {key: 'animating', value: boolean, oldValue: boolean}}\n    update: {event: PointerEvent, change: 'pointer'} | {change: 'orientation'}\n}\n\n/**\n * Extended ViewHelper implemented from the following source:\n * https://github.com/Fennec-hub/viewHelper\n * MIT License\n * Copyright (c) 2022 Fennec-hub\n */\nexport class ViewHelper2 extends Object3D<ViewHelper2EventMap> {\n    camera: OrthographicCamera | PerspectiveCamera\n    orthoCamera = new OrthographicCamera(-1.8, 1.8, 1.8, -1.8, 0, 4)\n    isViewHelper = true\n    @onChangeDispatchEvent()\n        animating = false\n    target = new Vector3()\n    backgroundSphere: Mesh\n    axesLines: LineSegments2\n    spritePoints: Sprite[]\n    domElement: HTMLElement\n    domContainer: HTMLElement\n    domRect: DOMRect\n    // dragging = false\n    renderer: WebGLRenderer\n    // controls?: OrbitControls | TrackballControls\n    // controlsChangeEvent: {listener: () => void}\n    viewport: Vector4 = new Vector4()\n    offsetHeight = 0\n\n    constructor(\n        camera: PerspectiveCamera | OrthographicCamera,\n        canvas: HTMLCanvasElement,\n        placement: DomPlacement = 'bottom-right',\n        size = 128,\n        pixelRatio = 2,\n    ) {\n        super()\n\n        this.renderer = new WebGLRenderer({\n            canvas: document.createElement('canvas'),\n            alpha: true,\n            antialias: true,\n            preserveDrawingBuffer: false,\n        })\n        this.renderer.setPixelRatio(pixelRatio)\n        this.camera = camera\n        this.domElement = canvas\n\n        this.orthoCamera.position.set(0, 0, 2)\n\n        this.backgroundSphere = getBackgroundSphere()\n        this.axesLines = getAxesLines()\n        this.spritePoints = getAxesSpritePoints()\n\n        this.add(this.backgroundSphere, this.axesLines, ...this.spritePoints)\n\n        this.domContainer = getDomContainer(placement, size)\n        this.domContainer.appendChild(this.renderer.domElement)\n        this.renderer.domElement.style.width = '100%'\n        this.renderer.domElement.style.height = '100%'\n\n        // This may cause confusion if the parent isn't the body and doesn't have a `position:relative`\n        this.domElement.parentElement!.appendChild(this.domContainer)\n\n        this.domRect = this.domContainer.getBoundingClientRect()\n        this.startListening()\n\n        // this.controlsChangeEvent = {listener: () => this.updateOrientation()}\n\n        this.update()\n        this.updateOrientation()\n    }\n\n    startListening() {\n        // this.domContainer.onpointerdown = (e) => this.onPointerDown(e)\n        this.domContainer.onpointermove = (e) => this.onPointerMove(e)\n        this.domContainer.onpointerleave = (e) => this.onPointerLeave(e)\n        this.domContainer.onclick = (e) => this.handleClick(e)\n    }\n\n    onPointerMove(e: PointerEvent) {\n        // if (this.dragging) return;\n        (this.backgroundSphere.material as Material).opacity = 0.4\n        this.handleHover(e)\n        this.dispatchEvent({type: 'update', event: e, change: 'pointer'})\n    }\n\n    onPointerLeave(e: PointerEvent) {\n        // if (this.dragging) return;\n        (this.backgroundSphere.material as Material).opacity = 0.2\n        resetSprites(this.spritePoints)\n        this.domContainer.style.cursor = ''\n        this.dispatchEvent({type: 'update', event: e, change: 'pointer'})\n    }\n\n    handleClick(e: PointerEvent|MouseEvent) {\n        const object = getIntersectionObject(\n            e,\n            this.domRect,\n            this.orthoCamera,\n            this.spritePoints\n        )\n\n        if (!object) return\n\n        this.setOrientation(object.userData.type)\n    }\n\n    handleHover(e: PointerEvent) {\n        const object = getIntersectionObject(\n            e,\n            this.domRect,\n            this.orthoCamera,\n            this.spritePoints\n        )\n\n        resetSprites(this.spritePoints)\n\n        if (!object) {\n            this.domContainer.style.cursor = ''\n        } else {\n            object.material.map!.offset.x = 0.5\n            object.scale.multiplyScalar(1.2)\n            this.domContainer.style.cursor = 'pointer'\n        }\n    }\n\n    render() {\n        const delta = clock.getDelta()\n        if (this.animating) this.animate(Math.min(delta, 1 / 30.0))\n\n        // const x = this.domRect.left\n        // const y = this.offsetHeight - this.domRect.bottom\n\n        const autoClear = this.renderer.autoClear\n        this.renderer.autoClear = false\n        // this.renderer.setViewport(x, y, dim, dim)\n        this.renderer.render(this, this.orthoCamera)\n        // this.renderer.setViewport(this.viewport)\n        this.renderer.autoClear = autoClear\n    }\n\n    updateOrientation(fromCamera = true) {\n        if (fromCamera) {\n            this.quaternion.copy(this.camera.quaternion).invert()\n            this.updateMatrixWorld()\n        }\n\n        updateSpritesOpacity(this.spritePoints, this.camera)\n    }\n\n    update() {\n        this.domRect = this.domContainer.getBoundingClientRect()\n        this.offsetHeight = this.domElement.offsetHeight\n        setRadius(this.camera, this.target)\n        this.renderer.getViewport(this.viewport)\n\n        this.updateOrientation()\n    }\n\n    animate(delta: number) {\n        const step = delta * turnRate\n\n        // animate position by doing a slerp and then scaling the position on the unit sphere\n\n        q1.rotateTowards(q2, step)\n        this.camera.position\n            .set(0, 0, 1)\n            .applyQuaternion(q1)\n            .multiplyScalar(radius)\n            .add(this.target)\n\n        // animate orientation\n\n        this.camera.quaternion.rotateTowards(targetQuaternion, step)\n\n        this.updateOrientation()\n\n        if (q1.angleTo(q2) === 0) {\n            this.animating = false\n        }\n    }\n\n    setOrientation(orientation: GizmoOrientation) {\n        prepareAnimationData(this.camera, this.target, orientation)\n        this.animating = true\n        this.dispatchEvent({type: 'update', change: 'orientation'})\n    }\n\n    dispose() {\n        this.axesLines.geometry.dispose();\n        (this.axesLines.material as Material).dispose()\n\n        this.backgroundSphere.geometry.dispose();\n        (this.backgroundSphere.material as Material).dispose()\n\n        this.spritePoints.forEach((sprite) => {\n            sprite.material.map!.dispose()\n            sprite.material.dispose()\n        })\n\n        this.domContainer.remove()\n\n        // ;(this.controls as any)?.removeEventListener(\n        //     'change',\n        //     this.controlsChangeEvent.listener\n        // )\n    }\n}\n\nfunction getDomContainer(placement: DomPlacement, size: number) {\n    const div = document.createElement('div')\n    const style = div.style\n\n    style.height = `${size}px`\n    style.width = `${size}px`\n    style.borderRadius = '100%'\n    style.position = 'absolute'\n\n    const [y, x] = placement.split('-')\n\n    style.transform = ''\n    style.left = x === 'left' ? '0' : x === 'center' ? '50%' : ''\n    style.right = x === 'right' ? '0' : ''\n    style.transform += x === 'center' ? 'translateX(-50%)' : ''\n    style.top = y === 'top' ? '0' : y === 'bottom' ? '' : '50%'\n    style.bottom = y === 'bottom' ? '0' : ''\n    style.transform += y === 'center' ? 'translateY(-50%)' : ''\n\n    return div\n}\n\nfunction getAxesLines() {\n    const distance = 0.9\n    const position = Array(3)\n        .fill(0)\n        .map((_, i) => [\n            !i ? distance : 0,\n            i === 1 ? distance : 0,\n            i === 2 ? distance : 0,\n            0,\n            0,\n            0,\n        ])\n        .flat()\n    const color = Array(6)\n        .fill(0)\n        .map((_, i) =>\n            i < 2\n                ? axesColors[0].toArray()\n                : i < 4\n                    ? axesColors[1].toArray()\n                    : axesColors[2].toArray()\n        )\n        .flat()\n\n    // const geometry = new BufferGeometry()\n    // geometry.setAttribute(\n    //     'position',\n    //     new BufferAttribute(new Float32Array(position), 3)\n    // )\n    // geometry.setAttribute(\n    //     'color',\n    //     new BufferAttribute(new Float32Array(color), 3)\n    // )\n    const geometry = new LineSegmentsGeometry()\n    geometry.setPositions(position)\n    geometry.setColors(color)\n\n    return new LineSegments2(\n        geometry,\n        new LineMaterial({\n            linewidth: 0.02,\n            vertexColors: true,\n        })\n    )\n}\n\nfunction getBackgroundSphere() {\n    const geometry = new SphereGeometry(1.6)\n    const sphere = new Mesh(\n        geometry,\n        new MeshBasicMaterial({\n            color: 0xffffff,\n            side: BackSide,\n            transparent: true,\n            opacity: 0.2,\n            depthTest: false,\n        })\n    )\n\n    return sphere\n}\n\nfunction getAxesSpritePoints() {\n    const axes = ['x', 'y', 'z'] as const\n    return Array(6)\n        .fill(0)\n        .map((_, i) => {\n            const isPositive = i < 3\n            const sign = isPositive ? '+' : '-'\n            const axis = axes[i % 3]\n            const color = axesColors[i % 3]\n\n            const sprite = new Sprite(\n                getSpriteMaterial(color, isPositive ? axis : null)\n            )\n            sprite.userData.type = `${sign}${axis}`\n            sprite.scale.setScalar(isPositive ? 0.6 : 0.4)\n            sprite.position[axis] = isPositive ? 1.2 : -1.2\n            sprite.renderOrder = 1\n\n            return sprite\n        })\n}\n\nfunction getSpriteMaterial(color: Color, text: 'x' | 'y' | 'z' | null = null) {\n    const canvas = document.createElement('canvas')\n    const padding = 0\n    const scale = 1\n    const padding2 = 0 // has a bug\n\n    canvas.width = 128 * scale + 4 * padding + padding2 * 2\n    canvas.height = 64 * scale + 2 * padding + padding2 * 2\n\n    const context = canvas.getContext('2d', {alpha: true})!\n\n    context.beginPath()\n    context.arc(32 * scale + padding, 32 * scale + padding, 32 * scale - padding, 0, 2 * Math.PI)\n    context.closePath()\n    context.fillStyle = color.getStyle()\n    context.fill()\n\n    // for black border due to interpolation, transparent slightly bigger circle\n    context.beginPath()\n    context.arc(32 * scale + padding, 32 * scale + padding, 35 * scale - padding, 0, 2 * Math.PI)\n    context.closePath()\n    context.fillStyle = '#' + color.getHexString() + '01'\n    context.fill()\n\n    context.beginPath()\n    context.arc(96 * scale + padding * 3 + padding2, 32 * scale + padding + padding2, 32 * scale - padding - padding2, 0, 2 * Math.PI)\n    context.closePath()\n    context.fillStyle = '#FFF'\n    context.fill()\n\n    // for black border due to interpolation, transparent slightly bigger circle\n    context.beginPath()\n    context.arc(96 * scale + padding * 3 + padding2, 32 * scale + padding + padding2, 35 + scale - padding - padding2, 0, 2 * Math.PI)\n    context.closePath()\n    context.fillStyle = '#FFFFFF01'\n    context.fill()\n\n    if (text !== null) {\n        context.font = 'bold calc(44px * ' + scale + ') Arial'\n        context.textAlign = 'center'\n        context.fillStyle = '#111'\n        context.fillText(text.toUpperCase(), 32 * scale + padding, 48 * scale + padding)\n        context.fillText(text.toUpperCase(), 96 * scale + padding * 3 + padding2, 48 * scale + padding + padding2)\n    }\n\n    // canvas.style.background = '#ff0000'\n    const texture = new CanvasTexture(canvas)\n    texture.wrapS = texture.wrapT = RepeatWrapping\n    texture.repeat.x = 0.5\n    texture.colorSpace = SRGBColorSpace\n    texture.minFilter = LinearFilter\n    texture.magFilter = LinearFilter\n    texture.generateMipmaps = false\n    texture.needsUpdate = true\n\n\n    return new SpriteMaterial({\n        map: texture,\n        toneMapped: false,\n        transparent: true,\n    })\n}\n\nfunction prepareAnimationData(\n    camera: OrthographicCamera | PerspectiveCamera,\n    focusPoint: Vector3,\n    axis: GizmoOrientation\n) {\n    switch (axis) {\n    case '+x':\n        targetPosition.set(1, 0, 0)\n        targetQuaternion.setFromEuler(new Euler(0, Math.PI * 0.5, 0))\n        break\n\n    case '+y':\n        targetPosition.set(0, 1, 0)\n        targetQuaternion.setFromEuler(new Euler(-Math.PI * 0.5, 0, 0))\n        break\n\n    case '+z':\n        targetPosition.set(0, 0, 1)\n        targetQuaternion.setFromEuler(new Euler())\n        break\n\n    case '-x':\n        targetPosition.set(-1, 0, 0)\n        targetQuaternion.setFromEuler(new Euler(0, -Math.PI * 0.5, 0))\n        break\n\n    case '-y':\n        targetPosition.set(0, -1, 0)\n        targetQuaternion.setFromEuler(new Euler(Math.PI * 0.5, 0, 0))\n        break\n\n    case '-z':\n        targetPosition.set(0, 0, -1)\n        targetQuaternion.setFromEuler(new Euler(0, Math.PI, 0))\n        break\n\n    default:\n        console.error('ViewHelper: Invalid axis.')\n    }\n\n    setRadius(camera, focusPoint)\n    prepareQuaternions(camera, focusPoint)\n}\n\nfunction setRadius(camera: Camera, focusPoint: Vector3) {\n    radius = camera.position.distanceTo(focusPoint)\n}\n\nfunction prepareQuaternions(camera: Camera, focusPoint: Vector3) {\n    targetPosition.multiplyScalar(radius).add(focusPoint)\n\n    dummy.position.copy(focusPoint)\n\n    dummy.lookAt(camera.position)\n    q1.copy(dummy.quaternion)\n\n    dummy.lookAt(targetPosition)\n    q2.copy(dummy.quaternion)\n}\n\nfunction updatePointer(\n    e: PointerEvent|MouseEvent,\n    domRect: DOMRect,\n    orthoCamera: OrthographicCamera\n) {\n    mouse.x = (e.clientX - domRect.left) / domRect.width * 2 - 1\n    mouse.y = -((e.clientY - domRect.top) / domRect.height) * 2 + 1\n\n    raycaster.setFromCamera(mouse, orthoCamera)\n}\n\n// function isClick(\n//     e: PointerEvent,\n//     startCoords: Vector2,\n//     threshold = 2\n// ) {\n//     return (\n//         Math.abs(e.clientX - startCoords.x) < threshold &&\n//         Math.abs(e.clientY - startCoords.y) < threshold\n//     )\n// }\n\nfunction getIntersectionObject(\n    event: PointerEvent|MouseEvent,\n    domRect: DOMRect,\n    orthoCamera: OrthographicCamera,\n    intersectionObjects: Sprite[]\n) {\n    updatePointer(event, domRect, orthoCamera)\n\n    const intersects = raycaster.intersectObjects(intersectionObjects)\n\n    if (!intersects.length) return null\n\n    const intersection = intersects[0]\n    return intersection.object as Sprite\n}\n\nfunction resetSprites(sprites: Sprite[]) {\n    let i = sprites.length\n\n    while (i--) {\n        const scale = i < 3 ? 0.6 : 0.4\n        sprites[i].scale.set(scale, scale, scale)\n        sprites[i].material.map!.offset.x = 1\n    }\n    // sprites.forEach((sprite) => (sprite.material.map!.offset.x = 1));\n}\n\nfunction updateSpritesOpacity(sprites: Sprite[], camera: Camera) {\n    point.set(0, 0, 1)\n    point.applyQuaternion(camera.quaternion)\n\n    if (point.x >= 0) {\n        sprites[POS_X].material.opacity = 1\n        sprites[NEG_X].material.opacity = 0.5\n    } else {\n        sprites[POS_X].material.opacity = 0.5\n        sprites[NEG_X].material.opacity = 1\n    }\n\n    if (point.y >= 0) {\n        sprites[POS_Y].material.opacity = 1\n        sprites[NEG_Y].material.opacity = 0.5\n    } else {\n        sprites[POS_Y].material.opacity = 0.5\n        sprites[NEG_Y].material.opacity = 1\n    }\n\n    if (point.z >= 0) {\n        sprites[POS_Z].material.opacity = 1\n        sprites[NEG_Z].material.opacity = 0.5\n    } else {\n        sprites[POS_Z].material.opacity = 0.5\n        sprites[NEG_Z].material.opacity = 1\n    }\n}\n","import {CurvePath, Vector3} from 'three'\nimport {Serialization} from 'ts-browser-helpers'\n\nexport class CurvePath3 extends CurvePath<Vector3> {\n    override readonly type: string | 'CurvePath3'\n    constructor() {\n        super()\n        this.type = 'CurvePath3'\n    }\n    static {\n        Serialization.SerializableClasses.set('CurvePath3', CurvePath3)\n    }\n}\n","import {Vector3} from 'three'\nimport {Box3B} from '../math/Box3B'\nimport {ICamera, PerspectiveCamera2} from '../../core'\n\n/**\n * Find distance of camera at which the camera's fov fits the given bounding box dimensions\n * @param cam\n * @param box\n */\nexport function getFittingDistance(cam: ICamera, box: Box3B): number {\n    const size = box.getSize(new Vector3())\n    let cameraZ = 1\n    if (cam.isPerspectiveCamera && size.length() > 0.0001) {\n        const aspect = isFinite(cam.aspect) ? cam.aspect : 1\n        // get the max side of the bounding box (fits to width OR height as needed )\n        const fov = Math.max(1, (cam as PerspectiveCamera2).fov) * (Math.PI / 180)\n        const fovh = 2 * Math.atan(Math.tan(fov / 2) * aspect)\n        const dx = size.z / 2 + Math.abs(size.x / 2 / Math.tan(fovh / 2))\n        const dy = size.z / 2 + Math.abs(size.y / 2 / Math.tan(fov / 2))\n        cameraZ = Math.max(dx, dy)\n    }\n    return cameraZ\n}\n","import {\n    arrayBufferToBase64,\n    base64ToArrayBuffer,\n    deepAccessObject,\n    getTypedArray,\n    safeSetProperty,\n    Serialization,\n    Serializer,\n} from 'ts-browser-helpers'\nimport {\n    AnimationClip,\n    ArcCurve,\n    CanvasTexture,\n    CatmullRomCurve3,\n    Color,\n    CubeTexture,\n    CubicBezierCurve,\n    CubicBezierCurve3,\n    Curve,\n    CurvePath,\n    DataTexture,\n    EllipseCurve,\n    Euler,\n    LineCurve,\n    LineCurve3,\n    Material,\n    MaterialLoader,\n    Matrix2,\n    Matrix3,\n    Matrix4,\n    ObjectLoader,\n    Path,\n    QuadraticBezierCurve,\n    QuadraticBezierCurve3,\n    Quaternion,\n    Shape,\n    Source,\n    Spherical,\n    SplineCurve,\n    Texture,\n    Vector2,\n    Vector3,\n    Vector4,\n} from 'three'\nimport type {AssetImporter, AssetManager, BlobExt, IAssetImporter, ImportResultExtras} from '../assetmanager'\nimport type {ThreeViewer} from '../viewer'\nimport type {IMaterial, IObject3D, ITexture} from '../core'\nimport type {IRenderTarget, RenderManager} from '../rendering'\nimport {isNonRelativeUrl} from './browser-helpers'\nimport {textureToCanvas} from '../three'\n\nconst copier = (c: any) => (v: any, o: any) => o?.copy?.(v) ?? new c().copy(v)\n\nexport class ThreeSerialization {\n\n    static Primitives = [\n        [Vector2, 'isVector2', ['x', 'y'], 1],\n        [Vector3, 'isVector3', ['x', 'y', 'z'], 1],\n        [Vector4, 'isVector4', ['x', 'y', 'z', 'w'], 1],\n        [Quaternion, 'isQuaternion', ['x', 'y', 'z', 'w'], 1],\n        [Euler, 'isEuler', ['x', 'y', 'z', 'order'], 1],\n        [Color, 'isColor', ['r', 'g', 'b'], 1],\n        [Matrix2, 'isMatrix2', ['elements'], 1],\n        [Matrix3, 'isMatrix3', ['elements'], 1],\n        [Matrix4, 'isMatrix4', ['elements'], 1],\n        [Spherical, 'isSpherical', ['radius', 'phi', 'theta'], 1],\n        // todo Plane etc (has Vector2)\n    ] as const\n\n    static PrimitiveSerializer(cls: any, isType: string, props: string[]|Readonly<string[]>, priority = 1): Serializer {\n        return {\n            priority: priority,\n            isType: (obj: any) => obj?.[isType] /* || obj?.metadata?.type === cls.name*/,\n            serialize: (obj: any) => {\n                // if (!obj?.[isType]) throw new Error(`Expected a ${cls.name}`)\n                const ret = {[isType]: true}\n                for (const k of props) ret[k] = obj[k]\n                return ret\n            },\n            deserialize: copier(cls),\n            // @ts-expect-error type in next version\n            type: isType.startsWith('is') ? isType.slice(2) : cls.name,\n        }\n    }\n\n    static Texture: Serializer = {\n        priority: 2,\n        isType: (obj: any) => obj.isTexture || obj.metadata?.type === 'Texture',\n        serialize: (obj: any, meta?: SerializationMetaType) => {\n            if (!obj?.isTexture) throw new Error('Expected a texture')\n            if (obj.isRenderTargetTexture) return undefined // todo: support render targets\n            // if (obj.isRenderTargetTexture && !obj.userData?.serializableRenderTarget) return undefined\n            if (meta?.textures[obj.uuid]) return {uuid: obj.uuid, resource: 'textures'}\n            const imgData = obj.source.data\n            const hasRootPath = !obj.isRenderTargetTexture && obj.userData.rootPath && typeof obj.userData.rootPath === 'string' &&\n                isNonRelativeUrl(obj.userData.rootPath)\n            let res = {} as any\n            const ud = obj.userData\n            try { // need try catch here because of hasRootPath\n                if (hasRootPath) {\n                    if (obj.source.data) {\n                        if (!obj.userData.embedUrlImagePreviews) // todo make sure its only Texture, check for svg etc\n                            obj.source.data = null // handled in GLTFWriter2.processImage\n                        else {\n                            obj.source.data = textureToCanvas(obj, 16, obj.flipY) // todo: check flipY\n                        }\n                    }\n                }\n                obj.userData = {} // toJSON will call JSON.stringify, which will serialize userData\n                const meta2 = {images: {} as any} // in-case meta is undefined\n                res = obj.toJSON(meta || meta2)\n                if (!meta && res.image) res.image = hasRootPath && !obj.userData.embedUrlImagePreviews ? undefined : meta2.images[res.image]\n                res.userData = Serialization.Serialize(copyTextureUserData({}, ud), meta, false)\n            } catch (e) {\n                console.error('ThreeSerialization: Unable to serialize texture')\n                console.error(e)\n            }\n            obj.userData = ud // should be outside try catch\n            if (hasRootPath) {\n                if (meta && !obj.userData.embedUrlImagePreviews) delete meta.images[obj.source.uuid] // because its empty. uuid still stored in the texture.image\n                obj.source.data = imgData\n            }\n\n            if (meta?.textures && res && !res.resource) {\n                if (!meta.textures[res.uuid])\n                    meta.textures[res.uuid] = res\n                res = {uuid: res.uuid, resource: 'textures'}\n            }\n            return res\n        },\n        deserialize: (dat: any, obj: any, meta?: SerializationMetaType) => {\n            if (dat.isTexture) return dat\n            if (dat.resource === 'textures' && meta?.textures?.[dat.uuid]) return meta.textures[dat.uuid]\n\n            console.warn('Cannot deserialize texture into object like primitive, since textures need to be loaded asynchronously. Trying with ObjectLoader. Load events might not work properly.', dat, obj)\n            const loader = meta?._context.objectLoader ?? new ObjectLoader(meta?._context.assetImporter?.loadingManager)\n            const data = {...dat}\n            if (typeof data.image === 'string') {\n                if (!meta?.images) {\n                    console.error('ThreeSerialization: Cannot deserialize texture with image url without meta.images', data)\n                } else {\n                    data.image = meta.images[data.image]\n                }\n            }\n            if (!data.image || typeof data.image === 'string' || !data.image.isSource && !data.image.url) {\n                console.error('ThreeSerialization: Cannot deserialize texture', data)\n                return obj\n            }\n            let imageOnLoad: undefined | (()=>void)\n            if (meta && !data.image.isSource) {\n                if (!meta._context.imagePromises) meta._context.imagePromises = []\n                meta._context.imagePromises.push(new Promise<void>((resolve) => {\n                    imageOnLoad = resolve\n                }))\n            }\n            const sources = data.image.isSource ? {[data.image.uuid]: data.image as Source} : loader.parseImages([data.image], imageOnLoad)\n            data.image = Object.keys(sources)[0]\n            if (meta?.images) meta.images[data.image] = sources[data.image]\n            if (data.userData) data.userData = ThreeSerialization.Deserialize(data.userData, {}, meta)\n            const textures = loader.parseTextures([data], sources)\n            const uuid = Object.keys(textures)[0]\n            if (!uuid || !textures[uuid]) {\n                console.error('ThreeSerialization: Cannot deserialize texture', data)\n                return obj\n            }\n            if (meta?.textures) meta.textures[uuid] = textures[uuid]\n            return textures[uuid]\n        },\n    }\n\n    static SerializableMaterials = new Set<IMaterial['constructor']>()\n\n    static Material: Serializer = {\n        priority: 2,\n        isType: (obj: any) => obj.isMaterial || obj.metadata?.type === 'Material',\n        serialize: (obj: any, meta?: SerializationMetaType) => {\n            if (!obj?.isMaterial) throw new Error('Expected a material')\n            if (meta?.materials?.[obj.uuid]) return {uuid: obj.uuid, resource: 'materials'}\n\n            // serialize textures separately\n            const meta2 = meta ?? {textures: {}, images: {}}\n            const objTextures: any = {}\n            const tempTextures: any = {}\n\n            const propList = Object.keys(obj.constructor.MaterialProperties || obj) // todo use MapProperties? or iMaterialCommons.getMapsForMaterial\n            for (const k of propList) {\n                if (k.startsWith('__')) continue // skip private/internal textures/properties\n                const v = obj[k]\n                if (v?.isTexture) {\n                    const ser = Serialization.Serialize(v, meta2)\n                    objTextures[k] = ser\n                    tempTextures[k] = v\n                    obj[k] = ser ? {isTexture: true, toJSON: ()=> ser} : null // because of how threejs Material.toJSON serializes textures\n                }\n            }\n\n            // Serialize without userData because three.js tries to convert it to string. We are serializing it separately\n            const userData = obj.userData\n            obj.userData = {}\n            let res = {} as any\n            try {\n                res = obj.toJSON(meta || meta2, true) // copying userData is handled in toJSON, see MeshStandardMaterial2\n                serializeMaterialUserData(res, userData, meta)\n                res.userData.uuid = userData.uuid\n                // todo: override generator to mention that this is a custom serializer?\n                if (obj.constructor.TYPE) res.type = obj.constructor.TYPE // override type if specified as static property in the class\n                // Remove undefined values. Note that null values are kept.\n                for (const key of Object.keys(res)) if (res[key] === undefined) delete res[key]\n            } catch (e) {\n                console.error('ThreeSerialization: Unable to serialize material')\n                console.error(e)\n            }\n            obj.userData = userData\n            // Restore textures\n            for (const [k, v] of Object.entries(tempTextures)) {\n                obj[k] = v\n                delete tempTextures[k]\n            }\n\n            // Add material, textures, images to meta\n            // serialize textures are already added to meta by the texture serializer\n            if (res) {\n                if (meta) {\n                    for (const [k, v] of Object.entries(objTextures)) {\n                        if (v) res[k] = v // can be undefined because of RenderTargetTexture...\n                    }\n                    if (meta.materials) {\n                        if (!meta.materials[res.uuid])\n                            meta.materials[res.uuid] = res\n                        res = {uuid: res.uuid, resource: 'materials'}\n                    }\n                } else {\n                    for (const [k, v] of Object.entries(objTextures)) {\n                        if (v) res[k] = (v as any).uuid // to remain compatible with how three.js saves\n                    }\n                    res.textures = Object.values(meta2.textures)\n                    res.images = Object.values(meta2.images)\n                }\n            }\n            return res\n        },\n        deserialize: (dat: any, obj: any, meta?: SerializationMetaType) => {\n            function finalCopy(material: Material) {\n                if (material.isMaterial) {\n                    if (obj?.isMaterial && obj.uuid === material.uuid) {\n                        if (obj !== material && typeof obj.setValues === 'function') {\n                            console.warn('ThreeSerialization: Material uuid already exists, copying values to old material')\n                            obj.setValues(material)\n                        }\n                        return obj\n                    } else {\n                        return material\n                    }\n                }\n                return undefined\n            }\n\n            let ret = finalCopy(dat)\n            if (ret !== undefined) return ret\n            if (dat.resource === 'materials' && meta?.materials?.[dat.uuid]) {\n                ret = finalCopy(meta.materials[dat.uuid])\n                if (ret !== undefined) return ret\n                console.error('ThreeSerialization: cannot find material in meta', dat, ret)\n            }\n\n            const type = dat.type\n            if (!type) {\n                console.error('ThreeSerialization: Cannot deserialize material without type', dat)\n                return obj\n            }\n\n            const data = {...dat} as Record<string, any>\n            if (data.userData) data.userData = Serialization.Deserialize(data.userData, undefined, meta, false)\n            //\n            const textures: Record<string, Texture> = {}\n            for (const [k, v] of Object.entries(data)) { // for textures\n                if (typeof v === 'string' && meta?.textures?.[v]) {\n                    data[k] = meta.textures[v]\n                    textures[k] = meta.textures[v]\n                }\n                if (!v || !v.resource || typeof v.resource !== 'string') continue\n                const resource = meta?.[v.resource as 'textures'|'extras']?.[v.uuid]\n                data[k] = resource || null\n                if (v.resource === 'textures' && resource?.isTexture) {\n                    textures[k] = resource\n                }\n            }\n\n            // we have 2 options, either obj is null or it is a material.\n            // if the material is not the same type, we can't use it, should we throw an error or create a new material and assign it. maybe a warning and create a new material?\n            // to create a material, we need to know the type, type->material initialization can be done in either material manager or MaterialLoader\n\n            // data has deserialized textures and userData, assuming the rest can be deserialized by material.fromJSON\n\n            if (!obj || !obj.isMaterial || obj.type !== type && obj.constructor?.TYPE !== type) {\n                if (obj && Object.keys(obj).length) console.warn('ThreeSerialization: Material type mismatch during deserialize, creating a new material', obj, data, type, obj.constructor?.type)\n                obj = null\n            }\n\n            // if obj is not null\n            if (obj && (!data.uuid || obj.uuid === data.uuid)) {\n                if (obj.fromJSON) obj.fromJSON(data, meta, true)\n                else if (obj.setValues) obj.setValues(data)\n                else console.error('ThreeSerialization: Cannot deserialize material, no fromJSON or setValues method', obj, data)\n                return obj\n            }\n\n            // obj is null or type mismatch, so ignore obj and create a new material\n\n            // find a material class with the type registered in SerializableMaterials\n            const uuid = dat.isMaterial ? undefined : dat.uuid\n            let template = null as IMaterial['constructor'] | null\n            for (const m of ThreeSerialization.SerializableMaterials) {\n                if (m.TYPE === type) {\n                    template = m\n                    break\n                }\n            }\n            if (!template) {\n                for (const m of ThreeSerialization.SerializableMaterials) {\n                    if (m.TypeAlias?.includes(type)) {\n                        template = m\n                        break\n                    }\n                }\n            }\n            if (template) {\n                const material = new template()\n                if (material) {\n                    if (uuid) {\n                        safeSetProperty(material, 'uuid', uuid, true, true)\n                    }\n                    if (material.fromJSON) material.fromJSON(data, meta, true)\n                    else if (material.setValues) material.setValues(data)\n                    else console.error('ThreeSerialization: Cannot deserialize material, no fromJSON or setValues method', material, data)\n                    return material\n                }\n            }\n\n            // todo use loader from context to load instead of this\n            console.warn('Legacy three.js material deserialization')\n\n            // normal three.js material\n            const loader = new MaterialLoader()\n            for (const [k, v] of Object.entries(textures)) {\n                data[k] = v.uuid\n            }\n            const texs = {...loader.textures}\n            loader.setTextures(textures)\n            const mat = loader.parse(data)\n            if (data.uuid) {\n                safeSetProperty(mat, 'uuid', data.uuid, true, true)\n            }\n            loader.setTextures(texs)\n\n            ret = finalCopy(mat)\n            if (ret !== undefined) return ret\n            console.error('ThreeSerialization: cannot deserialize material', dat, ret, mat)\n\n        },\n    }\n\n    static RenderTarget: Serializer = {\n        priority: 2,\n        isType: (obj: any) => obj.isWebGLRenderTarget || obj.metadata?.type === 'RenderTarget',\n        serialize: (obj: IRenderTarget, meta?: SerializationMetaType) => {\n            if (!obj?.isWebGLRenderTarget || !obj.uuid) throw new Error('Expected a IRenderTarget')\n            if (meta?.extras[obj.uuid]) return {uuid: obj.uuid, resource: 'extras'}\n\n            // This is for the class implementing IRenderTarget, check {@link RenderTargetManager} for class implementation\n            const tex = Array.isArray(obj.texture) ? obj.texture[0] : obj.texture\n            let res: any = {\n                metadata: {type: 'RenderTarget'},\n                uuid: obj.uuid,\n                width: obj.width,\n                height: obj.height,\n                depth: obj.depth,\n                sizeMultiplier: obj.sizeMultiplier,\n                count: Array.isArray(obj.texture) ? obj.texture.length : undefined,\n                isCubeRenderTarget: obj.isWebGLCubeRenderTarget || undefined,\n                isTemporary: obj.isTemporary,\n                textureName: Array.isArray(obj.texture) ? obj.texture.map(t => t.name) : obj.texture?.name,\n                options: {\n                    wrapS: tex?.wrapS,\n                    wrapT: tex?.wrapT,\n                    magFilter: tex?.magFilter,\n                    minFilter: tex?.minFilter,\n                    format: tex?.format,\n                    type: tex?.type,\n                    anisotropy: tex?.anisotropy,\n                    depthBuffer: !!obj.depthBuffer,\n                    stencilBuffer: !!obj.stencilBuffer,\n                    generateMipmaps: tex?.generateMipmaps,\n                    depthTexture: !!obj.depthTexture,\n                    colorSpace: tex?.colorSpace,\n                    samples: obj.samples,\n                },\n            }\n\n            if (meta?.extras) {\n                if (!meta.extras[res.uuid])\n                    meta.extras[res.uuid] = res\n                res = {uuid: res.uuid, resource: 'extras'}\n            }\n            return res\n        },\n        deserialize: (dat: any, obj: any, meta?: SerializationMetaType) => {\n            if (obj?.uuid === dat.uuid) return obj\n            if (dat.isWebGLRenderTarget) return dat\n\n            const renderManager = meta?._context.renderManager\n            if (!renderManager) {\n                console.error('ThreeSerialization: Cannot deserialize render target without render manager', dat)\n                return obj\n            }\n            if (dat.isWebGLCubeRenderTarget || dat.isTemporary) {\n                // todo support cube, temporary render target here\n                console.warn('ThreeSerialization: Cannot deserialize WebGLCubeRenderTarget or temporary render target yet', dat)\n                return obj\n            }\n\n            const res = renderManager.createTarget({\n                sizeMultiplier: dat.sizeMultiplier || undefined,\n                size: dat.sizeMultiplier ? undefined : {width: dat.width, height: dat.height},\n                textureCount: dat.count,\n                ...dat.options,\n            })\n            if (dat.textureName) {\n                if (Array.isArray(dat.textureName) && Array.isArray(res.texture)) {\n                    for (let i = 0; i < dat.textureName.length; i++) {\n                        res.texture[i].name = dat.textureName[i]\n                    }\n                } else if (!Array.isArray(res.texture)) {\n                    res.texture.name = Array.isArray(dat.textureName) ? dat.textureName[0] : dat.textureName\n                }\n            }\n            if (!res) return res\n            res.uuid = dat.uuid\n            if (meta?.extras) meta.extras[dat.uuid] = res\n            return res\n        },\n    }\n\n    private static _init = false\n\n    static Init() {\n        if (this._init) return\n        this._init = true\n        // @ts-expect-error not sure why it's not set in three.js\n        Spherical.prototype.isSpherical = true\n        Serialization.RegisterSerializer(...ThreeSerialization.Primitives.map(p=>ThreeSerialization.PrimitiveSerializer(p[0], p[1], p[2], p[3])))\n        Serialization.RegisterSerializer(ThreeSerialization.Texture)\n        Serialization.RegisterSerializer(ThreeSerialization.Material)\n        Serialization.RegisterSerializer(ThreeSerialization.RenderTarget)\n\n        // these classes have toJSON/fromJSON and .type\n        Serialization.SerializableClasses.set('Shape', Shape) // todo this could be large, it should be a resource in meta for duplicates\n        Serialization.SerializableClasses.set('Curve', Curve)\n        Serialization.SerializableClasses.set('CurvePath', CurvePath)\n        Serialization.SerializableClasses.set('Path', Path)\n        Serialization.SerializableClasses.set('ArcCurve', ArcCurve)\n        Serialization.SerializableClasses.set('CatmullRomCurve3', CatmullRomCurve3)\n        Serialization.SerializableClasses.set('CubicBezierCurve', CubicBezierCurve)\n        Serialization.SerializableClasses.set('CubicBezierCurve3', CubicBezierCurve3)\n        Serialization.SerializableClasses.set('EllipseCurve', EllipseCurve)\n        Serialization.SerializableClasses.set('LineCurve', LineCurve)\n        Serialization.SerializableClasses.set('LineCurve3', LineCurve3)\n        Serialization.SerializableClasses.set('QuadraticBezierCurve', QuadraticBezierCurve)\n        Serialization.SerializableClasses.set('QuadraticBezierCurve3', QuadraticBezierCurve3)\n        Serialization.SerializableClasses.set('SplineCurve', SplineCurve)\n        Serialization.SerializableClasses.set('AnimationClip', AnimationClip)\n        // Serialization.SerializableClasses.set('Skeleton', Skeleton) // doesnt have .type. todo add to three.js\n    }\n\n    static MakeSerializable(constructor: ObjectConstructor, type: string, props?: (string|[string, string])[]) {\n        (constructor.prototype as any).serializableClassId = type\n        Serialization.SerializableClasses.set(type, constructor)\n        if (props) Serialization.TypeMap.set(constructor, props.map(p=>typeof p === 'string' ? [p, p] : p))\n    }\n\n    /**\n     * Serialize an object\n     * {@link Serialization.Serialize}\n     */\n    static Serialize(obj: any, meta?: Partial<SerializationMetaType>, isThis = false) {\n        if (!this._init) this.Init()\n        return Serialization.Serialize(obj, meta, isThis)\n    }\n\n    /**\n     * Deserialize an object\n     * {@link Serialization.Deserialize}\n     */\n    static Deserialize(data: any, obj: any, meta?: Partial<SerializationMetaType>, isThis = false) {\n        if (!this._init) this.Init()\n        return Serialization.Deserialize(data, obj, meta, isThis)\n    }\n\n}\n\n/**\n * Deep copy/clone from source to dest, assuming both are userData objects for three.js objects/materials/textures etc.\n * This will clone any property that can be cloned (apart from Object3D, Texture, Material) and deep copy the objects and arrays.\n * @note Keep synced with copyMaterialUserData in three.js -> Material.js todo: merge these functions? by putting this inside three.js?\n * @param dest\n * @param source\n * @param ignoredKeysInRoot - keys to ignore in the root object\n */\nexport function copyUserData(dest: any, source: any, ignoredKeysInRoot: (string|symbol)[] = []): any {\n    if (!source) return dest\n    for (const key of Object.keys(source)) {\n        if (ignoredKeysInRoot.includes(key)) continue\n        if (key.startsWith('__')) continue // double underscore\n        const src = source[key]\n        if (typeof dest[key] === 'function' || typeof src === 'function') continue\n        const skipClone = !src || src.isTexture || src.isObject3D || src.isMaterial || src.isBufferGeometry || src.userDataSkipClone\n        if (!skipClone && typeof src.clone === 'function')\n            dest[key] = src.clone()\n        // else if (!skipClone && (typeof src === 'object' || Array.isArray(src)))\n        else if (!skipClone && (src.constructor === Object || Array.isArray(src)))\n            dest[key] = copyUserData(Array.isArray(src) ? [] : {}, src, [])\n        else\n            dest[key] = src\n    }\n    return dest\n}\n\n/**\n * Deep copy/clone from source to dest, assuming both are userData objects in Textures.\n * Same as {@link copyUserData} but ignores uuid in the root object.\n * @param dest\n * @param source\n * @param ignoredKeysInRoot\n */\nexport function copyTextureUserData(dest: any, source: any, ignoredKeysInRoot = ['uuid']): any {\n    return copyUserData(dest, source, ignoredKeysInRoot)\n}\n\n\n/**\n * Deep copy/clone from source to dest, assuming both are userData objects in Materials.\n * Same as {@link copyUserData} but ignores uuid in the root object.\n * @note Keep synced with copyMaterialUserData in three.js -> Material.js\n * @param dest\n * @param source\n * @param ignoredKeysInRoot\n */\nexport function copyMaterialUserData(dest: any, source: any, ignoredKeysInRoot = ['uuid']): any {\n    return copyUserData(dest, source, ignoredKeysInRoot)\n}\n\n\n/**\n * Deep copy/clone from source to dest, assuming both are userData objects in Object3D.\n * Same as {@link copyUserData} but ignores uuid in the root object.\n * @param dest\n * @param source\n * @param ignoredKeysInRoot\n */\nexport function copyObject3DUserData(dest: any, source: any, ignoredKeysInRoot = ['uuid']): any {\n    return copyUserData(dest, source, ignoredKeysInRoot)\n}\n\n/**\n * Serialize userData and sets to data.userData. This is required because three.js Material.toJSON does not serialize userData.\n * @param data\n * @param userData\n * @param meta\n */\nfunction serializeMaterialUserData(data: any, userData: any, meta?: SerializationMetaType) {\n    data.userData = {}\n\n    copyMaterialUserData(data.userData, userData)\n\n    // Serialize the userData\n    const meta2 = meta || { // Make meta object for the Serializer from the data. This requires changing from Array to Object for textures and images\n        textures: Object.fromEntries(data.textures?.map((t: any) => [t.uuid, t]) || []),\n        images: Object.fromEntries(data.images?.map((t: any) => [t.uuid, t]) || []),\n    }\n    data.userData = Serialization.Serialize(data.userData, meta2) // here meta is required for textures otherwise images will be lost. Material.toJSON sets the result as meta if not provided.\n    if (!meta) {\n        // Add textures and images to the result if meta is not provided. This is to remain compatible with how three.js saves materials. See (MaterialLoader and JSONMaterialLoader)\n        if (Object.keys(meta2.textures).length > 0) data.textures = Object.values(meta2.textures)\n        if (Object.keys(meta2.images).length > 0) data.images = Object.values(meta2.images)\n    }\n}\n\n/**\n * Converts array buffers to base64 strings in meta.\n * This is useful when storing .json files, as storing as number arrays takes a lot of space.\n * Used in viewer.toJSON()\n * @param meta\n */\nexport function convertArrayBufferToStringsInMeta(meta: SerializationMetaType) {\n    Object.values(meta).forEach((res: any) => { // similar to processViewer in gltf export.\n        if (res) Object.values(res).forEach((item: any) => {\n            if (!item.url) return\n            // console.log(item.url)\n            if (!(item.url.data instanceof ArrayBuffer) && !Array.isArray(item.url.data)) return\n            if (item.url.type === 'Uint16Array') {\n                if (!(item.url.data instanceof Uint16Array)) { // because it can be a typed array\n                    item.url.data = new Uint16Array(item.url.data)\n                }\n                item.url.data = 'data:application/octet-stream;base64,' + arrayBufferToBase64(item.url.data.buffer)\n            } else if (item.url.type === 'Uint8Array') {\n                if (!(item.url.data instanceof Uint8Array)) { // because it can be a typed array\n                    item.url.data = new Uint8Array(item.url.data)\n                }\n                // todo: just use jpeg or PNG encoding for this ?\n                item.url.data = 'data:application/octet-stream;base64,' + arrayBufferToBase64(item.url.data.buffer)\n            } else if (item.url.data instanceof ArrayBuffer) {\n                item.url.data = 'data:application/octet-stream;base64,' + arrayBufferToBase64(item.url.data.buffer)\n            } else {\n                console.warn('Unsupported buffer type', item.url.type)\n            }\n        })\n    })\n}\n\n/**\n * Converts strings(base64 or utf-8) to array buffers in meta. This is the reverse of {@link convertArrayBufferToStringsInMeta}\n * Used in viewer.fromJSON()\n */\nexport function convertStringsToArrayBuffersInMeta(meta: SerializationMetaType) {\n    Object.values(meta).forEach((res: any) => { // similar to processViewer in gltf export.\n        if (res) Object.values(res).forEach((item: any) => {\n            if (!item || !item.url) return\n            if (typeof item.url.data !== 'string') return\n\n            // base64 data uri or any mime type\n            // console.log(item.url.data?.match?.(/^data:.*;base64,(.*)$/))\n            const dataUriMatch = item.url.data.match(/^data:.*;base64,(.*)$/)\n            if (dataUriMatch?.[1]) {\n                item.url.data = base64ToArrayBuffer(dataUriMatch?.[1])\n            } else { // utf-8 string, not used at the moment\n                if (item.url.type !== 'Uint8Array') {\n                    console.error('ThreeSerialization: Unsupported buffer type string for ', item.url.type, 'use base64')\n                }\n                item.url.data = new TextEncoder().encode(item.url.data).buffer // todo: this doesnt work in ie/edge maybe, but this feature is not used.\n            }\n\n        })\n    })\n}\n\nexport function getEmptyMeta(res?: Partial<SerializationResourcesType>): SerializationMetaType {\n    return { // see Object3D.js toJSON for more details\n        geometries: {...res?.geometries},\n        materials: {...res?.materials},\n        textures: {...res?.textures},\n        images: {...res?.images},\n        shapes: {...res?.shapes},\n        skeletons: {...res?.skeletons},\n        animations: {...res?.animations},\n        extras: {...res?.extras},\n        typed: {...res?.typed},\n        _context: {},\n    }\n}\n\nexport interface SerializationResourcesType {\n    geometries: Record<string, any>,\n    materials: Record<string, any>,\n    textures: Record<string, any>,\n    images: Record<string, any>,\n    shapes: Record<string, any>,\n    skeletons: Record<string, any>,\n    animations: Record<string, any>,\n    extras: Record<string, any>,\n    typed: Record<string, any>,\n    object?: any, // todo what is this used for?\n\n    [key: string]: any,\n\n}\nexport interface SerializationMetaType extends SerializationResourcesType {\n    _context: {\n        assetImporter?: AssetImporter,\n        objectLoader?: ObjectLoader,\n        assetManager?: AssetManager,\n        renderManager?: RenderManager,\n\n        imagePromises?: Promise<any>[],\n        viewer?: ThreeViewer,\n\n        [key: string]: any,\n    }\n\n    __isLoadedResources?: boolean\n\n}\nexport class MetaImporter {\n\n    /**\n     * @param json\n     * @param extraResources - preloaded resources in the format of viewer config resources.\n     */\n    static async ImportMeta(json: SerializationMetaType, extraResources?: Partial<SerializationResourcesType>) {\n        // console.log(json)\n        if (json.__isLoadedResources) return json\n\n        const resources: SerializationMetaType = metaFromResources()\n        resources.__isLoadedResources = true\n        resources._context = json._context\n\n        convertStringsToArrayBuffersInMeta(json)\n\n        // console.log(viewerConfig)\n        const assetImporter = json._context.assetImporter\n        if (!assetImporter) throw new Error('assetImporter not found in meta context, which is required for import meta.')\n\n        const objLoader = json._context.objectLoader || new ObjectLoader(assetImporter.loadingManager)\n\n        // see ObjectLoader.parseAsync\n        resources.animations = json.animations ? objLoader.parseAnimations(Object.values(json.animations)) : {}\n        if (extraResources && extraResources.animations) resources.animations = {...resources.animations, ...extraResources.animations}\n\n        resources.shapes = json.shapes ? objLoader.parseShapes(Object.values(json.shapes)) : {}\n        if (extraResources && extraResources.shapes) resources.shapes = {...resources.shapes, ...extraResources.shapes}\n\n        resources.geometries = json.geometries ? objLoader.parseGeometries(Object.values(json.geometries), resources.shapes) : {}\n        if (extraResources && extraResources.geometries) resources.geometries = {...resources.geometries, ...extraResources.geometries}\n\n        resources.images = json.images ? await objLoader.parseImagesAsync(Object.values(json.images)) : {} // local images only like data url and data textures\n        if (extraResources && extraResources.images) resources.images = {...resources.images, ...extraResources.images}\n\n        // const onLoad = () => { // todo: do it after all the images not after one\n        //     Object.values(resources.textures).forEach((t: any) => {\n        //         if (t.isTexture && t.image?.complete) t.needsUpdate = true\n        //     })\n        // }\n\n        if (Array.isArray(json.textures)) {\n            console.error('ThreeSerialization: TODO: check file format')\n            json.textures = json.textures.reduce((acc, cur) => {\n                if (!cur) return acc\n                acc[cur.uuid] = cur\n                return acc\n            })\n        }\n\n        await MetaImporter.LoadRootPathTextures({textures: json.textures, images: resources.images}, assetImporter)\n\n        // console.log(json.textures)\n        const textures = []\n        for (const texture of Object.values(json.textures)) {\n            const tex = {...texture}\n            if (tex.userData) tex.userData = ThreeSerialization.Deserialize(tex.userData, {}, resources)\n            textures.push(tex)\n        }\n        resources.textures = json.textures ? objLoader.parseTextures(textures, resources.images) : {}\n\n        for (const key1 of Object.keys(resources.textures)) {\n            let tex: Texture|undefined = resources.textures[key1]\n            if (!tex) continue\n            // __texCtor is set in MetaImporter.LoadRootPathTextures\n            if (tex.source.__texCtor) {\n                const newTex: Texture = new tex.source.__texCtor(tex.source.data)\n                if (!newTex || typeof newTex.copy !== 'function') continue\n                newTex.copy(tex)\n                delete tex.source.__texCtor\n                resources.textures[key1] = newTex\n                tex = newTex\n            }\n            if (tex.source.data instanceof HTMLCanvasElement && !(tex as CanvasTexture).isCanvasTexture) {\n                const newTex = new CanvasTexture(tex.source.data).copy(tex)\n                resources.textures[key1] = newTex\n                tex = newTex\n            }\n        }\n\n        // replace the source of the textures(which has preview) with the loaded images, see {@link LoadRootPathTextures} for `rootPathPromise`\n        // todo: should this be moved after processRaw?\n        const textures2 = {...resources.textures}\n        for (const inpTexture of Object.values(json.textures)) {\n            inpTexture.rootPathPromise?.then((v: Source|null) => {\n                if (!v) return\n                const texture = textures2[inpTexture.uuid]\n                texture.dispose()\n                texture.source = v\n                texture.source.needsUpdate = true\n                texture.needsUpdate = true\n            })\n        }\n\n        for (const entry of Object.entries(resources.textures)) {\n            entry[1] = await assetImporter.processRawSingle(entry[1], {})\n            if (entry[1]) resources.textures[entry[0]] = entry[1]\n            else delete resources.textures[entry[0]]\n        }\n        if (extraResources && extraResources.textures) resources.textures = {...resources.textures, ...extraResources.textures}\n\n\n        const jsonMats: any[] = json.materials ? Object.values(json.materials) : []\n        resources.materials = {}\n        for (const material of jsonMats) {\n            if (!material?.uuid) continue\n            // Object.entries(material).forEach(([k, data]: [string, any]) => {\n            //     if (data && data.resource && data.uuid && data.resource === 'textures') { // for textures put in by serialize.ts\n            //         material[k] = data.uuid\n            //     }\n            // })\n            resources.materials[material.uuid] = ThreeSerialization.Deserialize(material, undefined, resources)\n        }\n        if (extraResources && extraResources.materials) resources.materials = {...resources.materials, ...extraResources.materials}\n\n        if (json.object) {\n            resources.object = objLoader.parseObject(json.object, resources.geometries, resources.materials, resources.textures, resources.animations)\n            if (json.skeletons) {\n                resources.skeletons = objLoader.parseSkeletons(Object.values(json.skeletons), resources.object as any)\n                objLoader.bindSkeletons(resources.object as any, resources.skeletons)\n            }\n        }\n\n        if (json.extras) {\n            resources.extras = json.extras\n            for (const e of (Object.values(json.extras) as any as any[])) { // todo parallel import\n                if (!e.uuid) continue\n                if (!e.url) {\n                    resources.extras[e.uuid] = ThreeSerialization.Deserialize(e, undefined, resources)\n                    continue\n                }\n                // see LUTCubeTextureWrapper, KTX2LoadPlugin for sample use\n                if (typeof e.url === 'string') {\n                    const r = await assetImporter.importSingle(e.url, e.userData?.rootPathOptions || {}) // todo rootPathOptions is not being set when exporting extras right now\n                    if (r) resources.extras[e.uuid] = r\n                } else if (e.url.data) {\n                    const file = new File([getTypedArray(e.url.type, e.url.data)], e.url.path)\n                    const r = await assetImporter.importSingle({path: file.name, file}, e.userData?.rootPathOptions || {}, undefined, false) // false is passed to mark it as external\n                    // todo: userdata? name? other properties?\n                    if (r) resources.extras[e.uuid] = r\n                } else {\n                    console.warn('invalid URL type while loading extra resource')\n                }\n            }\n            // console.log(resources.extras)\n        }\n        if (extraResources && extraResources.extras) resources.extras = {...resources.extras, ...extraResources.extras}\n\n        resources.typed = {}\n        if (json.typed) {\n            for (const [key, item] of Object.entries(json.typed)) {\n                if (typeof item.rootPath === 'string' && item.external) { // todo parallel import\n                    const r = await assetImporter.importSingle(item.rootPath, item.rootPathOptions || {})\n                    if (r) resources.typed[key] = r\n                } else {\n                    resources.typed[key] = ThreeSerialization.Deserialize(item, undefined, resources)\n                }\n            }\n        }\n        if (extraResources && extraResources.typed) resources.typed = {...resources.typed, ...extraResources.typed}\n\n        // console.log(resources, json)\n        return resources\n    }\n\n\n    // todo see _loadObjectDependencies2\n    static async LoadRootPathTextures({textures, images}: Pick<SerializationMetaType, 'textures'|'images'>, importer: IAssetImporter, usePreviewImages = true) {\n        const pms = []\n\n        for (const inpTexture of Array.isArray(textures) ? textures : Object.values(textures ?? {} as any) as any as any[]) {\n            const path = inpTexture?.userData?.rootPath\n            const hasImage = usePreviewImages && inpTexture.image && images[inpTexture.image] // its possible to have both image and rootPath, then the image will be preview image.\n            if (!path) continue\n            const promise = importer.importSingle<ITexture>(path, inpTexture.userData.rootPathOptions || {}).then((texture) => {\n                const source = texture?.source as any\n                if (!texture || !texture.isTexture || !source) {\n                    console.error('AssetImporter: Imported rootPath is not a Texture', path, texture)\n                    return\n                }\n                // console.log(typeof image)\n                const source2 = new Source(source.data)\n                if (inpTexture.image) source2.uuid = inpTexture.image\n                inpTexture.image = source2.uuid\n\n                // only these are supported by ObjectLoader.parseTextures, see parseTextures2\n                if (texture.constructor !== Texture && texture.constructor !== DataTexture && texture.constructor !== CubeTexture) {\n                    source2.__texCtor = texture.constructor as typeof Texture\n                }\n\n                if (!hasImage) images[source2.uuid] = source2\n\n                texture.dispose()\n                return source2\n            }).catch((e) => {\n                console.error('ThreeSerialization: Error loading texture from rootPath', inpTexture.userData.rootPath)\n                console.error(e)\n                delete inpTexture.userData.rootPath\n                return null\n            })\n            if (hasImage) inpTexture.rootPathPromise = promise\n            else pms.push(promise)\n        }\n\n        await Promise.allSettled(pms)\n    }\n\n}\n\nexport function metaToResources(meta?: SerializationMetaType): Partial<SerializationResourcesType> {\n    if (!meta) return {}\n    const res: Partial<SerializationResourcesType> = {...meta}\n    if (res._context) delete res._context\n    return res\n}\n\nexport function mergeResources(target: Partial<SerializationResourcesType>, source: Partial<SerializationResourcesType>) {\n    for (const key of Object.keys(source)) {\n        if (key === 'object') continue\n        if (!target[key]) target[key] = {}\n        Object.assign(target[key]!, source[key]!)\n    }\n    return target\n}\n\nexport function metaFromResources(resources?: Partial<SerializationResourcesType>, viewer?: ThreeViewer): SerializationMetaType {\n    return {\n        ...resources,\n        ...getEmptyMeta(resources),\n        _context: {\n            assetManager: viewer?.assetManager,\n            assetImporter: viewer?.assetManager.importer,\n            renderManager: viewer?.renderManager,\n            viewer: viewer,\n        }, // clear context even if its present in resources\n    }\n}\n\nexport function jsonToBlob(json: any): BlobExt {\n    const b = new Blob([JSON.stringify(json)], {type: 'application/json'}) as BlobExt\n    b.ext = 'json'\n    return b\n}\n\n/**\n * Used in {@link LUTCubeTextureWrapper} and {@link KTX2LoadPlugin} and imported in {@link ThreeViewer.loadConfigResources}\n * @param texture\n * @param meta\n * @param name\n * @param mime\n */\nexport function serializeTextureInExtras(texture: ITexture & ImportResultExtras, meta: any, name?: string, mime?: string) {\n    if (meta?.extras[texture.uuid]) return {uuid: texture.uuid, resource: 'extras'}\n\n    let url: any = ''\n    if (texture.source?._sourceImgBuffer || texture.__sourceBuffer) {\n        // serialize blob to data in image.\n        // Note: do not change to Uint16Array because it's encoded to rgbe in `processViewer`\n        const data = new Uint8Array(texture.source?._sourceImgBuffer || texture.__sourceBuffer as ArrayBuffer)\n        const mimeType = mime || texture.userData.mimeType || ''\n        url = {\n            data: Array.from(data), // texture need to be a normal array, not a typed array.\n            type: data.constructor.name,\n            path: texture.userData.__sourceBlob?.name || texture.userData.rootPath || 'file.' + mimeType.split('/')[1],\n        }\n        if (mimeType) url.mimeType = mimeType\n    } else if (texture.userData.rootPath) {\n        url = texture.userData.rootPath\n    } else {\n        console.error('ThreeSerialization: Unable to serialize LUT texture, not loaded through asset manager.')\n    }\n\n    const tex = {\n        uuid: texture.uuid,\n        url,\n        userData: copyTextureUserData({}, texture.userData),\n        type: texture.type,\n        name: name || texture.name,\n    }\n    if (meta?.extras) {\n        meta.extras[texture.uuid] = tex\n        return {uuid: texture.uuid, resource: 'extras'}\n    }\n    return tex\n}\n\ndeclare module 'three'{\n    export interface Source{\n        ['__texCtor']?: typeof Texture\n    }\n}\n\n\nexport function getPartialProps(obj: IObject3D|IMaterial, props1?: string[]) {\n    // copy properties from res1 to obj except those in sProperties\n    const props: Record<string, any> = {}\n    const sProps = Array.isArray(props1) ? props1 : []\n    for (const sProp of sProps) {\n        const deep = sProp.startsWith('userData.')\n        let res2\n        if (deep) {\n            res2 = deepAccessObject(sProp.slice('userData.'.length), obj.userData, false)\n        } else {\n            res2 = (obj as any)[sProp]\n        }\n        if (res2 !== undefined) {\n            props[sProp] = res2\n        }\n    }\n    return props\n}\n\nexport function setPartialProps(props: Record<string, any>, obj: IMaterial|IObject3D) {\n    for (const sProp of Object.keys(props)) {\n        const value = props[sProp]\n        const deep = sProp.startsWith('userData.')\n        if (!deep) {\n            (obj as any)[sProp] = value\n        } else {\n            const tar = obj.userData\n            const parts = sProp.split('.')\n            const tarkey = parts.slice(1, -1)\n            const tar2 = parts.length && tarkey.length ? deepAccessObject(tarkey, tar, false) : undefined\n            if (tar2 !== undefined) {\n                const key = parts[parts.length - 1]\n                tar2[key] = value\n            } else {\n                // todo for userData deep property it will fail since parent object wouldnt exist in empty object. we need to create the empty target recursively if it doesnt exists\n                console.warn('ThreeSerialization: setSProps: invalid sProperty', sProp, 'in', obj)\n            }\n        }\n    }\n}\n\n","const warnEnabled = true // todo use ThreeViewer.ViewerDebugging\nconst errorStr1 = 'shaderReplaceString: str must be passed if str is a RegExp and append/prepend is true'\n/**\n * Replace a string in a shader function with added options to prepend, append, show warning when not found, and replace all occurrences.\n * @param shader - shader code\n * @param str - string to replace\n * @param newStr - new string to replace with\n * @param replaceAll - replace all occurrences\n * @param prepend - prepend new string to old string\n * @param append - append new string to old string\n * @param _str - optional string to use for replacement. This must be passed if str is a RegExp and append/prepend is true\n * @param warn - log an error in the console when unable to find the find string\n */\nexport function shaderReplaceString(shader: string, str: string|RegExp, newStr: string, {\n    replaceAll = false,\n    prepend = false,\n    append = false,\n    str: _str = undefined as string|undefined,\n    warn = true,\n} = {}) {\n    // todo: use safeReplaceString from ts-browser-helpers\n    const isStr = typeof str === 'string'\n    if (warn && warnEnabled /* && ThreeViewer.ViewerDebugging */) {\n        if (isStr ? !shader.includes(str) : !str.test(shader)) {\n            console.error(`${str} not found in shader`)\n            return shader\n        }\n    }\n    let s = newStr\n    _str = _str ?? (isStr ? str : undefined)\n    if (prepend) {\n        if (typeof _str !== 'string') throw new Error(errorStr1)\n        s = newStr + _str\n    } else if (append) {\n        if (typeof _str !== 'string') throw new Error(errorStr1)\n        s = _str + newStr\n    }\n    return replaceAll ? shader.replaceAll(str, s) : shader.replace(str, s)\n}\n\n// todo use in material extension?\n// /**\n//  * Regular expression for matching the `void main() {` opener line in GLSL.\n//  * @type {RegExp}\n//  */\n// export const voidMainRegExp = /\\bvoid\\s+main\\s*\\(\\s*\\)\\s*{/g\n","import type {BlobExt} from '../assetmanager'\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n * https://github.com/mrdoob/three.js/blob/4dbd0065f2ec29b89c250d8582f61e9f4792e077/examples/jsm/exporters/GLTFExporter.js#L381\n * @param arrayBuffer Buffer to pad\n * @param paddingByte (Optional)\n * @returns The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer(arrayBuffer: Uint8Array<ArrayBuffer>, paddingByte = 0): ArrayBuffer {\n    const paddedLength = getPaddedBufferSize(arrayBuffer.byteLength)\n    if (paddedLength !== arrayBuffer.byteLength) {\n        const array = new Uint8Array(paddedLength)\n        array.set(new Uint8Array(arrayBuffer))\n        if (paddingByte !== 0) {\n            for (let i = arrayBuffer.byteLength; i < paddedLength; i++) {\n                array[ i ] = paddingByte\n            }\n        }\n        return array.buffer\n    }\n    return arrayBuffer.buffer\n}\n\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @param bufferSize The size the original buffer.\n * @returns new buffer size with required padding.\n *\n */\nfunction getPaddedBufferSize(bufferSize: number) {\n\n    return Math.ceil(bufferSize / 4) * 4\n\n}\n\n\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12\nconst GLB_HEADER_MAGIC = 0x46546C67\nconst GLB_VERSION = 2\n\nconst GLB_CHUNK_PREFIX_BYTES = 8\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942\n\n// https://github.com/mrdoob/three.js/blob/4dbd0065f2ec29b89c250d8582f61e9f4792e077/examples/jsm/exporters/GLTFExporter.js#L558\nexport function makeGLBFile(buffers: Uint8Array<ArrayBuffer>, json: any): BlobExt {\n    // Binary chunk.\n    const binaryChunk = getPaddedArrayBuffer(buffers)\n    const binaryChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES))\n    binaryChunkPrefix.setUint32(0, binaryChunk.byteLength, true)\n    binaryChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_BIN, true)\n\n    // JSON chunk.\n    const buffer1 = new TextEncoder().encode(JSON.stringify(json || {})) as Uint8Array<ArrayBuffer>\n    const jsonChunk = getPaddedArrayBuffer(buffer1, 0x20)\n    const jsonChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES))\n    jsonChunkPrefix.setUint32(0, jsonChunk.byteLength, true)\n    jsonChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_JSON, true)\n\n    // GLB header.\n    const header = new ArrayBuffer(GLB_HEADER_BYTES)\n    const headerView = new DataView(header)\n    headerView.setUint32(0, GLB_HEADER_MAGIC, true)\n    headerView.setUint32(4, GLB_VERSION, true)\n    const totalByteLength = GLB_HEADER_BYTES\n        + jsonChunkPrefix.byteLength + jsonChunk.byteLength\n        + binaryChunkPrefix.byteLength + binaryChunk.byteLength\n    headerView.setUint32(8, totalByteLength, true)\n\n    const glbBlob: BlobExt = new Blob([\n        header,\n        jsonChunkPrefix,\n        jsonChunk,\n        binaryChunkPrefix,\n        binaryChunk,\n    ], {type: 'model/gltf+binary'}) as any\n    glbBlob.ext = 'glb'\n    return glbBlob\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n    return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","var warning = function () { };\r\nvar invariant = function () { };\r\nif (process.env.NODE_ENV !== 'production') {\r\n    warning = function (check, message) {\r\n        if (!check && typeof console !== 'undefined') {\r\n            console.warn(message);\r\n        }\r\n    };\r\n    invariant = function (check, message) {\r\n        if (!check) {\r\n            throw new Error(message);\r\n        }\r\n    };\r\n}\n\nexport { invariant, warning };\n","const clamp = (min, max, v) => Math.min(Math.max(v, min), max);\n\nexport { clamp };\n","import { warning } from 'hey-listen';\nimport { clamp } from '../../utils/clamp.mjs';\n\nconst safeMin = 0.001;\nconst minDuration = 0.01;\nconst maxDuration = 10.0;\nconst minDamping = 0.05;\nconst maxDamping = 1;\nfunction findSpring({ duration = 800, bounce = 0.25, velocity = 0, mass = 1, }) {\n    let envelope;\n    let derivative;\n    warning(duration <= maxDuration * 1000, \"Spring duration must be 10 seconds or less\");\n    let dampingRatio = 1 - bounce;\n    dampingRatio = clamp(minDamping, maxDamping, dampingRatio);\n    duration = clamp(minDuration, maxDuration, duration / 1000);\n    if (dampingRatio < 1) {\n        envelope = (undampedFreq) => {\n            const exponentialDecay = undampedFreq * dampingRatio;\n            const delta = exponentialDecay * duration;\n            const a = exponentialDecay - velocity;\n            const b = calcAngularFreq(undampedFreq, dampingRatio);\n            const c = Math.exp(-delta);\n            return safeMin - (a / b) * c;\n        };\n        derivative = (undampedFreq) => {\n            const exponentialDecay = undampedFreq * dampingRatio;\n            const delta = exponentialDecay * duration;\n            const d = delta * velocity + velocity;\n            const e = Math.pow(dampingRatio, 2) * Math.pow(undampedFreq, 2) * duration;\n            const f = Math.exp(-delta);\n            const g = calcAngularFreq(Math.pow(undampedFreq, 2), dampingRatio);\n            const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1;\n            return (factor * ((d - e) * f)) / g;\n        };\n    }\n    else {\n        envelope = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration);\n            const b = (undampedFreq - velocity) * duration + 1;\n            return -safeMin + a * b;\n        };\n        derivative = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration);\n            const b = (velocity - undampedFreq) * (duration * duration);\n            return a * b;\n        };\n    }\n    const initialGuess = 5 / duration;\n    const undampedFreq = approximateRoot(envelope, derivative, initialGuess);\n    duration = duration * 1000;\n    if (isNaN(undampedFreq)) {\n        return {\n            stiffness: 100,\n            damping: 10,\n            duration,\n        };\n    }\n    else {\n        const stiffness = Math.pow(undampedFreq, 2) * mass;\n        return {\n            stiffness,\n            damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),\n            duration,\n        };\n    }\n}\nconst rootIterations = 12;\nfunction approximateRoot(envelope, derivative, initialGuess) {\n    let result = initialGuess;\n    for (let i = 1; i < rootIterations; i++) {\n        result = result - envelope(result) / derivative(result);\n    }\n    return result;\n}\nfunction calcAngularFreq(undampedFreq, dampingRatio) {\n    return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio);\n}\n\nexport { calcAngularFreq, findSpring, maxDamping, maxDuration, minDamping, minDuration };\n","import { __rest } from 'tslib';\nimport { findSpring, calcAngularFreq } from '../utils/find-spring.mjs';\n\nconst durationKeys = [\"duration\", \"bounce\"];\nconst physicsKeys = [\"stiffness\", \"damping\", \"mass\"];\nfunction isSpringType(options, keys) {\n    return keys.some((key) => options[key] !== undefined);\n}\nfunction getSpringOptions(options) {\n    let springOptions = Object.assign({ velocity: 0.0, stiffness: 100, damping: 10, mass: 1.0, isResolvedFromDuration: false }, options);\n    if (!isSpringType(options, physicsKeys) &&\n        isSpringType(options, durationKeys)) {\n        const derived = findSpring(options);\n        springOptions = Object.assign(Object.assign(Object.assign({}, springOptions), derived), { velocity: 0.0, mass: 1.0 });\n        springOptions.isResolvedFromDuration = true;\n    }\n    return springOptions;\n}\nfunction spring(_a) {\n    var { from = 0.0, to = 1.0, restSpeed = 2, restDelta } = _a, options = __rest(_a, [\"from\", \"to\", \"restSpeed\", \"restDelta\"]);\n    const state = { done: false, value: from };\n    let { stiffness, damping, mass, velocity, duration, isResolvedFromDuration, } = getSpringOptions(options);\n    let resolveSpring = zero;\n    let resolveVelocity = zero;\n    function createSpring() {\n        const initialVelocity = velocity ? -(velocity / 1000) : 0.0;\n        const initialDelta = to - from;\n        const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass));\n        const undampedAngularFreq = Math.sqrt(stiffness / mass) / 1000;\n        if (restDelta === undefined) {\n            restDelta = Math.min(Math.abs(to - from) / 100, 0.4);\n        }\n        if (dampingRatio < 1) {\n            const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio);\n            resolveSpring = (t) => {\n                const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n                return (to -\n                    envelope *\n                        (((initialVelocity +\n                            dampingRatio * undampedAngularFreq * initialDelta) /\n                            angularFreq) *\n                            Math.sin(angularFreq * t) +\n                            initialDelta * Math.cos(angularFreq * t)));\n            };\n            resolveVelocity = (t) => {\n                const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n                return (dampingRatio *\n                    undampedAngularFreq *\n                    envelope *\n                    ((Math.sin(angularFreq * t) *\n                        (initialVelocity +\n                            dampingRatio *\n                                undampedAngularFreq *\n                                initialDelta)) /\n                        angularFreq +\n                        initialDelta * Math.cos(angularFreq * t)) -\n                    envelope *\n                        (Math.cos(angularFreq * t) *\n                            (initialVelocity +\n                                dampingRatio *\n                                    undampedAngularFreq *\n                                    initialDelta) -\n                            angularFreq *\n                                initialDelta *\n                                Math.sin(angularFreq * t)));\n            };\n        }\n        else if (dampingRatio === 1) {\n            resolveSpring = (t) => to -\n                Math.exp(-undampedAngularFreq * t) *\n                    (initialDelta +\n                        (initialVelocity + undampedAngularFreq * initialDelta) *\n                            t);\n        }\n        else {\n            const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1);\n            resolveSpring = (t) => {\n                const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n                const freqForT = Math.min(dampedAngularFreq * t, 300);\n                return (to -\n                    (envelope *\n                        ((initialVelocity +\n                            dampingRatio * undampedAngularFreq * initialDelta) *\n                            Math.sinh(freqForT) +\n                            dampedAngularFreq *\n                                initialDelta *\n                                Math.cosh(freqForT))) /\n                        dampedAngularFreq);\n            };\n        }\n    }\n    createSpring();\n    return {\n        next: (t) => {\n            const current = resolveSpring(t);\n            if (!isResolvedFromDuration) {\n                const currentVelocity = resolveVelocity(t) * 1000;\n                const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed;\n                const isBelowDisplacementThreshold = Math.abs(to - current) <= restDelta;\n                state.done =\n                    isBelowVelocityThreshold && isBelowDisplacementThreshold;\n            }\n            else {\n                state.done = t >= duration;\n            }\n            state.value = state.done ? to : current;\n            return state;\n        },\n        flipTarget: () => {\n            velocity = -velocity;\n            [from, to] = [to, from];\n            createSpring();\n        },\n    };\n}\nspring.needsInterpolation = (a, b) => typeof a === \"string\" || typeof b === \"string\";\nconst zero = (_t) => 0;\n\nexport { spring };\n","const progress = (from, to, value) => {\n    const toFromDifference = to - from;\n    return toFromDifference === 0 ? 1 : (value - from) / toFromDifference;\n};\n\nexport { progress };\n","const mix = (from, to, progress) => -progress * from + progress * to + from;\n\nexport { mix };\n","const clamp = (min, max) => (v) => Math.max(Math.min(v, max), min);\nconst sanitize = (v) => (v % 1 ? Number(v.toFixed(5)) : v);\nconst floatRegex = /(-)?([\\d]*\\.?[\\d])+/g;\nconst colorRegex = /(#[0-9a-f]{6}|#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\\((-?[\\d\\.]+%?[,\\s]+){2}(-?[\\d\\.]+%?)\\s*[\\,\\/]?\\s*[\\d\\.]*%?\\))/gi;\nconst singleColorRegex = /^(#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\\((-?[\\d\\.]+%?[,\\s]+){2}(-?[\\d\\.]+%?)\\s*[\\,\\/]?\\s*[\\d\\.]*%?\\))$/i;\nfunction isString(v) {\n    return typeof v === 'string';\n}\n\nexport { clamp, colorRegex, floatRegex, isString, sanitize, singleColorRegex };\n","import { clamp } from '../utils.mjs';\n\nconst number = {\n    test: (v) => typeof v === 'number',\n    parse: parseFloat,\n    transform: (v) => v,\n};\nconst alpha = Object.assign(Object.assign({}, number), { transform: clamp(0, 1) });\nconst scale = Object.assign(Object.assign({}, number), { default: 1 });\n\nexport { alpha, number, scale };\n","import { isString } from '../utils.mjs';\n\nconst createUnitType = (unit) => ({\n    test: (v) => isString(v) && v.endsWith(unit) && v.split(' ').length === 1,\n    parse: parseFloat,\n    transform: (v) => `${v}${unit}`,\n});\nconst degrees = createUnitType('deg');\nconst percent = createUnitType('%');\nconst px = createUnitType('px');\nconst vh = createUnitType('vh');\nconst vw = createUnitType('vw');\nconst progressPercentage = Object.assign(Object.assign({}, percent), { parse: (v) => percent.parse(v) / 100, transform: (v) => percent.transform(v * 100) });\n\nexport { degrees, percent, progressPercentage, px, vh, vw };\n","import { isString, singleColorRegex, floatRegex } from '../utils.mjs';\n\nconst isColorString = (type, testProp) => (v) => {\n    return Boolean((isString(v) && singleColorRegex.test(v) && v.startsWith(type)) ||\n        (testProp && Object.prototype.hasOwnProperty.call(v, testProp)));\n};\nconst splitColor = (aName, bName, cName) => (v) => {\n    if (!isString(v))\n        return v;\n    const [a, b, c, alpha] = v.match(floatRegex);\n    return {\n        [aName]: parseFloat(a),\n        [bName]: parseFloat(b),\n        [cName]: parseFloat(c),\n        alpha: alpha !== undefined ? parseFloat(alpha) : 1,\n    };\n};\n\nexport { isColorString, splitColor };\n","import { alpha } from '../numbers/index.mjs';\nimport { percent } from '../numbers/units.mjs';\nimport { sanitize } from '../utils.mjs';\nimport { isColorString, splitColor } from './utils.mjs';\n\nconst hsla = {\n    test: isColorString('hsl', 'hue'),\n    parse: splitColor('hue', 'saturation', 'lightness'),\n    transform: ({ hue, saturation, lightness, alpha: alpha$1 = 1 }) => {\n        return ('hsla(' +\n            Math.round(hue) +\n            ', ' +\n            percent.transform(sanitize(saturation)) +\n            ', ' +\n            percent.transform(sanitize(lightness)) +\n            ', ' +\n            sanitize(alpha.transform(alpha$1)) +\n            ')');\n    },\n};\n\nexport { hsla };\n","import { number, alpha } from '../numbers/index.mjs';\nimport { sanitize, clamp } from '../utils.mjs';\nimport { isColorString, splitColor } from './utils.mjs';\n\nconst clampRgbUnit = clamp(0, 255);\nconst rgbUnit = Object.assign(Object.assign({}, number), { transform: (v) => Math.round(clampRgbUnit(v)) });\nconst rgba = {\n    test: isColorString('rgb', 'red'),\n    parse: splitColor('red', 'green', 'blue'),\n    transform: ({ red, green, blue, alpha: alpha$1 = 1 }) => 'rgba(' +\n        rgbUnit.transform(red) +\n        ', ' +\n        rgbUnit.transform(green) +\n        ', ' +\n        rgbUnit.transform(blue) +\n        ', ' +\n        sanitize(alpha.transform(alpha$1)) +\n        ')',\n};\n\nexport { rgbUnit, rgba };\n","import { rgba } from './rgba.mjs';\nimport { isColorString } from './utils.mjs';\n\nfunction parseHex(v) {\n    let r = '';\n    let g = '';\n    let b = '';\n    let a = '';\n    if (v.length > 5) {\n        r = v.substr(1, 2);\n        g = v.substr(3, 2);\n        b = v.substr(5, 2);\n        a = v.substr(7, 2);\n    }\n    else {\n        r = v.substr(1, 1);\n        g = v.substr(2, 1);\n        b = v.substr(3, 1);\n        a = v.substr(4, 1);\n        r += r;\n        g += g;\n        b += b;\n        a += a;\n    }\n    return {\n        red: parseInt(r, 16),\n        green: parseInt(g, 16),\n        blue: parseInt(b, 16),\n        alpha: a ? parseInt(a, 16) / 255 : 1,\n    };\n}\nconst hex = {\n    test: isColorString('#'),\n    parse: parseHex,\n    transform: rgba.transform,\n};\n\nexport { hex };\n","import { isString } from '../utils.mjs';\nimport { hex } from './hex.mjs';\nimport { hsla } from './hsla.mjs';\nimport { rgba } from './rgba.mjs';\n\nconst color = {\n    test: (v) => rgba.test(v) || hex.test(v) || hsla.test(v),\n    parse: (v) => {\n        if (rgba.test(v)) {\n            return rgba.parse(v);\n        }\n        else if (hsla.test(v)) {\n            return hsla.parse(v);\n        }\n        else {\n            return hex.parse(v);\n        }\n    },\n    transform: (v) => {\n        return isString(v)\n            ? v\n            : v.hasOwnProperty('red')\n                ? rgba.transform(v)\n                : hsla.transform(v);\n    },\n};\n\nexport { color };\n","import { color } from '../color/index.mjs';\nimport { number } from '../numbers/index.mjs';\nimport { isString, floatRegex, colorRegex, sanitize } from '../utils.mjs';\n\nconst colorToken = '${c}';\nconst numberToken = '${n}';\nfunction test(v) {\n    var _a, _b, _c, _d;\n    return (isNaN(v) &&\n        isString(v) &&\n        ((_b = (_a = v.match(floatRegex)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = v.match(colorRegex)) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) > 0);\n}\nfunction analyse(v) {\n    if (typeof v === 'number')\n        v = `${v}`;\n    const values = [];\n    let numColors = 0;\n    const colors = v.match(colorRegex);\n    if (colors) {\n        numColors = colors.length;\n        v = v.replace(colorRegex, colorToken);\n        values.push(...colors.map(color.parse));\n    }\n    const numbers = v.match(floatRegex);\n    if (numbers) {\n        v = v.replace(floatRegex, numberToken);\n        values.push(...numbers.map(number.parse));\n    }\n    return { values, numColors, tokenised: v };\n}\nfunction parse(v) {\n    return analyse(v).values;\n}\nfunction createTransformer(v) {\n    const { values, numColors, tokenised } = analyse(v);\n    const numValues = values.length;\n    return (v) => {\n        let output = tokenised;\n        for (let i = 0; i < numValues; i++) {\n            output = output.replace(i < numColors ? colorToken : numberToken, i < numColors ? color.transform(v[i]) : sanitize(v[i]));\n        }\n        return output;\n    };\n}\nconst convertNumbersToZero = (v) => typeof v === 'number' ? 0 : v;\nfunction getAnimatableNone(v) {\n    const parsed = parse(v);\n    const transformer = createTransformer(v);\n    return transformer(parsed.map(convertNumbersToZero));\n}\nconst complex = { test, parse, createTransformer, getAnimatableNone };\n\nexport { complex };\n","function hueToRgb(p, q, t) {\n    if (t < 0)\n        t += 1;\n    if (t > 1)\n        t -= 1;\n    if (t < 1 / 6)\n        return p + (q - p) * 6 * t;\n    if (t < 1 / 2)\n        return q;\n    if (t < 2 / 3)\n        return p + (q - p) * (2 / 3 - t) * 6;\n    return p;\n}\nfunction hslaToRgba({ hue, saturation, lightness, alpha }) {\n    hue /= 360;\n    saturation /= 100;\n    lightness /= 100;\n    let red = 0;\n    let green = 0;\n    let blue = 0;\n    if (!saturation) {\n        red = green = blue = lightness;\n    }\n    else {\n        const q = lightness < 0.5\n            ? lightness * (1 + saturation)\n            : lightness + saturation - lightness * saturation;\n        const p = 2 * lightness - q;\n        red = hueToRgb(p, q, hue + 1 / 3);\n        green = hueToRgb(p, q, hue);\n        blue = hueToRgb(p, q, hue - 1 / 3);\n    }\n    return {\n        red: Math.round(red * 255),\n        green: Math.round(green * 255),\n        blue: Math.round(blue * 255),\n        alpha,\n    };\n}\n\nexport { hslaToRgba };\n","import { mix } from './mix.mjs';\nimport { hsla, rgba, hex } from 'style-value-types';\nimport { invariant } from 'hey-listen';\nimport { hslaToRgba } from './hsla-to-rgba.mjs';\n\nconst mixLinearColor = (from, to, v) => {\n    const fromExpo = from * from;\n    const toExpo = to * to;\n    return Math.sqrt(Math.max(0, v * (toExpo - fromExpo) + fromExpo));\n};\nconst colorTypes = [hex, rgba, hsla];\nconst getColorType = (v) => colorTypes.find((type) => type.test(v));\nconst notAnimatable = (color) => `'${color}' is not an animatable color. Use the equivalent color code instead.`;\nconst mixColor = (from, to) => {\n    let fromColorType = getColorType(from);\n    let toColorType = getColorType(to);\n    invariant(!!fromColorType, notAnimatable(from));\n    invariant(!!toColorType, notAnimatable(to));\n    let fromColor = fromColorType.parse(from);\n    let toColor = toColorType.parse(to);\n    if (fromColorType === hsla) {\n        fromColor = hslaToRgba(fromColor);\n        fromColorType = rgba;\n    }\n    if (toColorType === hsla) {\n        toColor = hslaToRgba(toColor);\n        toColorType = rgba;\n    }\n    const blended = Object.assign({}, fromColor);\n    return (v) => {\n        for (const key in blended) {\n            if (key !== \"alpha\") {\n                blended[key] = mixLinearColor(fromColor[key], toColor[key], v);\n            }\n        }\n        blended.alpha = mix(fromColor.alpha, toColor.alpha, v);\n        return fromColorType.transform(blended);\n    };\n};\n\nexport { mixColor, mixLinearColor };\n","const zeroPoint = {\n    x: 0,\n    y: 0,\n    z: 0\n};\nconst isNum = (v) => typeof v === 'number';\n\nexport { isNum, zeroPoint };\n","const combineFunctions = (a, b) => (v) => b(a(v));\nconst pipe = (...transformers) => transformers.reduce(combineFunctions);\n\nexport { pipe };\n","import { complex, color } from 'style-value-types';\nimport { mix } from './mix.mjs';\nimport { mixColor } from './mix-color.mjs';\nimport { isNum } from './inc.mjs';\nimport { pipe } from './pipe.mjs';\nimport { warning } from 'hey-listen';\n\nfunction getMixer(origin, target) {\n    if (isNum(origin)) {\n        return (v) => mix(origin, target, v);\n    }\n    else if (color.test(origin)) {\n        return mixColor(origin, target);\n    }\n    else {\n        return mixComplex(origin, target);\n    }\n}\nconst mixArray = (from, to) => {\n    const output = [...from];\n    const numValues = output.length;\n    const blendValue = from.map((fromThis, i) => getMixer(fromThis, to[i]));\n    return (v) => {\n        for (let i = 0; i < numValues; i++) {\n            output[i] = blendValue[i](v);\n        }\n        return output;\n    };\n};\nconst mixObject = (origin, target) => {\n    const output = Object.assign(Object.assign({}, origin), target);\n    const blendValue = {};\n    for (const key in output) {\n        if (origin[key] !== undefined && target[key] !== undefined) {\n            blendValue[key] = getMixer(origin[key], target[key]);\n        }\n    }\n    return (v) => {\n        for (const key in blendValue) {\n            output[key] = blendValue[key](v);\n        }\n        return output;\n    };\n};\nfunction analyse(value) {\n    const parsed = complex.parse(value);\n    const numValues = parsed.length;\n    let numNumbers = 0;\n    let numRGB = 0;\n    let numHSL = 0;\n    for (let i = 0; i < numValues; i++) {\n        if (numNumbers || typeof parsed[i] === \"number\") {\n            numNumbers++;\n        }\n        else {\n            if (parsed[i].hue !== undefined) {\n                numHSL++;\n            }\n            else {\n                numRGB++;\n            }\n        }\n    }\n    return { parsed, numNumbers, numRGB, numHSL };\n}\nconst mixComplex = (origin, target) => {\n    const template = complex.createTransformer(target);\n    const originStats = analyse(origin);\n    const targetStats = analyse(target);\n    const canInterpolate = originStats.numHSL === targetStats.numHSL &&\n        originStats.numRGB === targetStats.numRGB &&\n        originStats.numNumbers >= targetStats.numNumbers;\n    if (canInterpolate) {\n        return pipe(mixArray(originStats.parsed, targetStats.parsed), template);\n    }\n    else {\n        warning(true, `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`);\n        return (p) => `${p > 0 ? target : origin}`;\n    }\n};\n\nexport { mixArray, mixComplex, mixObject };\n","import { progress } from './progress.mjs';\nimport { mix } from './mix.mjs';\nimport { mixColor } from './mix-color.mjs';\nimport { mixComplex, mixArray, mixObject } from './mix-complex.mjs';\nimport { color } from 'style-value-types';\nimport { clamp } from './clamp.mjs';\nimport { pipe } from './pipe.mjs';\nimport { invariant } from 'hey-listen';\n\nconst mixNumber = (from, to) => (p) => mix(from, to, p);\nfunction detectMixerFactory(v) {\n    if (typeof v === 'number') {\n        return mixNumber;\n    }\n    else if (typeof v === 'string') {\n        if (color.test(v)) {\n            return mixColor;\n        }\n        else {\n            return mixComplex;\n        }\n    }\n    else if (Array.isArray(v)) {\n        return mixArray;\n    }\n    else if (typeof v === 'object') {\n        return mixObject;\n    }\n}\nfunction createMixers(output, ease, customMixer) {\n    const mixers = [];\n    const mixerFactory = customMixer || detectMixerFactory(output[0]);\n    const numMixers = output.length - 1;\n    for (let i = 0; i < numMixers; i++) {\n        let mixer = mixerFactory(output[i], output[i + 1]);\n        if (ease) {\n            const easingFunction = Array.isArray(ease) ? ease[i] : ease;\n            mixer = pipe(easingFunction, mixer);\n        }\n        mixers.push(mixer);\n    }\n    return mixers;\n}\nfunction fastInterpolate([from, to], [mixer]) {\n    return (v) => mixer(progress(from, to, v));\n}\nfunction slowInterpolate(input, mixers) {\n    const inputLength = input.length;\n    const lastInputIndex = inputLength - 1;\n    return (v) => {\n        let mixerIndex = 0;\n        let foundMixerIndex = false;\n        if (v <= input[0]) {\n            foundMixerIndex = true;\n        }\n        else if (v >= input[lastInputIndex]) {\n            mixerIndex = lastInputIndex - 1;\n            foundMixerIndex = true;\n        }\n        if (!foundMixerIndex) {\n            let i = 1;\n            for (; i < inputLength; i++) {\n                if (input[i] > v || i === lastInputIndex) {\n                    break;\n                }\n            }\n            mixerIndex = i - 1;\n        }\n        const progressInRange = progress(input[mixerIndex], input[mixerIndex + 1], v);\n        return mixers[mixerIndex](progressInRange);\n    };\n}\nfunction interpolate(input, output, { clamp: isClamp = true, ease, mixer } = {}) {\n    const inputLength = input.length;\n    invariant(inputLength === output.length, 'Both input and output ranges must be the same length');\n    invariant(!ease || !Array.isArray(ease) || ease.length === inputLength - 1, 'Array of easing functions must be of length `input.length - 1`, as it applies to the transitions **between** the defined values.');\n    if (input[0] > input[inputLength - 1]) {\n        input = [].concat(input);\n        output = [].concat(output);\n        input.reverse();\n        output.reverse();\n    }\n    const mixers = createMixers(output, ease, mixer);\n    const interpolator = inputLength === 2\n        ? fastInterpolate(input, mixers)\n        : slowInterpolate(input, mixers);\n    return isClamp\n        ? (v) => interpolator(clamp(input[0], input[inputLength - 1], v))\n        : interpolator;\n}\n\nexport { interpolate };\n","const reverseEasing = easing => p => 1 - easing(1 - p);\nconst mirrorEasing = easing => p => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2;\nconst createExpoIn = (power) => p => Math.pow(p, power);\nconst createBackIn = (power) => p => p * p * ((power + 1) * p - power);\nconst createAnticipate = (power) => {\n    const backEasing = createBackIn(power);\n    return p => (p *= 2) < 1\n        ? 0.5 * backEasing(p)\n        : 0.5 * (2 - Math.pow(2, -10 * (p - 1)));\n};\n\nexport { createAnticipate, createBackIn, createExpoIn, mirrorEasing, reverseEasing };\n","import { createExpoIn, reverseEasing, mirrorEasing, createBackIn, createAnticipate } from './utils.mjs';\n\nconst DEFAULT_OVERSHOOT_STRENGTH = 1.525;\nconst BOUNCE_FIRST_THRESHOLD = 4.0 / 11.0;\nconst BOUNCE_SECOND_THRESHOLD = 8.0 / 11.0;\nconst BOUNCE_THIRD_THRESHOLD = 9.0 / 10.0;\nconst linear = p => p;\nconst easeIn = createExpoIn(2);\nconst easeOut = reverseEasing(easeIn);\nconst easeInOut = mirrorEasing(easeIn);\nconst circIn = p => 1 - Math.sin(Math.acos(p));\nconst circOut = reverseEasing(circIn);\nconst circInOut = mirrorEasing(circOut);\nconst backIn = createBackIn(DEFAULT_OVERSHOOT_STRENGTH);\nconst backOut = reverseEasing(backIn);\nconst backInOut = mirrorEasing(backIn);\nconst anticipate = createAnticipate(DEFAULT_OVERSHOOT_STRENGTH);\nconst ca = 4356.0 / 361.0;\nconst cb = 35442.0 / 1805.0;\nconst cc = 16061.0 / 1805.0;\nconst bounceOut = (p) => {\n    if (p === 1 || p === 0)\n        return p;\n    const p2 = p * p;\n    return p < BOUNCE_FIRST_THRESHOLD\n        ? 7.5625 * p2\n        : p < BOUNCE_SECOND_THRESHOLD\n            ? 9.075 * p2 - 9.9 * p + 3.4\n            : p < BOUNCE_THIRD_THRESHOLD\n                ? ca * p2 - cb * p + cc\n                : 10.8 * p * p - 20.52 * p + 10.72;\n};\nconst bounceIn = reverseEasing(bounceOut);\nconst bounceInOut = (p) => p < 0.5\n    ? 0.5 * (1.0 - bounceOut(1.0 - p * 2.0))\n    : 0.5 * bounceOut(p * 2.0 - 1.0) + 0.5;\n\nexport { anticipate, backIn, backInOut, backOut, bounceIn, bounceInOut, bounceOut, circIn, circInOut, circOut, easeIn, easeInOut, easeOut, linear };\n","import { interpolate } from '../../utils/interpolate.mjs';\nimport { easeInOut } from '../../easing/index.mjs';\n\nfunction defaultEasing(values, easing) {\n    return values.map(() => easing || easeInOut).splice(0, values.length - 1);\n}\nfunction defaultOffset(values) {\n    const numValues = values.length;\n    return values.map((_value, i) => i !== 0 ? i / (numValues - 1) : 0);\n}\nfunction convertOffsetToTimes(offset, duration) {\n    return offset.map((o) => o * duration);\n}\nfunction keyframes({ from = 0, to = 1, ease, offset, duration = 300, }) {\n    const state = { done: false, value: from };\n    const values = Array.isArray(to) ? to : [from, to];\n    const times = convertOffsetToTimes(offset && offset.length === values.length\n        ? offset\n        : defaultOffset(values), duration);\n    function createInterpolator() {\n        return interpolate(times, values, {\n            ease: Array.isArray(ease) ? ease : defaultEasing(values, ease),\n        });\n    }\n    let interpolator = createInterpolator();\n    return {\n        next: (t) => {\n            state.value = interpolator(t);\n            state.done = t >= duration;\n            return state;\n        },\n        flipTarget: () => {\n            values.reverse();\n            interpolator = createInterpolator();\n        },\n    };\n}\n\nexport { convertOffsetToTimes, defaultEasing, defaultOffset, keyframes };\n","function decay({ velocity = 0, from = 0, power = 0.8, timeConstant = 350, restDelta = 0.5, modifyTarget, }) {\n    const state = { done: false, value: from };\n    let amplitude = power * velocity;\n    const ideal = from + amplitude;\n    const target = modifyTarget === undefined ? ideal : modifyTarget(ideal);\n    if (target !== ideal)\n        amplitude = target - from;\n    return {\n        next: (t) => {\n            const delta = -amplitude * Math.exp(-t / timeConstant);\n            state.done = !(delta > restDelta || delta < -restDelta);\n            state.value = state.done ? target : target + delta;\n            return state;\n        },\n        flipTarget: () => { },\n    };\n}\n\nexport { decay };\n","import { spring } from '../generators/spring.mjs';\nimport { keyframes } from '../generators/keyframes.mjs';\nimport { decay } from '../generators/decay.mjs';\n\nconst types = { keyframes, spring, decay };\nfunction detectAnimationFromOptions(config) {\n    if (Array.isArray(config.to)) {\n        return keyframes;\n    }\n    else if (types[config.type]) {\n        return types[config.type];\n    }\n    const keys = new Set(Object.keys(config));\n    if (keys.has(\"ease\") ||\n        (keys.has(\"duration\") && !keys.has(\"dampingRatio\"))) {\n        return keyframes;\n    }\n    else if (keys.has(\"dampingRatio\") ||\n        keys.has(\"stiffness\") ||\n        keys.has(\"mass\") ||\n        keys.has(\"damping\") ||\n        keys.has(\"restSpeed\") ||\n        keys.has(\"restDelta\")) {\n        return spring;\n    }\n    return keyframes;\n}\n\nexport { detectAnimationFromOptions };\n","const defaultTimestep = (1 / 60) * 1000;\nconst getCurrentTime = typeof performance !== \"undefined\"\n    ? () => performance.now()\n    : () => Date.now();\nconst onNextFrame = typeof window !== \"undefined\"\n    ? (callback) => window.requestAnimationFrame(callback)\n    : (callback) => setTimeout(() => callback(getCurrentTime()), defaultTimestep);\n\nexport { defaultTimestep, onNextFrame };\n","function createRenderStep(runNextFrame) {\n    let toRun = [];\n    let toRunNextFrame = [];\n    let numToRun = 0;\n    let isProcessing = false;\n    let flushNextFrame = false;\n    const toKeepAlive = new WeakSet();\n    const step = {\n        schedule: (callback, keepAlive = false, immediate = false) => {\n            const addToCurrentFrame = immediate && isProcessing;\n            const buffer = addToCurrentFrame ? toRun : toRunNextFrame;\n            if (keepAlive)\n                toKeepAlive.add(callback);\n            if (buffer.indexOf(callback) === -1) {\n                buffer.push(callback);\n                if (addToCurrentFrame && isProcessing)\n                    numToRun = toRun.length;\n            }\n            return callback;\n        },\n        cancel: (callback) => {\n            const index = toRunNextFrame.indexOf(callback);\n            if (index !== -1)\n                toRunNextFrame.splice(index, 1);\n            toKeepAlive.delete(callback);\n        },\n        process: (frameData) => {\n            if (isProcessing) {\n                flushNextFrame = true;\n                return;\n            }\n            isProcessing = true;\n            [toRun, toRunNextFrame] = [toRunNextFrame, toRun];\n            toRunNextFrame.length = 0;\n            numToRun = toRun.length;\n            if (numToRun) {\n                for (let i = 0; i < numToRun; i++) {\n                    const callback = toRun[i];\n                    callback(frameData);\n                    if (toKeepAlive.has(callback)) {\n                        step.schedule(callback);\n                        runNextFrame();\n                    }\n                }\n            }\n            isProcessing = false;\n            if (flushNextFrame) {\n                flushNextFrame = false;\n                step.process(frameData);\n            }\n        },\n    };\n    return step;\n}\n\nexport { createRenderStep };\n","import { onNextFrame, defaultTimestep } from './on-next-frame.mjs';\nimport { createRenderStep } from './create-render-step.mjs';\n\nconst maxElapsed = 40;\nlet useDefaultElapsed = true;\nlet runNextFrame = false;\nlet isProcessing = false;\nconst frame = {\n    delta: 0,\n    timestamp: 0,\n};\nconst stepsOrder = [\n    \"read\",\n    \"update\",\n    \"preRender\",\n    \"render\",\n    \"postRender\",\n];\nconst steps = stepsOrder.reduce((acc, key) => {\n    acc[key] = createRenderStep(() => (runNextFrame = true));\n    return acc;\n}, {});\nconst sync = stepsOrder.reduce((acc, key) => {\n    const step = steps[key];\n    acc[key] = (process, keepAlive = false, immediate = false) => {\n        if (!runNextFrame)\n            startLoop();\n        return step.schedule(process, keepAlive, immediate);\n    };\n    return acc;\n}, {});\nconst cancelSync = stepsOrder.reduce((acc, key) => {\n    acc[key] = steps[key].cancel;\n    return acc;\n}, {});\nconst flushSync = stepsOrder.reduce((acc, key) => {\n    acc[key] = () => steps[key].process(frame);\n    return acc;\n}, {});\nconst processStep = (stepId) => steps[stepId].process(frame);\nconst processFrame = (timestamp) => {\n    runNextFrame = false;\n    frame.delta = useDefaultElapsed\n        ? defaultTimestep\n        : Math.max(Math.min(timestamp - frame.timestamp, maxElapsed), 1);\n    frame.timestamp = timestamp;\n    isProcessing = true;\n    stepsOrder.forEach(processStep);\n    isProcessing = false;\n    if (runNextFrame) {\n        useDefaultElapsed = false;\n        onNextFrame(processFrame);\n    }\n};\nconst startLoop = () => {\n    runNextFrame = true;\n    useDefaultElapsed = true;\n    if (!isProcessing)\n        onNextFrame(processFrame);\n};\nconst getFrameData = () => frame;\n\nexport default sync;\nexport { cancelSync, flushSync, getFrameData };\n","function loopElapsed(elapsed, duration, delay = 0) {\n    return elapsed - duration - delay;\n}\nfunction reverseElapsed(elapsed, duration, delay = 0, isForwardPlayback = true) {\n    return isForwardPlayback\n        ? loopElapsed(duration + -elapsed, duration, delay)\n        : duration - (elapsed - duration) + delay;\n}\nfunction hasRepeatDelayElapsed(elapsed, duration, delay, isForwardPlayback) {\n    return isForwardPlayback ? elapsed >= duration + delay : elapsed <= -delay;\n}\n\nexport { hasRepeatDelayElapsed, loopElapsed, reverseElapsed };\n","import { __rest } from 'tslib';\nimport { detectAnimationFromOptions } from './utils/detect-animation-from-options.mjs';\nimport sync, { cancelSync } from 'framesync';\nimport { interpolate } from '../utils/interpolate.mjs';\nimport { hasRepeatDelayElapsed, reverseElapsed, loopElapsed } from './utils/elapsed.mjs';\n\nconst framesync = (update) => {\n    const passTimestamp = ({ delta }) => update(delta);\n    return {\n        start: () => sync.update(passTimestamp, true),\n        stop: () => cancelSync.update(passTimestamp),\n    };\n};\nfunction animate(_a) {\n    var _b, _c;\n    var { from, autoplay = true, driver = framesync, elapsed = 0, repeat: repeatMax = 0, repeatType = \"loop\", repeatDelay = 0, onPlay, onStop, onComplete, onRepeat, onUpdate } = _a, options = __rest(_a, [\"from\", \"autoplay\", \"driver\", \"elapsed\", \"repeat\", \"repeatType\", \"repeatDelay\", \"onPlay\", \"onStop\", \"onComplete\", \"onRepeat\", \"onUpdate\"]);\n    let { to } = options;\n    let driverControls;\n    let repeatCount = 0;\n    let computedDuration = options.duration;\n    let latest;\n    let isComplete = false;\n    let isForwardPlayback = true;\n    let interpolateFromNumber;\n    const animator = detectAnimationFromOptions(options);\n    if ((_c = (_b = animator).needsInterpolation) === null || _c === void 0 ? void 0 : _c.call(_b, from, to)) {\n        interpolateFromNumber = interpolate([0, 100], [from, to], {\n            clamp: false,\n        });\n        from = 0;\n        to = 100;\n    }\n    const animation = animator(Object.assign(Object.assign({}, options), { from, to }));\n    function repeat() {\n        repeatCount++;\n        if (repeatType === \"reverse\") {\n            isForwardPlayback = repeatCount % 2 === 0;\n            elapsed = reverseElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback);\n        }\n        else {\n            elapsed = loopElapsed(elapsed, computedDuration, repeatDelay);\n            if (repeatType === \"mirror\")\n                animation.flipTarget();\n        }\n        isComplete = false;\n        onRepeat && onRepeat();\n    }\n    function complete() {\n        driverControls.stop();\n        onComplete && onComplete();\n    }\n    function update(delta) {\n        if (!isForwardPlayback)\n            delta = -delta;\n        elapsed += delta;\n        const el = Math.max(0, elapsed);\n        if (!isComplete || el <= (computedDuration || 0)) {\n            const state = animation.next(el);\n            latest = state.value;\n            if (interpolateFromNumber)\n                latest = interpolateFromNumber(latest);\n            isComplete = isForwardPlayback ? state.done : elapsed <= 0;\n        }\n        onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(latest);\n        if (isComplete) {\n            if (repeatCount === 0)\n                computedDuration !== null && computedDuration !== void 0 ? computedDuration : (computedDuration = elapsed);\n            if (repeatCount < repeatMax) {\n                hasRepeatDelayElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback) && repeat();\n            }\n            else {\n                complete();\n            }\n        }\n    }\n    function play() {\n        onPlay === null || onPlay === void 0 ? void 0 : onPlay();\n        driverControls = driver(update);\n        driverControls.start();\n    }\n    autoplay && play();\n    return {\n        stop: () => {\n            onStop === null || onStop === void 0 ? void 0 : onStop();\n            driverControls.stop();\n        },\n    };\n}\n\nexport { animate };\n","import {\n    animate,\n    AnimationOptions,\n    anticipate,\n    backIn,\n    backInOut,\n    backOut,\n    bounceIn,\n    bounceInOut,\n    bounceOut,\n    circIn,\n    circInOut,\n    circOut,\n    DriverControls,\n    easeIn,\n    easeInOut,\n    easeOut,\n    Easing,\n    KeyframeOptions,\n    keyframes,\n    linear,\n    PlaybackOptions,\n} from '@repalash/popmotion'\nimport {timeout} from 'ts-browser-helpers'\nimport {MathUtils} from 'three'\n\nexport {animate}\n\ndeclare module '@repalash/popmotion'{\n    interface PlaybackOptions<V> {\n        // throwOnStop?: boolean; // instead of this, user can simply throw an error in onStop.\n        onEnd?: () => void;\n    }\n}\n\nexport type {AnimationOptions, KeyframeOptions, Easing}\n\nconst easeInOutSine: Easing = (x) => -(Math.cos(Math.PI * x) - 1) / 2\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const EasingFunctions = {\n    linear: linear,\n    easeIn: easeIn,\n    easeOut: easeOut,\n    easeInOut: easeInOut,\n    circIn: circIn,\n    circOut: circOut,\n    circInOut: circInOut,\n    backIn: backIn,\n    backOut: backOut,\n    backInOut: backInOut,\n    anticipate: anticipate,\n    bounceOut: bounceOut,\n    bounceIn: bounceIn,\n    bounceInOut: bounceInOut,\n    easeInOutSine: easeInOutSine,\n}\n/**\n * EasingFunctionType:\n * anticipate, backIn, backInOut, backOut, bounceIn, bounceInOut, bounceOut, circIn, circInOut, circOut, easeIn, easeInOut, easeOut, easeInOutSine\n */\nexport type EasingFunctionType = keyof typeof EasingFunctions\n\nexport type AnimateResult = ReturnType<typeof animate>\n\nexport function makeSetterFor<V>(target: any, key: string, setDirty?: ()=>void) {\n    const v = target[key] as any\n    const dirty = ()=>{\n        // if (typeof target?.setDirty === 'function') target.setDirty()\n        setDirty?.()\n    }\n    const isBool = typeof v === 'boolean'\n    if (v && v.isColor)\n        return (a: any) => {\n            v.set(a)\n            dirty()\n        }\n    else if (v && typeof v.copy === 'function')\n        return (a: any) => {\n            v.copy(a)\n            dirty()\n        }\n    else\n        return (a: V)=>{\n            target[key] = !isBool ? a : !!a\n            dirty()\n        }\n}\n\nexport async function animateTarget<V>(target: any, key: string, options: AnimationOptions<V>, animations?: AnimateResult[], forceCurrent = false) {\n    if (!(key in target)) {\n        console.error('invalid key', key, target)\n    }\n    const setter = makeSetterFor(target, key)\n    const fromVal = forceCurrent || options.from === undefined ? target[key] : options.from\n    const onUpdate = (val: V)=>{\n        setter(val)\n        options.onUpdate && options.onUpdate(val)\n    }\n    if (typeof fromVal === 'boolean') {\n        const {duration} = options as KeyframeOptions // todo: divide by 2? or support keyframes.\n        return timeout(duration ?? 0).then(()=>onUpdate(options.to as V))\n    } else {\n        if (typeof options.to === 'function') {\n            options = {...options, to: options.to(fromVal, target)} // need to duplicate options\n        }\n        return animateAsync({\n            ...options,\n            from: fromVal,\n            onUpdate,\n        } as AnimationOptions<V>, animations)\n    }\n}\n\nexport async function animateAsync<V=number>(options: AnimationOptions<V>, animations?: AnimateResult[]) {\n    const complete = options.onComplete\n    const stop = options.onStop\n    const end = options.onEnd\n    options = {...options}\n    return new Promise<void>((resolve, reject) => {\n        const end2 = ()=>{\n            try {\n                end?.()\n            } catch (e: any) {\n                reject(e)\n                return false\n            }\n            return true\n        }\n        options.onComplete = ()=>{\n            try {\n                complete?.()\n            } catch (e: any) {\n                if (!end2()) return\n                reject(e)\n                return\n            }\n            if (!end2()) return\n            resolve()\n        }\n        options.onStop = ()=>{\n            try {\n                stop?.()\n            } catch (e: any) {\n                if (!end2()) return\n                reject(e)\n                return\n            }\n            if (!end2()) return\n            resolve()\n        }\n        const an = animate(options)\n        if (animations) animations.push(an)\n    })\n}\n\nexport function lerpAngle(a: number, b: number, t: number) {\n    const d = b - a\n    if (d >= Math.PI) {\n        return a + (d - Math.PI * 2) * t\n    } else if (d <= -Math.PI) {\n        return a + (d + Math.PI * 2) * t\n    } else {\n        return a + d * t\n    }\n}\n\nexport const lerp = MathUtils.lerp\n\n/**\n * Simplified version of popmption animate that supports seeking around the animation. Used in AnimationObject.ts\n * @param from\n * @param autoplay\n * @param driver\n * @param elapsed\n * @param onPlay\n * @param onStop\n * @param onComplete\n * @param onUpdate\n * @param delay\n * @param canComplete\n * @param options\n */\nexport function animateKeyframes<V = number>({\n    from,\n    autoplay = true,\n    driver,\n    elapsed = 0,\n    onPlay,\n    onStop,\n    onComplete,\n    onUpdate,\n    delay = 0,\n    canComplete = true,\n    ...options\n}: KeyframeOptions<V> & Omit<PlaybackOptions<V>, 'repeat' | 'repeatType' | 'repeatDelay' | 'onRepeat' | 'type'> & {delay?: number, canComplete?: boolean}) {\n    const {to} = options\n    let driverControls: DriverControls\n    const computedDuration = (options as KeyframeOptions<V>).duration || 0\n    let latest: V\n    let isComplete = false\n\n    const animation = keyframes({...options, from, to} as any)\n\n    function complete() {\n        driverControls.stop()\n        onComplete && onComplete()\n    }\n\n    function update(delta: number) {\n        const running = elapsed >= delay\n\n        elapsed += delta\n\n        if (elapsed < delay) {\n            if (!running) return\n        }\n\n        const el = Math.max(0, elapsed - delay)\n\n        if (!isComplete || el <= (computedDuration || 0)) {\n            const state = animation.next(el)\n            latest = state.value as any\n\n            isComplete = state.done\n        }\n\n        onUpdate?.(latest)\n\n        if (isComplete && canComplete) {\n            complete()\n        }\n    }\n\n    function play() {\n        onPlay?.()\n        driverControls = driver!(update)\n        driverControls.start()\n    }\n\n    autoplay && play()\n\n    return {\n        stop: () => {\n            onStop?.()\n            driverControls.stop()\n        },\n    }\n}\n","import {Quaternion, Spherical, Vector3} from 'three'\nimport {worldToLocalQuaternion} from '../three/utils'\nimport {CameraView, ICamera, ICameraView} from '../core'\nimport {AnimationOptions} from '@repalash/popmotion'\nimport {lerp, lerpAngle} from './animation'\n\nexport function sphericalFromCameraView(view: Pick<CameraView, 'position'|'target'>): Spherical {\n    const pos = view.position.clone()\n    pos.sub(view.target)\n    const spherical = new Spherical().setFromVector3(pos)\n    spherical.makeSafe() // todo: is it needed?\n    return spherical\n}\n\nexport function animateCameraToViewSpherical(camera: ICamera, view: ICameraView): AnimationOptions<number> {\n    // similar to orbit controls\n    const parent = camera.parent\n\n    const target = camera.target.clone()\n    const position = camera.getWorldPosition(new Vector3())\n    const init = {\n        position, target, zoom: camera.zoom,\n        spherical: sphericalFromCameraView({position, target}),\n    }\n    const current = {\n        position: new Vector3(),\n        target: new Vector3(),\n        zoom: 1,\n        spherical: new Spherical(),\n    }\n    const final = {\n        position: view.position,\n        target: view.target,\n        zoom: view.zoom,\n        spherical: sphericalFromCameraView(view),\n    }\n\n    function setter() {\n        camera.position.copy(parent ? parent.worldToLocal(current.position) : current.position)\n        camera.target.copy(current.target) // always in world space\n        camera.zoom = current.zoom\n        // lookAt in setDirty updates the quaternion\n        camera.setDirty() // because it has min change distance in setter\n    }\n\n    return {\n        from: 0,\n        to: 1,\n        onUpdate: (v) => {\n            current.spherical.phi = lerpAngle(init.spherical.phi, final.spherical.phi, v)\n            current.spherical.theta = lerpAngle(init.spherical.theta, final.spherical.theta, v)\n            current.spherical.radius = lerp(init.spherical.radius, final.spherical.radius, v)\n            current.target.copy(init.target).lerp(final.target, v)\n            current.position.setFromSpherical(current.spherical)\n            current.position.add(current.target)\n            current.zoom = lerp(init.zoom, final.zoom, v)\n            setter()\n        },\n        onComplete: () => {\n            current.position.copy(final.position)\n            current.target.copy(final.target)\n            current.zoom = final.zoom\n            setter()\n        },\n        onStop: () => {\n            throw new Error('Animation Stopped')\n        },\n    }\n}\n\nexport function animateCameraToViewLinear(camera: ICamera, view: ICameraView): AnimationOptions<number> {\n    // similar to orbit controls\n    // so camera.up is the orbit axis\n    const parent = camera.parent\n\n    const target = camera.target.clone()\n    const position = camera.getWorldPosition(new Vector3())\n    const quaternion = camera.getWorldQuaternion(new Quaternion())\n    const init = {\n        position, target, quaternion, zoom: camera.zoom,\n    }\n    const current = {\n        position: new Vector3(),\n        target: new Vector3(),\n        quaternion: new Quaternion(),\n        zoom: 1,\n    }\n    const final = view\n\n    function setter() {\n        camera.position.copy(parent ? parent.worldToLocal(current.position) : current.position)\n        camera.target.copy(current.target) // always in world space\n        camera.quaternion.copy(parent ? worldToLocalQuaternion(parent, current.quaternion, camera.quaternion) : current.quaternion)\n        camera.zoom = current.zoom\n        camera.setDirty() // because it has min change distance in setter\n    }\n\n    return {\n        from: 0,\n        to: 1,\n        onUpdate: (v) => {\n            current.position.lerpVectors(init.position, final.position, v)\n            current.target.lerpVectors(init.target, final.target, v)\n            current.quaternion.slerpQuaternions(init.quaternion, final.quaternion, v)\n            current.zoom = lerp(init.zoom, final.zoom, v)\n            setter()\n        },\n        onComplete: () => {\n            current.position.copy(final.position)\n            current.target.copy(final.target)\n            current.quaternion.copy(final.quaternion)\n            current.zoom = final.zoom\n            setter()\n        },\n        onStop: () => {\n            throw new Error('Animation Stopped')\n        },\n    }\n}\n\n","import {Color, Texture} from 'three'\nimport {IRenderManager, ITexture} from '../core'\nimport {whiteTexture} from '../three'\n\nexport interface AnimateTime {t: number, dt: number, rm?: IRenderManager}\n\n// See https://repalash.com/blog/interactive-lerp-animation for details\n\nexport function lerpVal(time: AnimateTime&{from?: number|Color|any}, val: number|Color|any, end: number|Color|any): number|Color|any {\n    if (typeof val === 'number' && typeof end === 'number') {\n        return lerpNumber(time, val, end)\n    }\n    if (typeof (val as Color)?.r === 'number' && typeof (end as Color)?.r === 'number') {\n        return new Color().set(\n            lerpNumber(time.from ? {...time, from: (time.from as Color).r} : time, (val as Color).r, (end as Color).r),\n            lerpNumber(time.from ? {...time, from: (time.from as Color).g} : time, (val as Color).g, (end as Color).g),\n            lerpNumber(time.from ? {...time, from: (time.from as Color).b} : time, (val as Color).b, (end as Color).b)\n        )\n    }\n    if (val?.toArray && end?.toArray && val.clone && val.fromArray) {\n        return lerpVector(time, val, end)\n    }\n    // not handling textures here specifically, to avoid texture arrays for now\n    return time.t >= 1 ? end : val\n}\n\nexport function lerpNumber(time: AnimateTime&{from?: number}, val: number, end: number): number {\n    const {t, dt} = time\n    let newVal\n    if (t <= 0) newVal = time.from !== undefined ? time.from : val\n    else if (t >= 1.) newVal = end\n    else if (time.from !== undefined) {\n        newVal = time.from * (1 - t) + end * t\n    } else {\n        const l = 1 - t\n        const k = Math.max(0, Math.min(dt, l) / l)\n        newVal = val + (end - val) * k\n    }\n    return newVal\n}\n\nexport function lerpVector(time: AnimateTime&{from?: any}, val: any, end: any): any {\n    const valA = val.toArray() as any[]\n    const endA = end.toArray() as any[]\n    const fromA = time.from ? time.from.toArray() : undefined\n    const newValA = valA.map((v, i) => lerpVal(fromA ? {...time, from: fromA[i]} : time, v, endA[i]))\n    const newVal = val.clone().fromArray(newValA)\n    return newVal\n}\n\nexport function lerpTexture(time: AnimateTime&{from?: ITexture|null}, val: ITexture|null, end: ITexture|null): ITexture |null {\n    if (!time.rm) {\n        console.warn('MaterialManager: RenderManager is required for interpolating textures')\n        return end\n    }\n    const {t, dt} = time\n    let newVal\n    const fromVal = time.from !== undefined ? time.from : val\n    if (t <= 0 || t > 0.99 || fromVal === end) {\n        newVal = t <= 0 ? fromVal : end\n        let rt\n        if (val && (val.userData as any)?._lerpTexture && val.isRenderTargetTexture) {\n            rt = val._target\n        }\n        if (rt) {\n            time.rm.releaseTempTarget(rt)\n        }\n    } else {\n\n        const val1 = fromVal || whiteTexture\n        let needsInit = false\n\n        let rt\n        if (val && (val.userData as any)?._lerpTexture && val.isRenderTargetTexture) {\n            rt = val._target\n        } else {\n            const anyTex = fromVal || end || whiteTexture\n            const size = {\n                width: anyTex.image?.width || anyTex.image?.naturalWidth || anyTex.image?.videoWidth || 1,\n                height: anyTex.image?.height || anyTex.image?.naturalHeight || anyTex.image?.videoHeight || 1,\n            }\n            rt = time.rm.getTempTarget({\n                size: size,\n                colorSpace: anyTex.colorSpace,\n                type: anyTex.type,\n                format: anyTex.format,\n                generateMipmaps: anyTex.generateMipmaps,\n                minFilter: anyTex.minFilter,\n                magFilter: anyTex.magFilter,\n                wrapS: anyTex.wrapS,\n                wrapT: anyTex.wrapT,\n            });\n            (rt.texture as Texture).userData._lerpTexture = true\n            needsInit = true\n        }\n        if (rt) {\n            if (time.from !== undefined || needsInit) {\n                time.rm.blit(rt, {\n                    source: val1,\n                    respectColorSpace: false,\n                    transparent: true,\n                    clear: true,\n                })\n            }\n            const l = 1 - t\n            const k = Math.max(0, Math.min(dt, l) / l)\n            // newVal = val + (end - val) * k\n            // newVal = val * (1 - k) + end * k\n\n            time.rm.blit(rt, {\n                source: end || whiteTexture,\n                respectColorSpace: false,\n                transparent: true,\n                clear: false,\n                blendAlpha: time.from !== undefined ? t : k,\n                // blending: NormalBlending,\n            })\n            newVal = rt.texture as ITexture\n        } else {\n            newVal = val\n        }\n    }\n    return newVal\n}\n\nexport function lerpParams(params: Record<string, any>, obj: Record<string, any>, interpolateProps: Set<string>, time: AnimateTime & {from?: Record<string, any>}) {\n    for (const key of Object.keys(params)) {\n        if (!interpolateProps.has(key)) continue\n        const val = obj[key]\n        if (val === undefined) continue\n        const time2 = time.from ? {...time, from: time.from[key]} : (time as AnimateTime)\n        const end = params[key]\n        if (typeof val === 'number' && typeof end === 'number') {\n            const newVal = lerpNumber(time2, val, end)\n            if (newVal === val) delete params[key] // no change\n            else params[key] = newVal\n        }\n        if (val?.isColor && end?.isColor) {\n            const newVal = lerpVal(time2, val, end) as Color\n            if (newVal.getHex() === val.getHex()) delete params[key] // no change\n            else params[key] = newVal\n        }\n        if ((val === undefined || val === null || val.isTexture) && (end === undefined || end === null || end.isTexture) && (val || end)) {\n            const newVal = lerpTexture(time2, val || null as ITexture | null, end || null as ITexture | null)\n            if (newVal === val) delete params[key] // no change\n            else params[key] = newVal\n        }\n        // vectors and custom stuff\n        if (val?.toArray && end?.toArray && val.clone && val.fromArray && val.equals) {\n            const newVal = lerpVector(time2, val, end)\n            if (newVal.equals(val)) delete params[key] // no change\n            else params[key] = newVal\n        }\n        if (Array.isArray(val) && Array.isArray(end) && val.length === end.length) {\n            // interpolate arrays\n            const newVal = val.map((v, i) => lerpVal(time2, v, end[i]))\n            if (newVal.every((v, i) => v === val[i])) delete params[key] // no change\n            else params[key] = newVal\n        }\n    }\n}\n","import {Color, Vector4} from 'three'\n// todo: move these to ts-browser-helpers maybe\n\n// reference: http://iwasbeingirony.blogspot.ca/2010/06/difference-between-rgbm-and-rgbd.html\nexport function vRGBMToLinear(value: Vector4, maxRange: number): Vector4 {\n    value.multiplyScalar(value.w * maxRange)\n    value.w = 1.0\n    return value\n}\n\nexport function cRGBMToLinear(value: Vector4, maxRange: number): Color {\n    vRGBMToLinear(value, maxRange)\n    return new Color(value.x, value.y, value.z)\n}\n\nexport function vLinearToRGBM(value: Vector4, maxRange: number): Vector4 {\n    const maxRGB = Math.max(value.x, Math.max(value.y, value.z))\n    let M = Math.max(Math.min(maxRGB / maxRange, 1.0), 0.0)\n    M = Math.ceil(M * 255.0) / 255.0\n    value.divideScalar(M * maxRange)\n    value.w = M\n    return value\n}\nexport function cLinearToRGBM(value: Color, maxRange: number): Vector4 {\n    return vLinearToRGBM(new Vector4(value.r, value.g, value.b, 1.0), maxRange)\n}\n","import {now} from 'ts-browser-helpers'\n\nexport interface CanvasSnapshotRect {\n    height: number;\n    width: number;\n    x: number;\n    y: number;\n    /**\n     * Use if canvas.width !== canvas.clientWidth or height and rect is based on client rect\n     * @default false\n     */\n    assumeClientRect?: boolean;\n    /**\n     * If true, assumes x, y, width, height are normalized to 0-1\n     * @default false\n     */\n    normalized?: boolean;\n}\n\nexport interface CanvasSnapshotOptions {\n    getDataUrl?: boolean,\n    mimeType?: string,\n    quality?: number, // between 0 and 1, only for image/jpeg or image/webp\n    /**\n     * Crop Region to take snapshot. If not set, the whole canvas is used.\n     */\n    rect?: CanvasSnapshotRect,\n    scale?: number,\n    displayPixelRatio?: number,\n    cloneCanvas?: boolean, // default = true if safari, false otherwise. required for safari where canvas is flipped if premultipliedAlpha is true\n}\n\nfunction isSafari() {\n    return navigator.userAgent.includes('Safari') && !navigator.userAgent.includes('Chrome')\n}\n\nexport class CanvasSnapshot {\n    public static Debug = false\n    public static async GetClonedCanvas(\n        canvas: HTMLCanvasElement,\n        {\n            rect = {x: 0, y: 0, width: canvas.width, height: canvas.height, assumeClientRect: false, normalized: false},\n            displayPixelRatio = 1,\n            scale = 1,\n        }: CanvasSnapshotOptions): Promise<HTMLCanvasElement> {\n        rect = {...rect}\n\n        // return canvas.toDataURL(mimeType);\n        // in Safari, images are flipped when premultipliedAlpha is true in canvas, so it works with 2d context, see: https://github.com/pixijs/pixi.js/blob/dev/packages/extract/src/Extract.ts and https://github.com/pixijs/pixi.js/issues/2951\n\n        const destCanvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas') as HTMLCanvasElement\n\n        // const iRect = {...rect}\n\n        if (!rect.normalized) {\n            if (rect.assumeClientRect) {\n                rect.x = Math.floor(rect.x * canvas.width / (displayPixelRatio * canvas.clientWidth))\n                rect.y = Math.floor(rect.y * canvas.height / (displayPixelRatio * canvas.clientHeight))\n                rect.width = Math.floor(rect.width * canvas.width / (displayPixelRatio * canvas.clientWidth))\n                rect.height = Math.floor(rect.height * canvas.height / (displayPixelRatio * canvas.clientHeight))\n            }\n        } else {\n            rect.x = Math.floor(rect.x * canvas.width)\n            rect.y = Math.floor(rect.y * canvas.height)\n            rect.width = Math.floor(rect.width * canvas.width)\n            rect.height = Math.floor(rect.height * canvas.height)\n            if (rect.assumeClientRect) {\n                console.warn('CanvasSnapshot: rect.assumeClientRect is ignored when rect is normalized')\n            }\n        }\n\n        destCanvas.width = Math.floor(rect.width * scale * displayPixelRatio)\n        destCanvas.height = Math.floor(rect.height * scale * displayPixelRatio)\n\n        const destCtx = destCanvas.getContext('2d')\n        if (!destCtx) {\n            console.error('snapshot: cannot create context')\n            return destCanvas\n        }\n\n        // console.log(canvas.style.background)\n        const background = canvas.style.background || canvas.parentElement?.style.background || ''\n        if (background.includes('url')) {\n            const url = /url\\(\"(.*)\"\\)/ig.exec(background)?.[1]\n            if (url) {\n                const img = new Image()\n                img.src = url\n                await new Promise<void>((resolve, reject) => {\n                    img.onload = () => resolve()\n                    img.onerror = () => reject()\n                    if (img.complete) resolve()\n                })\n                destCtx.drawImage(img,\n                    Math.floor(img.width * rect.x * displayPixelRatio / canvas.width), Math.floor(img.height * rect.y * displayPixelRatio / canvas.height),\n                    Math.floor(img.width * rect.width * displayPixelRatio / canvas.width), Math.floor(img.height * rect.height * displayPixelRatio / canvas.height),\n                    0, 0,\n                    destCanvas.width,\n                    destCanvas.height,\n                )\n\n            }\n        } else {\n            destCtx.fillStyle = canvas.style.background || canvas.parentElement?.style.backgroundColor || '#00000000'\n            destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height)\n        }\n\n        destCtx?.drawImage(\n            canvas,\n            Math.floor(rect.x * displayPixelRatio), Math.floor(rect.y * displayPixelRatio), Math.floor(rect.width * displayPixelRatio), Math.floor(rect.height * displayPixelRatio),\n            0, 0, destCanvas.width, destCanvas.height,\n        )\n\n        const debug = this.Debug\n        if (debug) {\n            // console.log(\n            //     destCanvas,\n            // )\n            document.body.appendChild(destCanvas)\n            destCanvas.style.position = 'absolute'\n            destCanvas.style.top = '0'\n            destCanvas.style.left = '0'\n            destCanvas.style.borderWidth = '2px'\n            destCanvas.style.borderColor = '#ff00ff'\n            setTimeout(() => destCanvas.remove(), 5000)\n        }\n\n        return destCanvas\n    }\n\n    public static async GetDataUrl(canvas: HTMLCanvasElement, {mimeType = 'image/png', quality, ...options}: CanvasSnapshotOptions): Promise<string> {\n        const doClone = isSafari() || options.cloneCanvas || options.rect || options.scale || options.displayPixelRatio\n        if (!doClone && (options.rect || options.scale || options.displayPixelRatio)) console.warn('CanvasSnapshot: rect, scale and displayPixelRatio are ignored when cloneCanvas is false')\n        const clone = !doClone ? canvas : await this.GetClonedCanvas(canvas, options)\n        // const clone = options.cloneCanvas === false ? canvas : await this.GetClonedCanvas(canvas, options)\n        const url = clone.toDataURL(mimeType, quality)\n        if (!this.Debug && clone !== canvas) clone.remove()\n        return url\n    }\n\n    // set one of canvas or context to draw in.\n    public static async GetImage(canvas: HTMLCanvasElement, options: CanvasSnapshotOptions = {}): Promise<HTMLImageElement> {\n        const imgUrl = await this.GetDataUrl(canvas, options)\n        return new Promise<HTMLImageElement>((resolve, reject) => {\n            const img = new Image()\n            img.onload = () => resolve(img)\n            img.onerror = () => reject()\n            img.src = imgUrl\n        })\n    }\n\n    public static async GetBlob(canvas: HTMLCanvasElement, options: CanvasSnapshotOptions = {}): Promise<Blob> {\n        const doClone = isSafari() || options.cloneCanvas || options.rect || options.scale || options.displayPixelRatio\n        if (!doClone && (options.rect || options.scale || options.displayPixelRatio)) console.warn('rect, scale and displayPixelRatio are ignored when cloneCanvas is false')\n        const clone = !doClone ? canvas : await this.GetClonedCanvas(canvas, options)\n        // const clone = options.cloneCanvas === false ? canvas : await this.GetClonedCanvas(canvas, options)\n\n        const blob = await new Promise<Blob>((resolve, reject) => {\n            clone.toBlob((b) => {\n                if (b) resolve(b)\n                else reject(new Error('CanvasSnapshot Failed to export blob from canvas'))\n            }, options.mimeType ?? 'image/png', options.quality)\n        })\n        if (!this.Debug && clone !== canvas) clone.remove()\n\n        return blob\n    }\n\n    public static async GetFile(canvas: HTMLCanvasElement, filename = 'image', options: CanvasSnapshotOptions = {}): Promise<File|string> {\n        const suffix = '.' + (options.mimeType?.split('/')[1]?.toLowerCase() || 'png')\n        const fname = !filename.toLowerCase().endsWith(suffix) ? filename + suffix : filename\n        return options.getDataUrl ? await this.GetDataUrl(canvas, options) : new File([await this.GetBlob(canvas, options)], fname, {\n            type: options.mimeType ?? 'image/png',\n            lastModified: now(),\n        })\n    }\n\n    public static async GetTiledFiles(canvas: HTMLCanvasElement, filePrefix = 'image', tileRows = 2, tileCols = 2, options: CanvasSnapshotOptions = {}): Promise<(File|string)[]> {\n        const rect = options.rect ?? {x: 0, y: 0, width: 1, height: 1, assumeClientRect: false, normalized: true}\n\n        // rect.width *= options.displayPixelRatio ?? 1\n        // rect.height *= options.displayPixelRatio ?? 1\n\n        const files = []\n        for (let i = 0; i < tileCols; i++) {\n            for (let j = 0; j < tileRows; j++) {\n                const ext = options.mimeType?.split('/')[1] ?? 'png'\n                const file = await this.GetFile(canvas, `${filePrefix}_${i}_${j}.${ext}`, {\n                    rect: {\n                        x: rect.x + i * rect.width / tileCols,\n                        y: rect.y + j * rect.height / tileRows,\n                        width: rect.width / tileCols,\n                        height: rect.height / tileRows,\n                        assumeClientRect: rect.assumeClientRect,\n                        normalized: rect.normalized,\n                    },\n                }).catch(e => {\n                    console.error(`CanvasSnapshot - Error exporting tiled file ${i}, ${j}`, e)\n                    return null\n                })\n                if (file)\n                    files.push(file)\n            }\n        }\n        return files\n    }\n\n}\n","import {deepAccessObject, getOrCall, onChange, serializable, serialize, ValOrFunc} from 'ts-browser-helpers'\nimport {\n    generateUiConfig,\n    generateValueConfig,\n    IUiConfigContainer,\n    uiButton,\n    uiDropdown,\n    UiObjectConfig,\n    UiObjectType,\n    uiSlider,\n    uiToggle,\n} from 'uiconfig.js'\nimport {generateUUID} from '../three'\nimport {AnimationOptions, Easing} from '@repalash/popmotion'\nimport {EasingFunctions, EasingFunctionType} from './animation'\nimport type {ThreeViewer} from '../viewer'\nimport {ThreeSerialization} from './serialization'\nimport type {AnimationResult, PopmotionPlugin} from '../plugins'\nimport {EventDispatcher} from 'three'\n\nconst viewerOptions = {\n    'None': '',\n    ['Background Color']: 'scene.backgroundColor',\n    ['Environment Rotation']: 'scene.environmentRotation.y',\n    ['Environment Intensity']: 'scene.environmentIntensity',\n    // '[Fixed Env Map Direction']: 'scene.fixedEnvMapDirection',\n    ['Camera Position']: 'scene.mainCamera.position',\n    ['Camera Rotation']: 'scene.mainCamera.rotation',\n    ['Camera Zoom']: 'scene.mainCamera.zoom',\n    ['Camera FOV']: 'scene.mainCamera.fov',\n    // '[Directional Light Color']: 'plugins.RandomizedDirectionalLight.light.color',\n    // - todo dosent update shadows every frame\n    // '[Directional Light Direction']: 'plugins.RandomizedDirectionalLight.light.randomParams.direction',\n    // '[Diamond Env Map Rotation']: 'plugins.Diamond.envMap.rotation',\n    ['Tonemap Exposure']: 'plugins.Tonemap.exposure',\n    ['Tonemap Saturation']: 'plugins.Tonemap.saturation',\n    ['Tonemap Contrast']: 'plugins.Tonemap.contrast',\n    ['Tonemap Tone Mapping']: 'plugins.Tonemap.toneMapping',\n    ['SSR Intensity']: 'plugins.SSReflection.passes.ssr.passObject.intensity',\n    ['SSR Boost']: 'plugins.SSReflection.passes.ssr.passObject.boost',\n    ['Chromatic Aberration Intensity']: 'plugins.ChromaticAberration.intensity',\n    ['Film Grain Intensity']: 'plugins.FilmicGrain.intensity',\n    ['Vignette Color']: 'plugins.Vignette.color',\n    ['Vignette Power']: 'plugins.Vignette.power',\n    ['Depth of Field Focal Point']: 'plugins.DepthOfField._focalPointHit',\n    ['Depth of Field Near Far Blur Scale X']: 'plugins.DepthOfField.pass.nearFarBlurScale.x',\n    ['Depth of Field Near Far Blur Scale Y']: 'plugins.DepthOfField.pass.nearFarBlurScale.y',\n    ['Depth of Field Focal Depth Range Y']: 'plugins.DepthOfField.pass.focalDepthRange.y',\n    ['Bloom Intensity']: 'plugins.Bloom.pass.intensity',\n    ['Bloom Radius']: 'plugins.Bloom.pass.radius',\n    ['Bloom Power']: 'plugins.Bloom.pass.power',\n}\n\nexport type TUpdaterType = (()=>void)\n\nexport interface IAnimationObject<V> {\n    access?: string, // dot separated target accessor. 'model.rotation' will give this.model.rotation\n    duration?: number,\n    delay?: number,\n    ease?: Easing|EasingFunctionType;\n    updater?: (TUpdaterType)[]; // dispatch update, default none\n    animSet?: IAnimSet,\n    animSetParallel?: boolean,\n    name?: string,\n    options: AnimationOptions<V>,\n    // to?: V | ((fromVal:V, target: any)=>V),\n    // from?: V,\n    values: V[]\n    offsets?: number[],\n\n    animate?: (delay?: number, canComplete?: boolean)=>AnimationResult,\n    result?: AnimationResult\n    uiRef?: UiObjectConfig,\n    uiObjectType?: UiObjectType,\n    targetObject?: Record<string, any>,\n}\nexport type IAnimSet = (IAnimationObject<any>)[]\n\nexport function extractAnimationKey(o: IAnimationObject<any>, extraGetters?: Record<string, (key: string, acc: string[])=>{tar: any, acc: string[], onChange?: ()=>void}|undefined>) {\n    let acc = Array.from((o.access ?? '').split(/(?<!\\\\)\\./)) // split by dot, but not escaped dots\n    let tar: any = o.targetObject\n    let onChange1: undefined | (()=>void) = undefined\n\n    const key = acc.pop()?.replace(/\\\\\\./g, '.') // deep access till the last element, then bind\n    if (!key || key.length === 0) return {key: undefined, tar}\n\n    extraGetters = extraGetters ?? tar?._animGetters // _animGetters are set in AnimationObjectPlugin\n    const getterType = acc.length >= 1 ? acc[0] : undefined\n    const getterName = acc.length >= 2 ? acc[1]?.replace(/\\\\\\./g, '.') : undefined\n    if (extraGetters && getterType && getterType in extraGetters && getterName) {\n        acc = acc.slice(2)\n        const res = extraGetters[getterType](getterName, acc)\n        if (!res) tar = res\n        else {\n            tar = res.tar\n            // acc = acc.slice(res.i + 1)\n            acc = res.acc\n            onChange1 = res.onChange ?? onChange1\n        }\n    }\n    tar = deepAccessObject(acc, tar)\n    return {key, tar, onChange: onChange1}\n}\n\nexport interface AnimationObjectEventMap {\n    'animationAdd': {animation: AnimationObject}\n    'animationRemove': {animation: AnimationObject, fromChild: boolean}\n    'update': object\n}\n\n/**\n * AnimationObject - An object for containing keyframe-based animation for properties\n *\n * AnimationObject extends popmotion and interfaces with the {@link ThreeViewer} to provide a keyframe animation system that can animate any accessible property\n * on objects, materials, or the viewer itself. It supports complex timing, easing, and serialization.\n *\n * It is used in {@link AnimationObjectPlugin}.\n *\n * Key Features:\n * - **Property Access**: Uses dot-notation strings to access nested properties (e.g., 'position.x', 'material.roughness')\n * - **Keyframe System**: Define multiple keyframes with custom timing and values\n * - **Easing Support**: Built-in easing functions or custom easing functions\n * - **Timeline Integration**: Seamlessly works with viewer's global timeline\n * - **Serialization**: Automatically saves/loads with scene data\n * - **UI Integration**: Generates UI controls and supports interactive editing\n * - **Hierarchical**: Can contain child animations for complex choreography\n *\n * @example Basic Animation\n * ```typescript\n * const anim = new AnimationObject(myObject)\n * anim.access = 'position.y'\n * anim.values = [0, 5, 0]\n * anim.offsets = [0, 0.5, 1]\n * anim.duration = 2000\n * anim.ease = (x: number) => 1 - Math.cos(x * Math.PI / 2) // Custom easeOutSine\n * anim.updateTarget = true\n * ```\n *\n * @example Complex Animation with Multiple Keyframes\n * ```typescript\n * const colorAnim = new AnimationObject(material)\n * colorAnim.access = 'color'\n * colorAnim.values = ['#ff0000', '#00ff00', '#0000ff', '#ff0000']\n * colorAnim.offsets = [0, 0.33, 0.66, 1]\n * colorAnim.duration = 4000\n * anim.ease = 'easeInOutSine'\n * colorAnim.delay = 500\n * ```\n *\n */\n@serializable('AnimationObject')\nexport class AnimationObject<V = any> extends EventDispatcher<AnimationObjectEventMap> implements IAnimationObject<V>, IUiConfigContainer {\n    uuid = generateUUID()\n    setDirty = () => {\n        // console.log('update')\n        this.updater = []\n        if (this.options) {\n            this.options.repeatType = this.repeatType\n            this.options.repeat = this.repeat\n        }\n        if (!this._upfn) return\n        if (this.updateScene) this.updater.push(this._upfn.scene)\n        if (this.updateCamera) this.updater.push(this._upfn.camera)\n        if (this.updateViewer) this.updater.push(this._upfn.viewer)\n        if (this.updateTarget) this.updater.push(this._upfn.target)\n        this.dispatchEvent({type: 'update'})\n    }\n\n    @serialize()\n    @onChange('setDirty')\n        // @uiInput()\n        name = ''\n\n    @serialize()\n    // @uiInput()\n    // @uiDropdown('Property', Object.entries(options).map(([label, value])=>({label, value})))\n    @onChange(AnimationObject.prototype._onAccessChanged)\n        access = '' // dot separated target accessor. 'scene.modelRoot.rotation' will give this.model.rotation\n\n    // @uiConfig(undefined, {params: (t: AnimationObject)=>({onChange: t.setDirty})})\n    // @serialize() from?: V\n    //\n    // @uiConfig(undefined, {params: (t: AnimationObject)=>({onChange: t.setDirty})})\n    // @serialize()\n    //     to?: V // | ((fromVal: V, target: any) => V)\n\n    @serialize()\n        values: V[] = []\n    @serialize()\n        offsets: number[] = []\n\n    @serialize()\n        // @uiConfig()\n        options: AnimationOptions<V> = { // extra options\n        // onUpdate: (v: V)=>{\n        //     console.log(v)\n        // },\n        // onPlay: ()=>{\n        //     if (this.updateCamera) getOrCall(this.target)?.scene.mainCamera.setInteractions(false, this.uuid)\n        // },\n        // onStop: ()=>{\n        //     if (this.updateCamera) getOrCall(this.target)?.scene.mainCamera.setInteractions(true, this.uuid)\n        // },\n        // onComplete: ()=>{\n        //     if (this.updateCamera) getOrCall(this.target)?.scene.mainCamera.setInteractions(true, this.uuid)\n        // },\n        }\n\n    @serialize()\n    @uiSlider(undefined, [0, 10000], 1, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        duration = 1000 // ms\n\n    @serialize() @uiSlider(undefined, [0, 10000], 1, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        delay = 0\n\n    /**\n     * Number of times to repeat the animation.\n     * Doesn't work right now\n     */\n    @serialize()\n    // @uiSlider(undefined, [0, 10], 1, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        repeat = 0\n\n    /**\n     * Delay between repeats in milliseconds.\n     * Doesn't work right now\n     */\n    @serialize()\n    // @uiSlider(undefined, [0, 10], 1, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        repeatDelay = 0\n\n    /**\n     * Type of repeat behavior.\n     * - 'loop': repeats the animation from the beginning.\n     * - 'reverse': plays the animation in reverse after it completes.\n     * - 'mirror': plays the animation in reverse after it completes. todo only mirrors the time, not values?\n     *\n     * Doesn't work right now\n     */\n    @serialize()\n    // @uiDropdown('repeatType', ['loop', 'reverse'/* , 'mirror'*/].map((label:string)=>({label})), (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        repeatType: 'loop' | 'reverse' | 'mirror' = 'reverse'\n\n    @serialize() @uiDropdown('ease', Object.keys(EasingFunctions).map((label:string)=>({label})), (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        ease: EasingFunctionType = 'easeInOutSine'\n\n    updater: TUpdaterType[] = []\n\n    uiObjectType?: UiObjectType\n    // targetObject?: Record<string, any>\n\n    get targetObject(): Record<string, any>|undefined {\n        return getOrCall(this.target) ?? this.parent?.targetObject\n    }\n\n    @serialize()\n    @uiToggle(undefined, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        updateScene = false\n\n    @serialize()\n    @uiToggle(undefined, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        updateCamera = false\n\n    @serialize()\n    @uiToggle(undefined, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        updateViewer = false\n\n    @serialize()\n    // @uiToggle(undefined, (t: AnimationObject)=>({hidden: ()=>!t.access}))\n    @onChange('setDirty')\n        updateTarget = false\n\n    // uiConfig!: UiObjectConfig\n\n    @onChange(AnimationObject.prototype._onAccessChanged)\n        target?: Record<string, any>\n    @onChange(AnimationObject.prototype._onAccessChanged)\n    readonly viewer?: ValOrFunc<ThreeViewer|undefined>\n\n    getViewer(): ThreeViewer|undefined {\n        return this.viewer ? getOrCall(this.viewer) : this.parent?.getViewer()\n    }\n\n    constructor(target?: object|undefined, viewer?: ValOrFunc<ThreeViewer|undefined>, name = '') {\n        super()\n        this.target = target\n        this.viewer = viewer\n        this.name = name\n        this.dispatchEvent = this.dispatchEvent.bind(this)\n    }\n\n    fromJSON(data1: any, meta?: any): this {\n        let data = {...data1}\n        if (data.access !== undefined) { // first set access so values are initialized\n            this.access = data.access\n            delete data.access\n        }\n        if (data.from !== undefined) { // old files with to/from\n            data = {...data}\n            data.values = [data.from, data.to]\n            data.offsets = [0, 1]\n            delete data.from\n            delete data.to\n        }\n        ThreeSerialization.Deserialize(data, this, meta, true)\n        this.animSet.map(i=>{\n            i.parent = this\n        })\n        return this\n    }\n\n    private _lastAccess = ''\n    private _lastTarget: any = undefined\n    protected _onAccessChanged() {\n        const tar = this.targetObject\n        if (tar && tar === this.getViewer() && !Object.values(viewerOptions).includes(this.access)) {\n            this.access = ''\n            return\n        }\n        if (tar && tar === this.getViewer() && this.access === 'scene.environment.rotation') {\n            this.access = 'scene.environmentRotation.y'\n            return\n        }\n        if (tar && tar === this.getViewer() && this.access === 'scene.envMapIntensity') {\n            this.access = 'scene.environmentIntensity'\n            return\n        }\n        if (this.access !== this._lastAccess || !this.values.length || this._lastTarget !== tar && tar && this._lastTarget) {\n            this._lastAccess = this.access\n            const lastValues = this.values\n            this.values = []\n            this.offsets = []\n            const clone = this._thisValueCloner()\n            if (!clone) {\n                this.refreshUi()\n                return\n            }\n            this.values = [clone(), clone()]\n            // todo improve merge. like it wont work with vectors right now. For that we need to check if primitive type is the same and/or call the .copy() function\n            if (lastValues.length >= 2 && (\n                typeof lastValues[0] === typeof this.values[0] && (typeof lastValues[0] !== 'object' || (lastValues[0] as any).type && (lastValues[0] as any).type === (this.values[0] as any)?.type)\n            )) this.values = lastValues\n            this.offsets = this.offsets.length === this.values.length ? this.offsets : [0, 1]\n            this.refreshUi()\n        }\n    }\n    private _thisValueCloner() {\n        const {key, tar} = extractAnimationKey(this)\n        const val = tar && key !== undefined ? tar[key] : null\n        return val === undefined || val === null ? null : () => {\n            if (!val) return val\n            if (val.isColor) return '#' + val.getHexString()\n            const res = typeof val.clone === 'function' ? val.clone() : typeof val === 'object' ? {...val} : val\n            return res\n        }\n    }\n\n    addKeyframe(time: number) {\n        if (this.values.length < 2) {\n            console.warn('AnimationObject: Values not initialized, cannot add keyframe', this)\n            return\n        }\n        const value = this._thisValueCloner()\n        if (!value) {\n            console.warn('AnimationObject: No value to add keyframe for', this)\n            return\n        }\n        const offsetTime = time - this.delay\n        const duration = this.duration\n        const delay = this.delay\n        const offsets = [...this.offsets]\n        const values = [...this.values]\n        let offset = offsetTime / this.duration\n        let index: number\n        let newDuration = duration\n        let newDelay = delay\n        const newValues = [...this.values]\n        const newOffsets = [...this.offsets]\n        if (offset < 0) {\n            const o = -offset\n            offset = 0\n            for (let i = 0; i < offsets.length; i++) {\n                newOffsets[i] = (offsets[i] + o) / (1 + o)\n            }\n            newDuration = duration - offsetTime\n            newDelay = delay + offsetTime\n            index = 0\n        } else if (offset > 1) {\n            const o = offset - 1\n            offset = 1\n            for (let i = 0; i < offsets.length; i++) {\n                newOffsets[i] = offsets[i] / (1 + o)\n            }\n            newDuration = offsetTime\n            index = offsets.length\n        } else {\n            index = offsets.findIndex(o => o >= offset)\n            if (index < 0) {\n                index = this.offsets.length\n            } else if (this.offsets[index] === offset) {\n                console.warn('AnimationObject: Keyframe already exists at offset', offset, this)\n                return\n            }\n        }\n        const val = value()\n        newValues.splice(index, 0, val)\n        newOffsets.splice(index, 0, offset)\n        const redo = ()=>{\n            this.duration = newDuration\n            this.delay = newDelay\n            this.values = newValues\n            this.offsets = newOffsets\n            this.setDirty()\n        }\n        const undo = ()=>{\n            this.duration = duration\n            this.delay = delay\n            this.values = values\n            this.offsets = offsets\n            this.setDirty()\n        }\n        redo()\n        return {undo, redo}\n    }\n\n    updateKeyframe(index: number) {\n        if (index < 0 || index >= this.values.length) {\n            console.warn('AnimationObject: Invalid keyframe index', index, this)\n            return\n        }\n\n        const value = this._thisValueCloner()\n        if (!value) {\n            console.warn('AnimationObject: No value to update keyframe for', this)\n            return\n        }\n        const oldValue = this.values[index]\n        const newValue = value()\n        const redo = ()=>{\n            this.values[index] = newValue\n            this.setDirty()\n        }\n        const undo = ()=>{\n            this.values[index] = oldValue\n            this.setDirty()\n        }\n        redo()\n        return {undo, redo}\n    }\n\n    isValueSame(index: number) {\n        if (index < 0 || index >= this.values.length) {\n            console.warn('AnimationObject: Invalid keyframe index', index, this)\n            return false\n        }\n\n        const value = this._thisValueCloner()\n        if (!value) {\n            console.warn('AnimationObject: No value to update keyframe for', this)\n            return false\n        }\n        const oldValue = this.values[index]\n        const newValue = value()\n\n        if (oldValue === newValue) return true\n        if (typeof oldValue !== typeof newValue) return false\n        if (typeof oldValue === 'object' && typeof newValue === 'object') {\n            if ((oldValue as any)?.equals) {\n                return (oldValue as any).equals(newValue)\n            }\n            if (newValue?.equals) {\n                return newValue.equals(oldValue)\n            }\n        }\n        return false\n    }\n\n    refreshUi() {\n        this.setDirty()\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    }\n\n    parent?: AnimationObject\n\n    add(o: AnimationObject) {\n        this.animSet.push(o)\n        o.parent = this\n        this.dispatchEvent({type: 'animationAdd', animation: o})\n        o.addEventListener('update', this.dispatchEvent)\n        o.addEventListener('animationAdd', this.dispatchEvent)\n        o.addEventListener('animationRemove', this.dispatchEvent)\n        this.refreshUi()\n    }\n    remove(o: AnimationObject, fromChild = false) {\n        const idx = this.animSet.indexOf(o)\n        if (idx >= 0) {\n            this.animSet.splice(idx, 1)\n            o.parent = undefined\n            this.dispatchEvent({type: 'animationRemove', animation: o, fromChild})\n            o.removeEventListener('update', this.dispatchEvent)\n            o.removeEventListener('animationAdd', this.dispatchEvent)\n            o.removeEventListener('animationRemove', this.dispatchEvent)\n            this.refreshUi()\n        }\n    }\n\n    private _upfn = {\n        viewer: () => this.getViewer()?.setDirty(),\n        renderer: () => this.getViewer()?.renderManager.reset(),\n        scene: () => {\n            this.getViewer()?.scene.setDirty()\n        },\n        camera: () => this.getViewer()?.scene.mainCamera.setDirty(),\n        target: () => {\n            const t = this.targetObject\n            if (t && typeof t.setDirty === 'function') {\n                t.setDirty({frameFade: false, refreshScene: false, source: 'AnimationObject', key: this.access})\n            }\n        },\n    }\n\n    @uiButton('Animate')\n    animate(delay = 0, canComplete = true): AnimationResult {\n        // console.log('animate', this)\n        if (typeof delay !== 'number' || isNaN(delay)) { // called from ui\n            delay = 0\n        }\n        if (canComplete && this.result) {\n            console.warn('AnimationObject: Already animating, stopping previous animation')\n            this.stop()\n        }\n        const viewer = this.getViewer()\n        const pop = viewer?.getPlugin<PopmotionPlugin>('PopmotionPlugin')\n        if (!pop) {\n            console.error(`AnimationObject: No ${!viewer ? 'viewer' : 'PopmotionPlugin'}`)\n            const id = generateUUID()\n            return {\n                id,\n                options: this.options,\n                stop: () => {return},\n                promise: Promise.resolve(id),\n                anims: [],\n                // completed: true,\n            }\n        }\n        return pop.animateObject(this, 0, canComplete, undefined, delay)\n    }\n\n    result: AnimationResult|undefined\n\n    // todo during reverse delay should be time - duration\n    // @uiButton('Animate Reverse')\n    // async animateReverse() {\n    //     await this.animate(true)\n    // }\n\n    @uiButton('Stop')\n    stop() {\n        if (!this.result) return\n        this.result.stop()\n        this.result = undefined\n    }\n\n    @uiButton('Delete')\n    async removeFromParent2() {\n        const viewer = this.getViewer()\n        if (this.parent && viewer) {\n            const confirm = await viewer.dialog.confirm(`Delete: Are you sure you want to delete the animation ${this.name}?`)\n            if (confirm) this.removeFromParent()\n        }\n    }\n\n    removeFromParent() {\n        if (this.parent) this.parent.remove(this, true)\n    }\n\n    @serialize()\n        // @uiToggle()\n        animSetParallel = false\n\n    @serialize()\n        // @uiConfig()\n        animSet: AnimationObject[] = []\n\n    // @uiButton('Add Animation')\n    addAnimation() {\n        const o = new AnimationObject(this.target)\n        this.add(o)\n        return o\n    }\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: ()=>this.name || this.access || 'Animation',\n        children: [\n            ()=>this.target ? null : {\n                type: 'input',\n                label: 'Property',\n                property: [this, 'access'],\n                children: Object.entries(viewerOptions).map(([label, value])=>({label, value})),\n            },\n            ()=> this.values.flatMap((val, i)=>[\n                {\n                    ...generateValueConfig(this.values, i + '', undefined, val),\n                    label: i === 0 ? 'From' : i === this.values.length - 1 ? 'To' : 'Key ' + i,\n                    onChange: ()=>this.setDirty(),\n                },\n                i > 0 && i < this.values.length - 1 ? {\n                    type: 'number',\n                    label: 'Offset ' + i,\n                    property: [this.offsets, i + ''],\n                    bounds: [0, 1],\n                    onChange: ()=>this.setDirty(),\n                } : null,\n            ]),\n            generateUiConfig(this),\n        ],\n        uuid: generateUUID(),\n    }\n\n}\n","import {ThreeViewer} from '../viewer'\nimport {getOrCall, ValOrFunc} from 'ts-browser-helpers'\nimport {AddModelOptions, IGeometry, IObject3D, IObjectProcessor} from '../core'\n\nexport function defaultObjectProcessor(viewerF: ValOrFunc<ThreeViewer|undefined>): IObjectProcessor {\n    return {\n        processObject: (object: IObject3D)=>{\n            const viewer = getOrCall(viewerF)\n            if (!viewer || object.userData.autoRegisterInManager === false) return\n            viewer.object3dManager.registerObject(object)\n            if (object.material) {\n                if (!viewer.assetManager) {\n                    console.error('AssetManager is not initialized yet, cannot register material', object.material)\n                    return\n                }\n                const mats = Array.isArray(object.material) ? object.material : [object.material]\n                for (const mat of mats) {\n                    if (mat.userData.autoRegisterInManager === false) continue\n                    viewer.assetManager.materials.registerMaterial(mat)\n                }\n            }\n        },\n    }\n}\n\n// todo move to object3dmanager\nexport function addModelProcess(obj: IObject3D, {\n    autoCenter = false, centerGeometries = false, centerGeometriesKeepPosition = true, autoScale = false, autoScaleRadius = 2., license,\n}: AddModelOptions) {\n    if (license) obj.userData.license = [obj.userData.license, license].filter(v=>v).join(', ')\n    const process = ()=>{\n        if (autoCenter && !obj.userData.isCentered && !obj.userData.pseudoCentered && !obj.isLight) { // pseudoCentered is legacy\n            obj.autoCenter && obj.autoCenter()\n        } else {\n            obj.userData.isCentered = true // mark as centered, so that autoCenter is not called again when file is reloaded.\n        }\n        if (autoScale && !obj.userData.autoScaled && !obj.isLight) {\n            obj.autoScale && obj.autoScale(obj.userData.autoScaleRadius || autoScaleRadius)\n        } else {\n            obj.userData.autoScaled = true // mark as auto-scaled, so that autoScale is not called again when file is reloaded.\n        }\n        if (centerGeometries && !obj.userData.geometriesCentered) {\n            centerAllGeometries(obj, centerGeometriesKeepPosition)\n            obj.userData.geometriesCentered = true\n        } else {\n            obj.userData.geometriesCentered = true // mark as centered, so that geometry center is not called again when file is reloaded.\n        }\n    }\n    if (obj._loadingPromise) obj._loadingPromise.finally(process)\n    else process()\n}\n\nexport function centerAllGeometries(obj: IObject3D, keepPosition: boolean) {\n    const geoms = new Set<IGeometry>()\n    obj.traverseModels && obj.traverseModels((o) => {\n        o.geometry && geoms.add(o.geometry)\n    }, {visible: false, widgets: false})\n    const undos: (() => void)[] = []\n    geoms.forEach(g => undos.push(g.center2(undefined, keepPosition)))\n    return () => undos.forEach(u => u())\n}\n\n","import {FileLoader, LoadingManager} from 'three'\nimport {blobToDataURL} from 'ts-browser-helpers'\n\nexport class DataUrlLoader extends FileLoader {\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.responseType = 'blob'\n    }\n\n    load(url: string, onLoad?: (response: (any)) => void, onProgress?: (request: ProgressEvent) => void, onError?: (event: unknown) => void): any {\n        return super.load(url, (res)=>{\n            try {\n                onLoad?.(blobToDataURL(res as any as Blob))\n            } catch (e: any) {\n                onError?.(e)\n            }\n        }, onProgress, onError)\n    }\n}\n","import {embedUrlRefs, parseFileExtension, svgUrl} from 'ts-browser-helpers'\nimport {uiDropdown, uiFolderContainer, uiInput, UiObjectConfig, uiSlider, uiToggle} from 'uiconfig.js'\nimport {IAssetImporter} from '../assetmanager'\nimport {LinearFilter} from 'three'\nimport {ITexture} from '../core'\nimport {DataUrlLoader} from '../assetmanager/import/DataUrlLoader'\nimport {isNonRelativeUrl} from './browser-helpers'\n\nexport interface ITextSVGOptions{\n    text: string;\n    fontFamily?: string;\n    fontPath?: string;\n    svgBackground?: string;\n    xOffset?: number; yOffset?: number;\n    width?: number; height?: number;\n    boxWidth?: number; boxHeight?: number;\n    fontSize?: number;\n    fontWeight?: string | number;\n    fontStyle?: 'normal' | 'italic' | 'oblique';\n    lineHeight?: string | number;\n    letterSpacing?: string | number;\n    whiteSpace?: 'normal' | 'pre' | 'nowrap' | 'pre-wrap' | 'pre-line';\n    direction?: 'auto' | 'ltr' | 'rtl';\n    maskText?: boolean; innerShadow?: boolean;\n    bgFillColor?: string;\n    textColor?: string;\n    textAnchor?: 'start' | 'middle' | 'end';\n    style?: string;\n}\n\nconst onOpsChange = (ctx: TextSVGOptions)=>({\n    onChange: (ev: any)=>{\n        if (!ev.last) return\n        ctx.onChange()\n    },\n})\n\n@uiFolderContainer('Text SVG Options')\nexport class TextSVGOptions implements ITextSVGOptions {\n    @uiInput('Text', onOpsChange) text = 'Custom Text'\n    @uiSlider('Font Size', [2, 1024], 1, onOpsChange) fontSize = 100\n    @uiSlider('Width', [2, 4096], 1, onOpsChange) width = 1024\n    @uiSlider('Height', [2, 4096], 1, onOpsChange) height = 1024\n    @uiSlider('X Offset', [-1024, 1024], 1, onOpsChange) xOffset = 0\n    @uiSlider('Y Offset', [-1024, 1024], 1, onOpsChange) yOffset = 0\n    @uiSlider('V-Width', [2, 4096], 1, onOpsChange) boxWidth = 1024\n    @uiSlider('V-Height', [2, 4096], 1, onOpsChange) boxHeight = 1024\n    @uiDropdown('Text Anchor', ['start', 'middle', 'end'].map(label=>({label} as UiObjectConfig)), onOpsChange) textAnchor: 'start'|'middle'|'end' = 'middle'\n    @uiInput('Font', onOpsChange) fontFamily = ''\n    @uiInput('Font Url', onOpsChange) fontPath = ''\n    @uiInput('Font Weight', onOpsChange) fontWeight: string | number = 'normal'\n    @uiDropdown('Font Style', ['normal', 'italic', 'oblique'].map(label=>({label} as UiObjectConfig)), onOpsChange) fontStyle: 'normal'|'italic'|'oblique' = 'normal'\n    @uiInput('Line Height', onOpsChange) lineHeight: string | number = 'normal'\n    @uiInput('Letter Spacing', onOpsChange) letterSpacing: string | number = 'normal'\n    @uiDropdown('White Space', ['normal', 'pre', 'nowrap', 'pre-wrap', 'pre-line'].map(label=>({label} as UiObjectConfig)), onOpsChange) whiteSpace: 'normal'|'pre'|'nowrap'|'pre-wrap'|'pre-line' = 'normal'\n    @uiDropdown('Direction', ['auto', 'ltr', 'rtl'].map(label=>({label} as UiObjectConfig)), onOpsChange) direction: 'ltr'|'rtl' = 'ltr'\n    @uiToggle('Mask Text', onOpsChange) maskText = false\n    @uiToggle('Inner Shadow', onOpsChange) innerShadow = false\n    @uiInput('Text Color', onOpsChange) textColor = '#000000'\n    @uiInput('BG Fill', onOpsChange) bgFillColor = '#ffffff'\n    @uiInput('SVG BG', onOpsChange) svgBackground = '#ffffff'\n\n    onChange = ()=>{return}\n    set(ops: ITextSVGOptions) {\n        Object.assign(this, ops)\n    }\n    reset() {\n        const oc = this.onChange\n        Object.assign(this, new TextSVGOptions())\n        this.onChange = oc\n    }\n    toJSON() {\n        return {\n            text: this.text,\n            fontFamily: this.fontFamily,\n            fontPath: this.fontPath,\n            svgBackground: this.svgBackground,\n            width: this.width,\n            height: this.height,\n            xOffset: this.xOffset,\n            yOffset: this.yOffset,\n            boxWidth: this.boxWidth,\n            boxHeight: this.boxHeight,\n            fontSize: this.fontSize,\n            fontWeight: this.fontWeight,\n            fontStyle: this.fontStyle,\n            lineHeight: this.lineHeight,\n            letterSpacing: this.letterSpacing,\n            whiteSpace: this.whiteSpace,\n            direction: this.direction,\n            maskText: this.maskText,\n            innerShadow: this.innerShadow,\n            bgFillColor: this.bgFillColor,\n            textColor: this.textColor,\n            textAnchor: this.textAnchor,\n        }\n    }\n    declare uiConfig: UiObjectConfig\n}\n\nexport const fontFormatExtensionMap: any = {\n    'woff': 'woff',\n    'woff2': 'woff2',\n    'ttf': 'truetype',\n    'otf': 'opentype',\n    'eot': 'embedded-opentype',\n}\n\nexport function buildTextSvg({\n    text = 'Custom Text',\n    svgBackground = '#ffffff',\n    xOffset = 0, yOffset = 0,\n    width = 1024, height = 1024,\n    boxWidth = 1024, boxHeight = 1024,\n    fontFamily = '', fontSize = 32,\n    fontWeight = 'normal',\n    fontStyle = 'normal',\n    lineHeight = 'normal',\n    letterSpacing = 'normal',\n    whiteSpace = 'normal',\n    direction = 'auto',\n    maskText = false, innerShadow = false,\n    bgFillColor = '#000000', textColor = '#ffffff',\n    textAnchor = 'middle',\n    style = '',\n}: ITextSVGOptions) {\n    // noinspection CssInvalidPropertyValue\n    const s = `\n<svg style=\"background-color:${svgBackground}\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${boxWidth} ${boxHeight}\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n     <defs>\n        <style>\n        ${style}\n        .text-g{\n            overflow:hidden; text-anchor: ${textAnchor}; \n            font-size: ${fontSize}px;\n            font-family: ${JSON.stringify(fontFamily || 'Arial')};\n            font-weight: ${fontWeight};\n            font-style: ${fontStyle};\n            line-height: ${lineHeight};\n            letter-spacing: ${letterSpacing};\n            white-space: ${whiteSpace};\n            direction: ${direction};\n        }\n        </style>\n    </defs>\n\n    <g class=\"text-g\">\n        <defs>\n\n` + (maskText ? `\n<mask id=\"textMask\">\n<text style=\"fill:white; font-size: ${fontSize}px; font-weight: ${fontWeight}; font-style: ${fontStyle}; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}; white-space: ${whiteSpace}; direction: ${direction};\" x=\"${xOffset + boxWidth / 2}\" y=\"${boxHeight / 2 + yOffset + fontSize / 4}\" > ${text} </text>\n</mask>\n` : '') + `\n\n` + (innerShadow ? `\n<filter id=\"innerShadow\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\">\n<feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"0.5\" result=\"blur\"/>\n<feOffset in=\"blur\" dx=\"1.5\" dy=\"1.5\"/>\n</filter>\n` : '') + `\n\n        </defs>\n\n` + (maskText ? `\n        <g mask=\"url(#textMask)\">\n` : '') + `\n\n        <rect x=\"0\" y=\"0\" width=\"${boxWidth}\" height=\"${boxHeight}\" style=\"fill:${bgFillColor}\"/>\n        <text style=\"${innerShadow ? 'filter: url(#innerShadow);' : ''} fill:${textColor}; font-weight: ${fontWeight}; font-style: ${fontStyle}; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}; white-space: ${whiteSpace}; direction: ${direction};\" x=\"${xOffset + boxWidth / 2}\" y=\"${boxHeight / 2 + yOffset + fontSize / 4}\"> ${text} </text>\n\n` + (maskText ? `\n        </g>\n` : '') + `\n\n    </g>\n</svg>\n`\n    return s\n}\n\n/**\n * List of font names and paths to font files.\n */\nconst fonts: Record<string, string> = {\n    roboto: 'https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2',\n}\n\nexport async function makeTextSvgAdvanced(options: ITextSVGOptions, importer: IAssetImporter) {\n    const fontFamily = options.fontFamily || 'Arial'\n    let fontPath = options.fontPath || fonts[fontFamily] || ''\n    let style = options.style || ''\n    if (fontPath.length > 0) {\n        if (!isNonRelativeUrl(fontPath) && !fontPath.startsWith('blob:') && !fontPath.startsWith('ftp:') && globalThis.window) {\n            // assume relative path to current url window.location\n            const url = new URL(fontPath, window.location.href)\n            fontPath = url.href\n        }\n        const fontExt = parseFileExtension(fontPath) || 'woff'\n        style += '\\n' +\n            (fontPath.length > 0 ? `\n            @font-face {\n                font-family: ${JSON.stringify(fontFamily)};\n                src: url(${fontPath}) format(${fontFormatExtensionMap[fontExt] || fontExt});\n            }` : '')\n    }\n    let svg = buildTextSvg({\n        ...options,\n        fontFamily,\n        style,\n    })\n    svg = await embedUrlRefs(svg, async(p)=>getAssetData(p, importer))\n    svg = svgUrl(svg)\n    // const svgTex = await new SVGTextureLoader().loadAsync(svg)\n    const svgTex = await importer.importSingle<ITexture>(svg)\n    if (!svgTex) return null\n    svgTex.generateMipmaps = false\n    svgTex.minFilter = LinearFilter\n    // svgTex._isSVGTexture = true\n    svgTex.flipY = true\n    svgTex.needsUpdate = true\n    return svgTex\n}\n\nconst assetLoadOptions = undefined\n\nasync function getAssetData(path: string, importer: IAssetImporter) {\n    if (path.startsWith('http://www.w3.org')) return path\n\n    if (!importer) throw new Error('no importer')\n    const assetLoadOptions1 = assetLoadOptions || {\n        fileHandler: new DataUrlLoader(importer.loadingManager),\n        processRaw: false,\n    }\n    try {\n        const assetData = (await importer.importSingle(path, assetLoadOptions1)) as any as string\n        // console.log(asset, assetData, JSON.stringify(this.assetLoadOptions1))\n        return assetData\n    } catch (e) {\n        console.error(e)\n        return ''\n    }\n}\n","import type {ISerializedConfig, IViewerEvent, ThreeViewer} from './ThreeViewer'\nimport {IViewerEventTypes} from './ThreeViewer'\nimport {EventDispatcher} from 'three'\nimport {PartialRecord, SerializationMetaType, ThreeSerialization} from '../utils'\nimport {IViewerPlugin, IViewerPluginAsync} from './IViewerPlugin'\nimport {UiObjectConfig} from 'uiconfig.js'\n\nexport interface AViewerPluginEventMap {\n    serialize: {data: ISerializedConfig}\n    deserialize: {data: ISerializedConfig, meta?: SerializationMetaType}\n}\n\n/**\n * Base Class for Viewer Plugins\n * @category Viewer\n */\nexport abstract class AViewerPlugin<TE extends AViewerPluginEventMap = AViewerPluginEventMap, TViewer extends ThreeViewer = ThreeViewer, IsSync extends boolean = boolean> extends EventDispatcher<TE & AViewerPluginEventMap> implements IViewerPlugin<TViewer, IsSync> {\n    declare ['constructor']: typeof AViewerPlugin\n    public static readonly PluginType: string = 'AViewerPlugin'\n    public static readonly OldPluginType?: string\n    protected _dirty = false\n    abstract isViewerPluginSync: IsSync extends true ? true : false\n\n    uiConfig?: UiObjectConfig = undefined // if this is showing an error, remove all `get uiConfig` and use objects\n\n    protected _viewer?: TViewer\n\n    // this is just a property, not an indicator that a plugin is used, to disable a plugin, just remove it from the viewer\n    abstract enabled: boolean\n\n    abstract onAdded(viewer: TViewer): IsSync extends false ? Promise<void> : void\n\n    abstract onRemove(viewer: TViewer): IsSync extends false ? Promise<void> : void\n\n    dispose(): void {\n        return\n    }\n\n    toJSON(meta?: SerializationMetaType): ISerializedConfig {\n        const data: any = ThreeSerialization.Serialize(this, meta, true)\n        data.type = this.constructor.PluginType\n        data.assetType = 'config'\n        this.dispatchEvent({type: 'serialize', data})\n        return data\n    }\n\n    fromJSON(data: ISerializedConfig, meta?: SerializationMetaType): this|null|Promise<this|null> {\n        if (data.type !== this.constructor.PluginType && data.type !== this.constructor.OldPluginType)\n            return null\n        ThreeSerialization.Deserialize(data, this, meta, true)\n        this.dispatchEvent({type: 'deserialize', data, meta})\n        return this\n    }\n\n    protected _storeKey(prefix?: string) {\n        return (prefix ?? 'webgi') + '_' + (this.constructor.PluginType || this.constructor.name)\n    }\n\n\n    exportState() {\n        return this._viewer?.exportPluginConfig(this) ?? this.toJSON?.()\n    }\n    async importState(state: any) {\n        if (this._viewer) await this._viewer.importPluginConfig(state, this)\n        else this.fromJSON?.(state)\n    }\n\n    protected _viewerListeners: PartialRecord<IViewerEventTypes, (e: IViewerEvent)=>void> = {}\n    protected _onViewerEvent = (e: IViewerEvent)=> {\n        const et = e.eType\n        et && this._viewerListeners[et]?.(e)\n        return e\n    }\n\n    private _disabledBy = new Set<any>()\n    disable = (key: any, setDirty = true) => {\n        const size = this._disabledBy.size\n        this._disabledBy.add(key)\n        if (setDirty && this.setDirty && size !== this._disabledBy.size) this.setDirty()\n    }\n    enable = (key: any, setDirty = true) => {\n        const size = this._disabledBy.size\n        this._disabledBy.delete(key)\n        if (setDirty && this.setDirty && size !== this._disabledBy.size) this.setDirty()\n    }\n    isDisabled = () => {\n        return this._disabledBy.size > 0 || !this.enabled\n    }\n\n    setDirty?(...args: any[]): any\n\n    // todo: move to ThreeViewer\n    // storeState(prefix?: string, storage?: Storage, data?: any): void {\n    //     storage = storage || (window ? window.localStorage : undefined)\n    //     if (!storage) {\n    //         console.warn('Unable to store state')\n    //         return\n    //     }\n    //     if (data === undefined) data = this.exportState()\n    //     if (data) storage.setItem(this._storeKey(prefix), JSON.stringify(data))\n    // }\n    //\n    // async loadState(prefix?: string, storage?: Storage): Promise<void> {\n    //     storage = storage || (window ? window.localStorage : undefined)\n    //     if (!storage) {\n    //         console.warn('Unable to load state')\n    //         return\n    //     }\n    //     const data = storage.getItem(this._storeKey(prefix))\n    //     if (data) await this.importState(JSON.parse(data))\n    // }\n\n    get dirty(): boolean {\n        return this.enabled && this._dirty\n    }\n\n    set dirty(value: boolean) {\n        this._dirty = value\n    }\n\n    /**\n     * Template\n\n     toJSON(meta?: any): any {\n        const data = super.toJSON(meta)\n        if (!data.type) return data\n        // add here\n        return data\n    }\n\n     fromJSON(data: any, meta?: any): this | null {\n        if (!super.fromJSON(data, meta)) return null\n        // add here\n        return this\n    }\n     */\n\n}\n\n/**\n * Base Class for Sync Viewer Plugins\n * @category Viewer\n */\nexport abstract class AViewerPluginSync<TE extends AViewerPluginEventMap = AViewerPluginEventMap, TViewer extends ThreeViewer = ThreeViewer> extends AViewerPlugin<TE, TViewer, true> {\n    declare ['constructor']: (typeof AViewerPluginSync) & (typeof AViewerPlugin)\n    isViewerPluginSync = true as const\n\n    onAdded(viewer: TViewer): void {\n        this._viewer = viewer\n        this._viewer.addEventListener('*', this._onViewerEvent)\n    }\n    onRemove(viewer: TViewer): void {\n        if (this._viewer !== viewer) viewer.console.error('Wrong viewer')\n        this._viewer?.removeEventListener('*', this._onViewerEvent)\n        this._viewer = undefined\n    }\n\n}\n\n/**\n * Base Class for Async Viewer Plugins\n * @category Viewer\n */\nexport abstract class AViewerPluginAsync<TE extends AViewerPluginEventMap = AViewerPluginEventMap, TViewer extends ThreeViewer = ThreeViewer> extends AViewerPlugin<TE, TViewer, false> implements IViewerPluginAsync<TViewer> {\n    declare ['constructor']: (typeof AViewerPluginAsync) & (typeof AViewerPlugin)\n    isViewerPluginSync = false as const\n\n    async onAdded(viewer: TViewer): Promise<void> {\n        this._viewer = viewer\n        this._viewer.addEventListener('*', this._onViewerEvent)\n    }\n    async onRemove(viewer: TViewer): Promise<void> {\n        if (this._viewer !== viewer) viewer.console.error('Wrong viewer')\n        this._viewer?.removeEventListener('*', this._onViewerEvent)\n        this._viewer = undefined\n    }\n}\n","import {IObject3D} from '../IObject'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {ICamera} from '../ICamera'\nimport {Vector3} from 'three'\nimport {ThreeViewer} from '../../viewer'\nimport {generateUUID} from '../../three'\nimport {getOrCall} from 'ts-browser-helpers'\nimport {iCameraCommons} from './iCameraCommons'\nimport {iObjectCommons} from './iObjectCommons'\n\ndeclare module '../IObject' {\n    interface IObject3D {\n        __objExtUiConfigs?: Record<string, UiObjectConfig['children']|undefined>\n    }\n}\n\nexport function makeICameraCommonUiConfig(this: ICamera): UiObjectConfig[] {\n    return [\n        {\n            type: 'checkbox',\n            label: 'Auto LookAt Target',\n            getValue: ()=>this.userData.autoLookAtTarget ?? false,\n            setValue: (v: boolean)=>{\n                this.userData.autoLookAtTarget = v\n                this.uiConfig?.uiRefresh?.(true, 'postFrame')\n            },\n        },\n        {\n            type: 'input',\n            label: 'Auto Near Far',\n            property: [this, 'autoNearFar'],\n        },\n        {\n            type: 'number',\n            label: 'Min Near',\n            hidden: ()=>!this.autoNearFar,\n            // property: [this, 'minNearPlane'],\n            getValue: ()=>{\n                return this.userData.minNearPlane ?? iCameraCommons.defaultMinNear\n            },\n            setValue: (v: number)=>{\n                if (v === iCameraCommons.defaultMinNear) delete this.userData.minNearPlane\n                else this.userData.minNearPlane = v\n            },\n        },\n        {\n            type: 'number',\n            label: 'Max Far',\n            hidden: ()=>!this.autoNearFar,\n            // property: [this, 'maxFarPlane'],\n            getValue: ()=>{\n                return this.userData.maxFarPlane ?? iCameraCommons.defaultMaxFar\n            },\n            setValue: (v: number)=>{\n                if (v === iCameraCommons.defaultMaxFar) delete this.userData.maxFarPlane\n                else this.userData.maxFarPlane = v\n            },\n        },\n        {\n            type: 'number',\n            label: 'Near',\n            readOnly: ()=>this.autoNearFar,\n            property: [this, 'near'],\n        },\n        {\n            type: 'number',\n            label: 'Far',\n            readOnly: ()=>this.autoNearFar,\n            property: [this, 'far'],\n        },\n        ()=>({ // because controlsCtors can change\n            type: 'dropdown',\n            label: 'Controls Mode',\n            property: [this, 'controlsMode'],\n            children: ['', 'orbit', ...this.controlsCtors.keys()].map(v=>({label: v === '' ? 'none' : v, value:v})),\n            onChange: () => this.refreshCameraControls(),\n        }),\n        {\n            type: 'button',\n            label: 'Set View',\n            tags: ['context-menu'],\n            value: ()=>{\n                this.setViewToMain({ui: true})\n                this.uiConfig?.uiRefresh?.(true, 'postFrame') // config is parent config\n            },\n        },\n        {\n            type: 'button',\n            label: 'Activate main',\n            hidden: ()=>this?.isMainCamera,\n            tags: ['context-menu'],\n            value: ()=>{\n                this.activateMain({ui: true})\n                this.uiConfig?.uiRefresh?.(true, 'postFrame')\n            },\n        },\n        {\n            type: 'button',\n            label: 'Deactivate main',\n            tags: ['context-menu'],\n            hidden: ()=>!this?.isMainCamera,\n            value: ()=>{\n                this.deactivateMain({ui: true})\n                this.uiConfig?.uiRefresh?.(true, 'postFrame')\n            },\n        },\n    ]\n}\n\nexport function makeIObject3DUiConfig(this: IObject3D, isMesh?:boolean): UiObjectConfig {\n    if (!this) return {}\n    if (this.uiConfig) return this.uiConfig\n    const config: UiObjectConfig = {\n        type: 'folder',\n        label: ()=>this.name || 'unnamed',\n        expanded: true,\n        onChange: (ev)=>{\n            // todo this calls setDirty when some material prop changes as well, that needs to be ignored.\n            // console.log('onchange', this)\n            if (!ev.config || ev.config.onChange) return // todo check onChange in configPath\n            let key = Array.isArray(ev.config.property) ? ev.config.property[1] : ev.config.property\n            key = typeof key === 'string' ? key : undefined\n            this.setDirty && this.setDirty({uiChangeEvent: ev, refreshScene: false, refreshUi: !!ev.last, change: key})\n        },\n        children: [\n            {\n                type: 'checkbox',\n                label: 'Visible',\n                property: [this, 'visible'],\n                onChange: (e)=>{\n                    this.setDirty?.({uiChangeEvent: e, refreshScene: true, refreshUi: true, change: 'visible'})\n                },\n            },\n            {\n                type: 'input',\n                property: [this, 'uuid'],\n                disabled: true,\n                tags: ['advanced'],\n            },\n            {\n                type: 'input',\n                label: 'Name',\n                property: [this, 'name'],\n                onChange: (e)=>{\n                    if (e.last) this.setDirty?.({uiChangeEvent: e, refreshScene: true, frameFade: false, refreshUi: true, change: 'name'})\n                },\n            },\n            {\n                type: 'checkbox',\n                label: 'Casts Shadow',\n                hidden: () => !this.isMesh,\n                property: [this, 'castShadow'],\n                onChange: (e)=>{\n                    this.setDirty?.({uiChangeEvent: e, refreshScene: true, refreshUi: true, change: 'castShadow'})\n                },\n            },\n            {\n                type: 'checkbox',\n                label: 'Receive Shadow',\n                hidden: () => !this.isMesh,\n                property: [this, 'receiveShadow'],\n                onChange: (e)=>{\n                    this.setDirty?.({uiChangeEvent: e, refreshScene: true, refreshUi: true, change: 'receiveShadow'})\n                },\n            },\n            {\n                type: 'checkbox',\n                label: 'Frustum culled',\n                property: [this, 'frustumCulled'],\n            },\n            {\n                type: 'vec3',\n                label: 'Position',\n                property: [this, 'position'],\n            },\n            {\n                type: 'vec3',\n                label: 'Rotation',\n                property: [this, 'rotation'],\n            },\n            {\n                type: 'vec3',\n                label: 'Scale',\n                property: [this, 'scale'],\n            },\n            {\n                type: 'input',\n                label: 'Render Order',\n                property: [this, 'renderOrder'],\n            },\n            {\n                type: 'button',\n                label: 'Scale to Radius',\n                tags: ['context-menu', 'interaction'],\n                hidden: ()=>!this.autoScale,\n                // prompt: ['Auto Scale Radius: Object will be scaled to the given radius', this.userData.autoScaleRadius || '2', true],\n                value: async()=>{\n                    const def = (this.userData.autoScaleRadius || 2) + ''\n                    const res = await ThreeViewer.Dialog.prompt('Auto Scale Radius: Object will be scaled to the given radius', def)\n                    if (res === null) return\n                    const rad = parseFloat(res || def)\n                    if (Math.abs(rad) > 0) {\n                        return {\n                            action: ()=>this.autoScale?.(rad),\n                            undo: ()=>this.autoScale?.(rad, undefined, undefined, true),\n                        }\n                    }\n                },\n            },\n            {\n                type: 'button',\n                label: 'Auto Center',\n                tags: ['context-menu', 'interaction'],\n                hidden: ()=>!this.autoCenter,\n                value: ()=>{\n                    // const res = await ThreeViewer.Dialog.confirm('Auto Center: Object will be centered, are you sure you want to proceed?')\n                    // if (!res) return\n                    return {\n                        action: ()=>this.autoCenter?.(true),\n                        undo: ()=>this.autoCenter?.(true, true),\n                    }\n                },\n            },\n            {\n                type: 'button',\n                label: 'Pivot to Node Center',\n                tags: ['context-menu', 'interaction'],\n                value: async()=>{\n                    const res = await ThreeViewer.Dialog.confirm('Pivot to Center: Adjust the pivot to bounding box center. The object will rotate around the new pivot, are you sure you want to proceed?')\n                    if (!res) return\n                    return this.pivotToBoundsCenter?.(true) // return value is the undo function\n                },\n            },\n            ...objectActionsUiConfig.call(this),\n            {\n                type: 'folder',\n                label: 'Rotate model',\n                children: [\n                    'X +', 'X -', 'Y +', 'Y -', 'Z +', 'Z -',\n                ].map((l)=>{\n                    return {\n                        type: 'button',\n                        label: 'Rotate ' + l + '90',\n                        value: ()=>{\n                            const axis = new Vector3(l.includes('X') ? 1 : 0, l.includes('Y') ? 1 : 0, l.includes('Z') ? 1 : 0)\n                            const angle = Math.PI / 2 * (l.includes('-') ? -1 : 1)\n                            return {\n                                action: ()=>{\n                                    this.rotateOnAxis(axis, angle)\n                                    this.setDirty?.({refreshScene: true, refreshUi: false})\n                                },\n                                undo: ()=>{\n                                    this.rotateOnAxis(axis, -angle)\n                                    this.setDirty?.({refreshScene: true, refreshUi: false})\n                                },\n                            }\n                        },\n                    }\n                }),\n            },\n            this.userData.license !== undefined ? {\n                type: 'input',\n                label: 'License/Credits',\n                property: [this.userData, 'license'],\n            } : {},\n        ],\n    }\n    if ((this.isLine || this.isMesh) && isMesh !== false) {\n        // todo: move to make mesh ui function?\n        const ui = [\n            // morph targets\n            ()=>{\n                const dict = Object.entries(this.morphTargetDictionary || {})\n                return dict.length ? {\n                    label: 'Morph Targets',\n                    type: 'folder',\n                    children: dict.map(([name, i])=>({\n                        type: 'slider',\n                        label: name,\n                        bounds: [0, 1],\n                        stepSize: 0.0001,\n                        property: [this.morphTargetInfluences, i as any],\n                        onChange: (e: any)=>{\n                            this.setDirty?.({refreshScene: e.last, frameFade: false, refreshUi: false})\n                        },\n                    })),\n                } : undefined\n            },\n            {\n                type: 'divider',\n            },\n        ]\n        ;(config.children as UiObjectConfig[]).push(...ui)\n    }\n    // todo: if we are replacing all the cameras in the scene, is this even required?\n    if (this.isCamera) {\n        const ui: UiObjectConfig[] = makeICameraCommonUiConfig.call(this as ICamera)\n        ;(config.children as UiObjectConfig[]).push(...ui)\n    }\n    (config.children as UiObjectConfig[]).push(objectExtensionsUiConfig.call(this))\n\n    // todo: lights?\n\n    this.uiConfig = config\n    return config\n\n}\n\nexport function objectExtensionsUiConfig(this: IObject3D) {\n    return (parent: any) => this.objectExtensions?.flatMap(v => {\n        v.uuid = v.uuid || generateUUID()\n        // caching the uiconfig here. todo: reset the uiconfig when cache key changes? or we could just return a dynamic/function uiconfig from getUiConfig\n        this.__objExtUiConfigs = this.__objExtUiConfigs || {}\n        if (!this.__objExtUiConfigs[v.uuid]) this.__objExtUiConfigs[v.uuid] = v.getUiConfig ? v.getUiConfig(this, this.uiConfig?.uiRefresh) : undefined\n        return this.__objExtUiConfigs[v.uuid]?.flatMap(m=>getOrCall(m, parent)) // todo use uiconfigmethods resolve children\n    }).filter(v => v)\n}\n\nexport function incrementObjectCloneName(obj: IObject3D, clone: IObject3D, name?: string) {\n    name = name ?? obj.name\n    const match = name.match(/\\(copy( (\\d+))?\\)$/)\n    if (match) {\n        let copyNum = match[2] ? parseInt(match[2]) + 1 : 2\n        let newName = name.replace(/\\(copy( \\d+)?\\)$/, `(copy ${copyNum})`)\n        const parent = obj.parent\n        if (parent && parent !== clone.parent) {\n            const names = new Set(parent.children.filter(c=>c !== obj).map(c=>c.name))\n            for (let i = 0; i < 1000; i++) {\n                if (!names.has(newName)) break\n                copyNum++\n                newName = name.replace(/\\(copy( \\d+)?\\)$/, `(copy ${copyNum})`)\n            }\n        }\n        clone.name = newName\n    } else {\n        clone.name = name + ' (copy)'\n    }\n}\n\nexport function objectActionsUiConfig(this: IObject3D): UiObjectConfig[] {\n    return [{\n        type: 'button',\n        label: 'Duplicate Object',\n        tags: ['context-menu'],\n        value: async(e?: any)=>{\n            return iObjectCommons.duplicateObject(this, e)\n        },\n    },\n    {\n        type: 'button',\n        label: 'Delete Object',\n        tags: ['context-menu'],\n        value: async(e?: any)=>{\n            return iObjectCommons.deleteObject(this, e)\n        },\n    }]\n}\n","import {UiObjectConfig} from 'uiconfig.js'\nimport {IGeometry, IGeometrySetDirtyOptions} from '../IGeometry'\nimport {autoGPUInstanceMeshes, toIndexedGeometry} from '../../three/utils'\nimport {BufferGeometry, Vector3} from 'three'\nimport {ThreeViewer} from '../../viewer'\nimport {IObject3D} from '../IObject'\n\nexport const iGeometryCommons = {\n    setDirty: function(this: IGeometry, options?: IGeometrySetDirtyOptions): void {\n        this.dispatchEvent({bubbleToObject: true, ...options, type: 'geometryUpdate', geometry: this}) // this sets sceneUpdate in root scene\n        this.refreshUi()\n    },\n    refreshUi: function(this: IGeometry) {\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    },\n    /** @ignore */\n    dispose: (superDispose: BufferGeometry['dispose']): IGeometry['dispose'] =>\n        function(this: IGeometry, force = true): void {\n            if (!force && this.userData.disposeOnIdle === false) return\n            superDispose.call(this)\n        },\n    /** @ignore */\n    clone: (superClone: BufferGeometry['clone']): IGeometry['clone'] =>\n        function(this: IGeometry): IGeometry {\n            return iGeometryCommons.upgradeGeometry.call(superClone.call(this))\n        },\n    upgradeGeometry: upgradeGeometry,\n    /** @ignore */\n    center: (superCenter: BufferGeometry['center']): IGeometry['center'] =>\n        function(this: IGeometry, offset?: Vector3, keepWorldPosition = false, setDirty = true): IGeometry {\n            if (keepWorldPosition) {\n                offset = offset ? offset.clone() : new Vector3()\n                superCenter.call(this, offset)\n                offset.negate()\n                const meshes = this.appliedMeshes\n                for (const m of meshes) {\n                    m.updateMatrix()\n                    m.position.copy(offset).applyMatrix4(m.matrix)\n                    if (setDirty && m.setDirty) m.setDirty()\n                }\n            } else {\n                superCenter.call(this, offset)\n            }\n            if (setDirty) this.setDirty()\n            return this\n        },\n    center2: function(this: IGeometry, offset?: Vector3, keepWorldPosition = false, setDirty = true): ()=>void {\n        const offset1 = offset ? offset : new Vector3()\n        if (keepWorldPosition) {\n            this.center(offset1, false, false)\n            const meshes = this.appliedMeshes\n            const positions = new WeakMap<IObject3D, Vector3>()\n            for (const m of meshes) {\n                m.updateMatrix()\n                positions.set(m, m.position.clone())\n                m.position.set(-offset1.x, -offset1.y, -offset1.z).applyMatrix4(m.matrix)\n                if (setDirty) m.setDirty && m.setDirty()\n            }\n            if (setDirty) this.setDirty && this.setDirty()\n            return ()=>{\n                // undo\n                for (const m of meshes) {\n                    const pos = positions.get(m)\n                    if (!pos) {\n                        console.warn('GeometryCommons: No position found for mesh', m)\n                        continue\n                    }\n                    m.position.copy(pos)\n                    if (setDirty && m.setDirty) m.setDirty()\n                }\n                if (setDirty) this.setDirty && this.setDirty()\n            }\n        } else {\n            this.center(offset1, false, false)\n            if (setDirty) this.setDirty && this.setDirty()\n            return ()=>{\n                // undo\n                this.translate(-offset1.x, -offset1.y, -offset1.z)\n                if (setDirty) this.setDirty && this.setDirty()\n            }\n        }\n    },\n    makeUiConfig: function(this: IGeometry): UiObjectConfig {\n        if (this.uiConfig) return this.uiConfig\n        return {\n            label: 'Geometry',\n            uuid: 'geom',\n            type: 'folder',\n            children: [\n                {\n                    type: 'input',\n                    property: [this, 'name'],\n                },\n                {\n                    type: 'input',\n                    property: [this, 'uuid'],\n                    disabled: true,\n                    tags: ['advanced'],\n                },\n                ()=>this.groups.length ? {\n                    type: 'folder',\n                    label: 'Groups',\n                    uuid: 'groups',\n                    tags: ['advanced'],\n                    children: this.groups.map((g, i) => ({\n                        type: 'folder',\n                        label: `Group ${i}`,\n                        uuid: 'group-' + i,\n                        tags: ['advanced'],\n                        children: [\n                            {\n                                type: 'input',\n                                label: 'Start',\n                                uuid: 'start',\n                                getValue: () => g.start,\n                                setValue: (v: number) => {\n                                    g.start = v\n                                    this.setDirty && this.setDirty()\n                                },\n                            },\n                            {\n                                type: 'input',\n                                label: 'Count',\n                                uuid: 'count',\n                                getValue: () => g.count,\n                                setValue: (v: number) => {\n                                    g.count = v\n                                    this.setDirty && this.setDirty()\n                                },\n                            },\n                            {\n                                type: 'input',\n                                label: 'Material Index',\n                                uuid: 'mi',\n                                getValue: () => g.materialIndex,\n                                setValue: (v: number) => {\n                                    g.materialIndex = v\n                                    this.setDirty && this.setDirty()\n                                },\n                            },\n                        ],\n                    })),\n                } : null,\n                {\n                    type: 'divider',\n                },\n                {\n                    type: 'button',\n                    label: 'Center Geometry',\n                    tags: ['context-menu'],\n                    value: async() => {\n                        if (!await ThreeViewer.Dialog.confirm('This will move the objects based on the geometry center, do you want to continue?')) return\n                        return this.center2()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Center Geometry (keep position)',\n                    tags: ['context-menu'],\n                    value: async() => {\n                        if (!await ThreeViewer.Dialog.confirm('This will move the geometry center keeping the object position, do you want to continue?')) return\n                        return this.center2(undefined, true)\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Compute vertex normals',\n                    tags: ['context-menu'],\n                    value: async() => {\n                        if (this.hasAttribute('normal') && !await ThreeViewer.Dialog.confirm('Normals already exist, replace with computed normals?\\nThis action cannot be undone.')) return\n                        this.computeVertexNormals()\n                        this.setDirty && this.setDirty()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Compute vertex tangents',\n                    tags: ['context-menu'],\n                    value: async() => {\n                        if (this.hasAttribute('tangent') && !await ThreeViewer.Dialog.confirm('Tangents already exist, replace with computed tangents?\\nThis action cannot be undone.')) return\n                        this.computeTangents()\n                        this.setDirty && this.setDirty()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Normalize normals',\n                    tags: ['context-menu'],\n                    value: () => {\n                        this.normalizeNormals()\n                        this.setDirty && this.setDirty()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Convert to indexed',\n                    hidden: () => !!this.index,\n                    tags: ['context-menu'],\n                    value: async() => {\n                        if (this.attributes.index) return\n                        const tolerance = parseFloat(await ThreeViewer.Dialog.prompt('Convert to Indexed: Tolerance?', '-1') ?? '-1')\n                        toIndexedGeometry(this, tolerance)\n                        this.setDirty && this.setDirty()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Convert to non-indexed',\n                    hidden: () => !this.index,\n                    tags: ['context-menu'],\n                    value: () => {\n                        if (!this.attributes.index) return\n                        this.toNonIndexed()\n                        this.setDirty && this.setDirty()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Create uv1 from uv',\n                    tags: ['context-menu'],\n                    value: async() => {\n                        if (this.hasAttribute('uv1')) {\n                            if (!await ThreeViewer.Dialog.confirm('uv1 already exists, replace with uv data?\\nThis action cannot be undone.')) return\n                        }\n                        this.setAttribute('uv1', this.getAttribute('uv'))\n                        this.setDirty && this.setDirty()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Remove vertex color attribute',\n                    hidden: () => !this.hasAttribute('color'),\n                    tags: ['context-menu'],\n                    value: async() => {\n                        if (!this.hasAttribute('color')) {\n                            await ThreeViewer.Dialog.alert('No color attribute found')\n                            return\n                        }\n                        if (!await ThreeViewer.Dialog.confirm('Remove color attribute?')) return\n                        this.deleteAttribute('color')\n                        this.setDirty && this.setDirty()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Auto GPU Instances',\n                    hidden: ()=> !this.appliedMeshes || this.appliedMeshes.size < 2,\n                    tags: ['context-menu'],\n                    value: async()=>{\n                        if (!await ThreeViewer.Dialog.confirm('This will automatically create Instanced Mesh from geometry instances. This action is irreversible, do you want to continue?')) return\n                        autoGPUInstanceMeshes(this)\n                    },\n                },\n                {\n                    type: 'input',\n                    label: 'Mesh count',\n                    getValue: () => this.appliedMeshes?.size ?? 0,\n                    disabled: true,\n                },\n            ],\n        }\n    },\n}\n\nfunction upgradeGeometry(this: IGeometry) {\n    if (this.assetType === 'geometry') return this// already upgraded\n    if (!this.isBufferGeometry) {\n        console.error('Geometry is not a BufferGeometry', this)\n        return this\n    }\n    this.assetType = 'geometry'\n\n    this.dispose = iGeometryCommons.dispose(this.dispose)\n    this.center = iGeometryCommons.center(this.center)\n    this.clone = iGeometryCommons.clone(this.clone)\n    if (!this.center2) this.center2 = iGeometryCommons.center2\n\n    if (!this.setDirty) this.setDirty = iGeometryCommons.setDirty\n    if (!this.refreshUi) this.refreshUi = iGeometryCommons.refreshUi\n\n    if (!this.appliedMeshes) this.appliedMeshes = new Set()\n    if (!this.userData) this.userData = {}\n    this.uiConfig = iGeometryCommons.makeUiConfig.call(this)\n\n    // todo: dispose uiconfig on geometry dispose\n\n    // todo: add serialization?\n\n    return this\n}\n","import {IMaterial, IMaterialUserData, IWebGLRenderer} from '../core'\nimport {getOrCall, objectMap} from 'ts-browser-helpers'\nimport {shaderReplaceString, shaderUtils} from '../utils'\nimport {Object3D, ShaderChunk, WebGLRenderer} from 'three'\nimport {MaterialExtension, MaterialExtensionShader} from './MaterialExtension'\nimport {generateUUID} from '../three/utils'\n\nexport class MaterialExtender {\n\n    static {\n        Object.assign(ShaderChunk, shaderUtils) // for #include in the shaders\n    }\n\n    static VoidMain = 'void main()'\n\n    static ApplyMaterialExtensions(material: IMaterial, shader: MaterialExtensionShader, materialExtensions: MaterialExtension[], renderer: WebGLRenderer) {\n        for (const materialExtension of materialExtensions) {\n            this.ApplyMaterialExtension(material, shader, materialExtension, renderer)\n        }\n    }\n\n    static ApplyMaterialExtension(material: IMaterial, shader: MaterialExtensionShader, materialExtension: MaterialExtension, renderer: WebGLRenderer) {\n        // Add parsFragmentSnippet just before void main in fragment shader\n        let a = getOrCall(materialExtension.parsFragmentSnippet, renderer, material) ?? ''\n        if (a.length) {\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader, this.VoidMain, '\\n' + a + '\\n', {prepend: true})\n        }\n        // Add parsVertexSnippet just before void main in vertex shader\n        a = getOrCall(materialExtension.parsVertexSnippet, renderer, material) ?? ''\n        if (a.length) {\n            shader.vertexShader = shaderReplaceString(shader.vertexShader, this.VoidMain, '\\n' + a + '\\n', {prepend: true})\n        }\n        // Add extra uniforms\n        if (materialExtension.extraUniforms) {\n            shader.uniforms = Object.assign(shader.uniforms, objectMap(materialExtension.extraUniforms, (v)=>getOrCall(v, shader) || {value: null}))\n        }\n        // Add extra defines and set needsUpdate to true if needed\n        if (materialExtension.extraDefines)\n            updateMaterialDefines(materialExtension.extraDefines, material)\n\n        // Call shaderExtender if defined\n        materialExtension.shaderExtender && materialExtension.shaderExtender(shader as any, material, renderer)\n        // Save last shader so that it can be used to check if shader has changed in extensions\n        material.lastShader = shader\n    }\n\n    static CacheKeyForExtensions(material: IMaterial, materialExtensions: MaterialExtension[]): string {\n        let r = ''\n        for (const materialExtension of materialExtensions) {\n            r += this.CacheKeyForExtension(material, materialExtension)\n        }\n        return r\n    }\n\n    static CacheKeyForExtension(material: IMaterial, materialExtension: MaterialExtension): string {\n        let r = ''\n        if (materialExtension.computeCacheKey) r += getOrCall(materialExtension.computeCacheKey, material)\n        else r += materialExtension.uuid\n        if (materialExtension.extraDefines) r += Object.values(materialExtension.extraDefines).map(v=>getOrCall(v) ?? '').join('')\n        return r\n    }\n\n    static RegisterExtensions(material: IMaterial, customMaterialExtensions?: MaterialExtension[]): MaterialExtension[] {\n        const exts = []\n        if (!Array.isArray(material.materialExtensions)) material.materialExtensions = []\n        if (customMaterialExtensions)\n            for (const ext of customMaterialExtensions) {\n                if (material.materialExtensions.includes(ext)) continue\n                if (ext.isCompatible !== undefined && (!ext.isCompatible || !ext.isCompatible(material))) continue\n                exts.push(ext)\n                if (!ext.uuid) ext.uuid = generateUUID()\n                if (!ext.__setDirty) ext.__setDirty = ()=>{\n                    if (!ext.updateVersion) ext.updateVersion = 0\n                    ext.updateVersion++\n                }\n                if (!ext.setDirty) ext.setDirty = ext.__setDirty\n            }\n\n        if (!exts.length) return []\n\n        material.materialExtensions = [...material.materialExtensions || [], ...exts]\n            .sort((a, b)=>(b.priority || 0) - (a.priority || 0))\n\n        if (!(material as any).__extListen) {\n            (material as any).__extListen = true\n\n            material.addEventListener('beforeRender', materialBeforeRender)\n            material.addEventListener('afterRender', materialAfterRender)\n            material.addEventListener('addToMesh', materialAddToMesh)\n            material.addEventListener('removeFromMesh', materialRemovedFromMesh)\n            material.addEventListener('materialUpdate', materialUpdate)\n        }\n\n        for (const ext of exts) {\n            ext.onRegister && ext.onRegister(material)\n        }\n        material.needsUpdate = true\n        return exts\n    }\n\n    static UnregisterExtensions(material: IMaterial, customMaterialExtensions?: MaterialExtension[]) {\n        if (customMaterialExtensions) {\n            material.materialExtensions = material.materialExtensions?.filter((v)=>!customMaterialExtensions.includes(v)) || []\n            for (const ext of customMaterialExtensions) {\n                ext.onUnregister && ext.onUnregister(material)\n            }\n        }\n\n        if (!material.materialExtensions?.length && (material as any).__extListen) {\n            material.removeEventListener('beforeRender', materialBeforeRender)\n            material.removeEventListener('afterRender', materialAfterRender)\n            material.removeEventListener('addToMesh', materialAddToMesh)\n            material.removeEventListener('removeFromMesh', materialRemovedFromMesh)\n            material.removeEventListener('materialUpdate', materialUpdate)\n\n            delete (material as any).__extListen\n        }\n    }\n}\n\nexport function updateMaterialDefines(defines: MaterialExtension['extraDefines'], material: IMaterial) {\n    if (!defines || !material) return\n    if (material.defines === undefined || material.defines === null) { // required for some three.js materials\n        material.defines = {}\n    }\n    let flag = false\n    const entries = Object.entries(defines)\n    for (const [key, valF] of entries) {\n        const val = getOrCall(valF)\n        if (val === undefined) {\n            if (material.defines[key] !== undefined) {\n                delete material.defines[key]\n                flag = true\n            }\n        } else if (material.defines[key] !== val) {\n            material.defines[key] = typeof val === 'boolean' ? +val : val\n            flag = true\n        }\n    }\n    if (flag) material.needsUpdate = true\n}\n\nfunction materialBeforeRender({target, object, renderer}:{object?: Object3D, renderer?: IWebGLRenderer, target: IMaterial}) {\n    const material = target\n    if (!material || !object || !renderer) throw new Error('Invalid material, object or renderer')\n    if (!material.materialExtensions) return\n    for (const value of material.materialExtensions) {\n        value.onObjectRender && value.onObjectRender(object, material, renderer)\n\n        if ((material as any).lastShader) {\n            const updater = getOrCall(value.updaters) || []\n            for (const v2 of updater) v2 && v2.updateShaderProperties((material as any).lastShader)\n        }\n        const udVersion: keyof IMaterialUserData = '_' + value.uuid + '_version' as any\n        if (value.updateVersion !== material.userData[udVersion]) {\n            material.userData[udVersion] = value.updateVersion\n            material.needsUpdate = true\n        }\n    }\n}\n\nfunction materialAfterRender({target, object, renderer}:{object?: Object3D, renderer?: IWebGLRenderer, target: IMaterial}) {\n    const material = target\n    if (!material || !object || !renderer) throw new Error('Invalid material, object or renderer')\n    if (!material.materialExtensions) return\n    for (const value of material.materialExtensions) {\n        value.onAfterRender && value.onAfterRender(object, material, renderer)\n    }\n}\n\nfunction materialAddToMesh({target, object}:{object?: Object3D, target: IMaterial}) {\n    const material = target\n    if (!material || !object) throw new Error('Invalid material or object')\n    if (!material.materialExtensions) return\n    for (const value of material.materialExtensions) {\n        value.onAddToMesh && value.onAddToMesh(object, material)\n    }\n}\n\nfunction materialRemovedFromMesh({target, object}:{object?: Object3D, target: IMaterial}) {\n    const material = target\n    if (!material || !object) throw new Error('Invalid material or object')\n    if (!material.materialExtensions) return\n    for (const value of material.materialExtensions) {\n        value.onRemoveFromMesh && value.onRemoveFromMesh(object, material)\n    }\n}\n\nfunction materialUpdate({target}:{target: IMaterial}) {\n    const material = target\n    if (!material) throw new Error('Invalid material')\n    if (!material.materialExtensions) return\n    for (const value of material.materialExtensions) {\n        value.onMaterialUpdate && value.onMaterialUpdate(material)\n    }\n}\n\n\n/**\n * Creates a {@link MaterialExtension} with getUiConfig that also caches the config for the material based on uuid\n * @param getUiConfig - function that returns a ui config. make sure its static.\n * @param uuid uuid to use.\n */\nexport function uiConfigMaterialExtension(getUiConfig: Required<MaterialExtension>['getUiConfig'], uuid?: string) {\n    const uuid1 = uuid || generateUUID()\n    return {\n        uuid: uuid1,\n\n        // todo clean code.\n        getUiConfig: material => {\n            if (!(material as any).__uiConfigs) (material as any).__uiConfigs = {} as any // todo remove reference sometime after plugin removed\n            if ((material as any).__uiConfigs[uuid1]) return (material as any).__uiConfigs[uuid1]\n            const config = getUiConfig(material);\n            (material as any).__uiConfigs[uuid1] = config\n            return config\n        },\n\n        isCompatible: () => true,\n    } as MaterialExtension\n}\n","import {IMaterial} from '../core'\nimport {\n    ClampToEdgeWrapping,\n    ColorSpace,\n    LinearFilter,\n    LinearMipmapLinearFilter,\n    LinearMipmapNearestFilter,\n    LinearSRGBColorSpace,\n    MagnificationTextureFilter,\n    MinificationTextureFilter,\n    MirroredRepeatWrapping,\n    NearestFilter,\n    NearestMipmapLinearFilter,\n    NearestMipmapNearestFilter,\n    RepeatWrapping,\n    SRGBColorSpace,\n    Wrapping,\n} from 'three'\nimport {UiObjectConfig} from 'uiconfig.js'\n\nexport function makeSamplerUi<T extends IMaterial>(mat: T, map: keyof T, label?: string, hidden?: ()=>boolean, setDirty?: ()=>any) {\n    setDirty = setDirty ?? (()=>mat.setDirty && mat.setDirty())\n    // const im = map === 'map'\n    return {\n        type: 'folder',\n        label: label ?? <string>map + ' Sampler',\n        hidden: ()=>!mat[map] || hidden && hidden(),\n        onChange: setDirty,\n        children: [\n            ()=>({\n                type: 'vec2',\n                label: 'Repeat',\n                stepSize: 0.001,\n                property: [mat[map], 'repeat'],\n            }),\n            ()=>({\n                type: 'vec2',\n                label: 'Offset',\n                stepSize: 0.001,\n                property: [mat[map], 'offset'],\n            }),\n            ()=>({\n                type: 'vec2',\n                label: 'Center',\n                stepSize: 0.001,\n                property: [mat[map], 'center'],\n            }),\n            ()=>({\n                type: 'input',\n                label: 'Rotation',\n                stepSize: 0.001,\n                bounds: [-Math.PI, Math.PI],\n                property: [mat[map], 'rotation'],\n            }),\n            ()=>({\n                type: 'dropdown',\n                label: 'Color space',\n                property: [mat[map], 'colorSpace'],\n                children: ([\n                    ['Linear', LinearSRGBColorSpace],\n                    ['sRGB', SRGBColorSpace],\n                    // ['RGBM', RGBM16ColorSpace],\n                ] as [string, ColorSpace][]).map(value => ({\n                    label: value[0],\n                    value: value[1],\n                })),\n                onChange: [()=>{\n                    const tex = mat[map] as any\n                    if (!tex) return\n                    tex.needsUpdate = true\n                    // todo: set the texture on other materials with the same texture\n                    // mat[map] = tex.clone() // it doesn't work with just setting needsUpdate = true\n                    // ;(mat[map] as any).uuid = tex.uuid\n                    // tex!.dispose()\n                }],\n            }),\n            ()=>({\n                type: 'dropdown',\n                label: 'UV Channel',\n                property: [mat[map], 'channel'],\n                children: [0, 1, 2, 3].map(value => ({label: value.toString(), value})),\n                onChange: ()=>{\n                    const tex = mat[map] as any\n                    if (tex) tex.needsUpdate = true\n                },\n            }),\n            ()=>({\n                type: 'checkbox',\n                label: 'Flip Y',\n                getValue: ()=>(mat[map] as any)?.flipY ?? false,\n                setValue: (value: boolean)=>{\n                    const tex = mat[map] as any\n                    if (!tex)\n                        return\n                    if (tex.flipY === value) return\n\n                    // console.log(tex, value, mat)\n\n                    // https://github.com/mrdoob/three.js/issues/16144\n                    // flipY not used in ImageBitmap during upload texture, it needs to be created again.\n                    // todo: check premultiplied alpha also.\n                    if (tex.image && ImageBitmap && tex.image instanceof ImageBitmap) {\n                        const t1 = tex\n                        const oldBitmap = tex.source.data as ImageBitmap\n\n                        createImageBitmap(oldBitmap, {\n                            imageOrientation: 'flipY',\n                        }).then((imageBitmap)=>{\n\n                            if (oldBitmap.close) oldBitmap.close()\n                            t1.flipY = value\n                            t1.source.data = imageBitmap\n                            t1.source.needsUpdate = true\n                            t1.needsUpdate = true\n                            setDirty()\n                        })\n                    } else {\n                        tex.flipY = value\n                        tex.needsUpdate = true\n                        setDirty()\n                    }\n\n                },\n            }),\n            ()=>({\n                type: 'dropdown',\n                label: 'Wrap S',\n                property: [mat[map], 'wrapS'],\n                children: ([\n                    ['ClampToEdge', ClampToEdgeWrapping],\n                    ['MirroredRepeat', MirroredRepeatWrapping],\n                    ['Repeat', RepeatWrapping],\n                ] as [string, Wrapping][]).map(value => ({\n                    label: value[0],\n                    value: value[1],\n                })),\n                onChange: [()=>{if (mat[map])(mat[map] as any)!.needsUpdate = true}],\n            }),\n            ()=>({\n                type: 'dropdown',\n                label: 'Wrap T',\n                property: [mat[map], 'wrapT'],\n                children: ([\n                    ['ClampToEdge', ClampToEdgeWrapping],\n                    ['MirroredRepeat', MirroredRepeatWrapping],\n                    ['Repeat', RepeatWrapping],\n                ] as [string, Wrapping][]).map(value => ({\n                    label: value[0],\n                    value: value[1],\n                })),\n                onChange: [()=>{if (mat[map])(mat[map] as any)!.needsUpdate = true}],\n            }),\n            ()=>({\n                type: 'input',\n                label: 'Anisotropy',\n                bounds: [1, 6],\n                stepSize: 1,\n                property: [mat[map], 'anisotropy'],\n                onChange: [()=>{if (mat[map])(mat[map] as any)!.needsUpdate = true; mat.needsUpdate = true}],\n            }),\n            ()=>({\n                type: 'dropdown',\n                label: 'Min Filter',\n                property: [mat[map], 'minFilter'],\n                children: ([\n                    ['Linear', LinearFilter],\n                    ['Nearest', NearestFilter],\n                    ['NearestMipmapNearest', NearestMipmapNearestFilter],\n                    ['NearestMipmapLinear', NearestMipmapLinearFilter],\n                    ['LinearMipmapNearest', LinearMipmapNearestFilter],\n                    ['LinearMipmapLinear', LinearMipmapLinearFilter],\n                ] as [string, MinificationTextureFilter][]).map(value => ({\n                    label: value[0],\n                    value: value[1],\n                })),\n                onChange: [()=>{if (mat[map])(mat[map] as any)!.needsUpdate = true}],\n            }),\n            ()=>({\n                type: 'dropdown',\n                label: 'Mag Filter',\n                property: [mat[map], 'magFilter'],\n                children: ([\n                    ['Linear', LinearFilter],\n                    ['Nearest', NearestFilter],\n                ] as [string, MagnificationTextureFilter][]).map(value => ({\n                    label: value[0],\n                    value: value[1],\n                })),\n                onChange: [()=>{if (mat[map])(mat[map] as any)!.needsUpdate = true}],\n            }),\n\n        ],\n    } as UiObjectConfig\n}\n","import {IMaterial} from '../IMaterial'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {makeSamplerUi} from '../../ui/image-ui'\nimport {\n    AdditiveBlending,\n    AlwaysDepth,\n    BackSide,\n    Blending, CustomBlending,\n    DepthModes,\n    DoubleSide,\n    EqualDepth,\n    FrontSide,\n    GreaterDepth,\n    GreaterEqualDepth,\n    LessDepth,\n    LessEqualDepth,\n    MultiplyBlending,\n    NeverDepth,\n    NoBlending,\n    NormalBlending,\n    NormalMapTypes,\n    NotEqualDepth,\n    ObjectSpaceNormalMap,\n    OneFactor,\n    OneMinusDstAlphaFactor,\n    OneMinusDstColorFactor,\n    OneMinusSrcAlphaFactor,\n    OneMinusSrcColorFactor,\n    Side,\n    SrcAlphaFactor,\n    SrcAlphaSaturateFactor,\n    SrcColorFactor,\n    SubtractiveBlending,\n    TangentSpaceNormalMap,\n    ZeroFactor,\n    BlendingEquation,\n    BlendingSrcFactor,\n    MinEquation,\n    ConstantAlphaFactor, ConstantColorFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor,\n    ReverseSubtractEquation,\n    SubtractEquation, AddEquation, MaxEquation, DstAlphaFactor, DstColorFactor,\n} from 'three'\nimport {downloadBlob, uploadFile} from 'ts-browser-helpers'\nimport {PhysicalMaterial} from './PhysicalMaterial'\nimport {getEmptyMeta} from '../../utils'\nimport {LegacyPhongMaterial} from './LegacyPhongMaterial'\nimport {generateUUID} from '../../three/utils'\n\ndeclare module '../IMaterial' {\n    interface IMaterial {\n        __matExtUiConfigs?: Record<string, UiObjectConfig|undefined>\n    }\n}\n\nexport const iMaterialUI = {\n    base: (material: IMaterial): UiObjectConfig[] => [\n        {\n            type: 'input',\n            property: [material, 'name'],\n        },\n        // {\n        //     type: 'monitor',\n        //     property: [material, 'uuid'],\n        // },\n        {\n            type: 'checkbox',\n            property: [material, 'wireframe'],\n        },\n        {\n            type: 'checkbox',\n            property: [material, 'vertexColors'],\n        },\n        {\n            type: 'color',\n            property: [material, 'color'],\n        },\n        material.flatShading !== undefined ? {\n            type: 'checkbox',\n            property: [material, 'flatShading'],\n        } : {},\n        {\n            type: 'image',\n            property: [material, 'map'],\n        },\n        makeSamplerUi(material, 'map'),\n    ],\n    blending: (material: IMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Blending',\n            children: [\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'opacity'],\n                },\n                {\n                    type: 'checkbox',\n                    property: [material, 'transparent'],\n                    onChange: (ev)=>material.setDirty({uiChangeEvent: ev, change: 'transparent'}),\n                },\n                {\n                    type: 'dropdown',\n                    property: [material, 'depthFunc'],\n                    children: ([\n                        ['Never', NeverDepth],\n                        ['Always', AlwaysDepth],\n                        ['Less', LessDepth],\n                        ['LessEqual', LessEqualDepth],\n                        ['Equal', EqualDepth],\n                        ['GreaterEqual', GreaterEqualDepth],\n                        ['Greater', GreaterDepth],\n                        ['NotEqual', NotEqualDepth],\n                    ] as [string, DepthModes][]).map(value => ({\n                        label: value[0],\n                        value: value[1],\n                    })),\n                },\n                {\n                    type: 'checkbox',\n                    property: [material, 'depthTest'],\n                    onChange: (ev)=>material.setDirty({uiChangeEvent: ev, change: 'depthTest'}),\n                },\n                {\n                    type: 'checkbox',\n                    property: [material, 'depthWrite'],\n                    onChange: (ev)=>material.setDirty({uiChangeEvent: ev, change: 'depthWrite'}),\n                },\n                {\n                    type: 'checkbox',\n                    property: [material, 'colorWrite'],\n                    onChange: (ev)=>material.setDirty({uiChangeEvent: ev, change: 'colorWrite'}),\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    stepSize: 0.001,\n                    property: [material, 'alphaTest'],\n                },\n                {\n                    type: 'checkbox',\n                    property: [material, 'alphaHash'],\n                },\n                {\n                    type: 'checkbox',\n                    property: [material, 'dithering'],\n                },\n                {\n                    type: 'dropdown',\n                    label: 'Blending',\n                    property: [material, 'blending'],\n                    children: ([\n                        ['None', NoBlending],\n                        ['Normal', NormalBlending],\n                        ['Additive', AdditiveBlending],\n                        ['Subtractive', SubtractiveBlending],\n                        ['Multiply', MultiplyBlending],\n                        ['Custom', CustomBlending],\n                    ] as [string, Blending][]).map(value => ({\n                        label: value[0],\n                        value: value[1],\n                    })),\n                },\n                {\n                    type: 'dropdown',\n                    hidden: ()=>material.blending !== CustomBlending,\n                    property: [material, 'blendingEquation'],\n                    children: ([\n                        ['Add', AddEquation],\n                        ['Subtract', SubtractEquation],\n                        ['Reverse Subtract', ReverseSubtractEquation],\n                        ['Min', MinEquation],\n                        ['Max', MaxEquation],\n                    ] as [string, BlendingEquation][]).map(value => ({\n                        label: value[0],\n                        value: value[1],\n                    })),\n                },\n                {\n                    type: 'dropdown',\n                    property: [material, 'blendSrc'],\n                    hidden: ()=>material.blending !== CustomBlending,\n                    children: ([\n                        ['Zero', ZeroFactor],\n                        ['One', OneFactor],\n                        ['Src Color', SrcColorFactor],\n                        ['One Minus Src Color', OneMinusSrcColorFactor],\n                        ['Src Alpha', SrcAlphaFactor],\n                        ['One Minus Src Alpha', OneMinusSrcAlphaFactor],\n                        ['Dst Alpha', DstAlphaFactor],\n                        ['One Minus Dst Alpha', OneMinusDstAlphaFactor],\n                        ['Dst Color', DstColorFactor],\n                        ['One Minus Dst Color', OneMinusDstColorFactor],\n                        ['Src Alpha Saturate', SrcAlphaSaturateFactor],\n                        ['Constant Color', ConstantColorFactor],\n                        ['One Minus Constant Color', OneMinusConstantColorFactor],\n                        ['Constant Alpha', ConstantAlphaFactor],\n                        ['One Minus Constant Alpha', OneMinusConstantAlphaFactor],\n                    ] as [string, BlendingSrcFactor][]).map(value => ({\n                        label: value[0],\n                        value: value[1],\n                    })),\n                },\n                {\n                    type: 'dropdown',\n                    property: [material, 'blendDst'],\n                    hidden: ()=>material.blending !== CustomBlending,\n                    children: ([\n                        ['Zero', ZeroFactor],\n                        ['One', OneFactor],\n                        ['Src Color', SrcColorFactor],\n                        ['One Minus Src Color', OneMinusSrcColorFactor],\n                        ['Src Alpha', SrcAlphaFactor],\n                        ['One Minus Src Alpha', OneMinusSrcAlphaFactor],\n                        ['Dst Alpha', DstAlphaFactor],\n                        ['One Minus Dst Alpha', OneMinusDstAlphaFactor],\n                        ['Dst Color', DstColorFactor],\n                        ['One Minus Dst Color', OneMinusDstColorFactor],\n                        // ['Src Alpha Saturate', SrcAlphaSaturateFactor],\n                        ['Constant Color', ConstantColorFactor],\n                        ['One Minus Constant Color', OneMinusConstantColorFactor],\n                        ['Constant Alpha', ConstantAlphaFactor],\n                        ['One Minus Constant Alpha', OneMinusConstantAlphaFactor],\n                    ] as [string, BlendingSrcFactor][]).map(value => ({\n                        label: value[0],\n                        value: value[1],\n                    })),\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    hidden: ()=>material.blending !== CustomBlending,\n                    property: [material, 'blendSrcAlpha'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    hidden: ()=>material.blending !== CustomBlending,\n                    property: [material, 'blendDstAlpha'],\n                },\n                {\n                    type: 'color',\n                    hidden: ()=>material.blending !== CustomBlending ||\n                        material.blendSrc !== ConstantColorFactor &&\n                        material.blendSrc !== OneMinusConstantColorFactor &&\n                        material.blendDst !== ConstantColorFactor &&\n                        material.blendDst !== OneMinusConstantColorFactor,\n                    property: [material, 'blendColor'],\n                },\n                {\n                    type: 'slider',\n                    hidden: ()=>material.blending !== CustomBlending ||\n                        material.blendSrc !== ConstantAlphaFactor &&\n                        material.blendSrc !== OneMinusConstantAlphaFactor &&\n                        material.blendDst !== ConstantAlphaFactor &&\n                        material.blendDst !== OneMinusConstantAlphaFactor,\n                    bounds: [0, 1],\n                    property: [material, 'blendAlpha'],\n                },\n                material.alphaMap !== undefined ? {\n                    type: 'image',\n                    property: [material, 'alphaMap'],\n                } : {},\n                material.alphaMap !== undefined ? makeSamplerUi(material, 'alphaMap') : {},\n                {\n                    type: 'checkbox',\n                    label: 'Render to Gbuffer',\n                    // hidden: ()=>!material.transparent && material.transmission < 0.001,\n                    getValue: ()=>material.userData.renderToGBuffer === true,\n                    setValue: (v: boolean)=>{\n                        if (!v && material.userData.renderToGBuffer === false) return\n                        material.userData.renderToGBuffer = v\n                        material.setDirty({change: 'userData', key: 'renderToGBuffer'})\n                    },\n                },\n                {\n                    type: 'checkbox',\n                    label: 'Render to Depth',\n                    hidden: ()=>material.userData.renderToDepth === undefined,\n                    getValue: ()=>material.userData.renderToDepth === true,\n                    setValue: (v: boolean)=>{\n                        if (!v && material.userData.renderToDepth === false) return\n                        material.userData.renderToDepth = v\n                        material.setDirty({change: 'userData', key: 'renderToDepth'})\n                    },\n                },\n                {\n                    type: 'input',\n                    label: 'Forced Linear Depth',\n                    getValue: ()=>material.userData.forcedLinearDepth ?? -1,\n                    setValue: (v: number)=>{\n                        if (v < 0 && material.userData.forcedLinearDepth === undefined) return\n                        if (v >= 0)\n                            material.userData.forcedLinearDepth = v\n                        else\n                            delete material.userData.forcedLinearDepth\n                        material.setDirty({change: 'userData', key: 'forcedLinearDepth'})\n                    },\n                },\n                material.isPhysicalMaterial ? {\n                    type: 'checkbox',\n                    label: 'Inverse AlphaMap',\n                    hidden: ()=>!material.transparent,\n                    getValue: ()=>material.userData.inverseAlphaMap === true,\n                    setValue: (v: boolean)=>{\n                        material.userData.inverseAlphaMap = v ? v : undefined\n                        material.setDirty({change: 'userData', key: 'inverseAlphaMap'})\n                    },\n                } : {},\n            ],\n        }\n    ),\n    polygonOffset: (material: IMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Polygon Offset',\n            children: [\n                {\n                    type: 'checkbox',\n                    label: 'Polygon Offset',\n                    property: [material, 'polygonOffset'],\n                },\n                {\n                    type: 'slider',\n                    label: 'Polygon Offset Factor',\n                    bounds: [-10, 10],\n                    property: [material, 'polygonOffsetFactor'],\n                },\n                {\n                    type: 'slider',\n                    label: 'Polygon Offset Units',\n                    bounds: [-10, 10],\n                    property: [material, 'polygonOffsetUnits'],\n                },\n            ],\n        }\n    ),\n    aoLightMap: (material: IMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'AO/Lightmap',\n            children: [\n                {\n                    type: 'slider',\n                    bounds: [0, 2],\n                    property: [material, 'aoMapIntensity'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'aoMap'],\n                },\n                makeSamplerUi(material, 'aoMap'),\n                {\n                    type: 'slider',\n                    bounds: [0, 2],\n                    property: [material, 'lightMapIntensity'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'lightMap'],\n                },\n                makeSamplerUi(material, 'lightMap'),\n            ],\n        }\n    ),\n    environment: (material: IMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Environment',\n            children: [\n                {\n                    type: 'checkbox',\n                    label: 'Override Environment',\n                    // property: [material.userData, 'separateEnvMapIntensity'],\n                    getValue: ()=>material.userData.separateEnvMapIntensity === true,\n                    setValue: (v: boolean)=>{\n                        material.userData.separateEnvMapIntensity = v\n                        if (!v) delete material.userData.separateEnvMapIntensity\n                    },\n                    // onChange: material.setDirty,\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 20],\n                    hidden: ()=>!material.userData.separateEnvMapIntensity,\n                    label: 'Environment Intensity',\n                    property: [material, 'envMapIntensity'],\n                },\n                {\n                    type: 'dropdown',\n                    hidden: ()=>!material.userData.separateEnvMapIntensity && !material.userData.envMapSlotKey,\n                    label: 'Environment Map',\n                    children: ['', 'environment1', 'environment2'].map((i)=>({label: i || 'default', value: i})),\n                    getValue: ()=>material.userData.envMapSlotKey || '',\n                    setValue: (v: string)=>{\n                        material.userData.envMapSlotKey = v\n                        if (!v) delete material.userData.envMapSlotKey\n                        material.setDirty({change: 'userData', key: 'envMapSlotKey'})\n                    },\n                },\n            ],\n        }\n    ),\n    misc: (material: IMaterial): UiObjectConfig[] => [\n        ()=>material.materialExtensions?.map(v=>{\n            v.uuid = v.uuid || generateUUID()\n            // caching the uiconfig here. todo: reset the uiconfig when cache key changes? or we could just return a dynamic/function uiconfig from getUiConfig\n            material.__matExtUiConfigs = material.__matExtUiConfigs || {}\n            if (!material.__matExtUiConfigs[v.uuid]) material.__matExtUiConfigs[v.uuid] = v.getUiConfig?.(material, material.uiConfig?.uiRefresh)\n            return material.__matExtUiConfigs[v.uuid]\n        }).filter(v=>v),\n        {\n            type: 'dropdown',\n            label: 'Side',\n            property: [material, 'side'],\n            children: ([\n                ['Front', FrontSide],\n                ['Back', BackSide],\n                ['Double', DoubleSide],\n            ] as [string, Side][]).map(value => ({\n                label: value[0],\n                value: value[1],\n            })),\n        },\n        {\n            type: 'input',\n            label: 'Mesh count',\n            getValue: ()=>material.appliedMeshes.size || 0,\n            disabled: true,\n        },\n        {\n            type: 'button',\n            label: `Download ${material.constructor.TypeSlug}`,\n            value: ()=>{\n                const blob = new Blob([JSON.stringify(material.toJSON(), null, 2)], {type: 'application/json'})\n                downloadBlob(blob, `material.${material.constructor.TypeSlug}`)\n            },\n        },\n        {\n            type: 'button',\n            label: `Select ${material.constructor.TypeSlug}`,\n            value: async()=>uploadFile(false, false, material.constructor.TypeSlug).then(async(files)=>files?.[0]?.text()).then((text)=>{\n                if (!text) return\n                const json = JSON.parse(text)\n                if (json.uuid) delete json.uuid // just copy the material properties\n                const currentJson = material.toJSON()\n                material.fromJSON(json, getEmptyMeta())\n                return {\n                    undo: ()=>material.fromJSON(currentJson, getEmptyMeta()),\n                    redo: ()=>material.fromJSON(json, getEmptyMeta()),\n                }\n            }),\n        },\n    ],\n    roughMetal: (material: PhysicalMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Rough/Metal',\n            children: [\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'roughness'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'metalness'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'roughnessMap'],\n                },\n                makeSamplerUi(material, 'roughnessMap'),\n                {\n                    type: 'image',\n                    property: [material, 'metalnessMap'],\n                },\n                makeSamplerUi(material, 'metalnessMap'),\n            ],\n        }\n    ),\n    bumpNormal: (material: PhysicalMaterial|LegacyPhongMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            // uuid: 'bump_normal',\n            label: 'Bump/Normal',\n            children: [\n                {\n                    type: 'slider',\n                    bounds: [-500, 500],\n                    stepSize: 0.001,\n                    property: [material, 'bumpScale'],\n                    hidden: ()=>!material.bumpMap,\n                },\n                {\n                    type: 'image',\n                    property: [material, 'bumpMap'],\n                },\n                makeSamplerUi(material, 'bumpMap'),\n                {\n                    type: 'image',\n                    property: [material, 'normalMap'],\n                },\n                {\n                    type: 'vec2',\n                    property: [material, 'normalScale'],\n                    hidden: ()=>!material.normalMap,\n                },\n                {\n                    type: 'dropdown',\n                    hidden: ()=>!material.normalMap,\n                    property: [material, 'normalMapType'],\n                    children: ([\n                        ['TangentSpace', TangentSpaceNormalMap],\n                        ['ObjectSpace', ObjectSpaceNormalMap],\n                    ] as [string, NormalMapTypes][]).map(value => ({\n                        label: value[0],\n                        value: value[1],\n                    })),\n                },\n                makeSamplerUi(material, 'normalMap'),\n                {\n                    type: 'input',\n                    property: [material, 'displacementScale'],\n                    hidden: ()=>!material.displacementMap,\n                },\n                {\n                    type: 'image',\n                    property: [material, 'displacementMap'],\n                },\n                makeSamplerUi(material, 'displacementMap'),\n            ],\n        }\n    ),\n    emission: (material: PhysicalMaterial|LegacyPhongMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Emission',\n            children: [\n                {\n                    type: 'color',\n                    property: [material, 'emissive'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 100],\n                    property: [material, 'emissiveIntensity'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'emissiveMap'],\n                },\n                makeSamplerUi(material, 'emissiveMap'),\n            ],\n        }\n    ),\n    transmission: (material: PhysicalMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Refraction',\n            children: [\n                // {\n                //     type: 'slider',\n                //     bounds: [0, 1],\n                //     property: [material, 'reflectivity'],\n                // },\n                {\n                    type: 'slider',\n                    bounds: [0, 4],\n                    property: [material, 'ior'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'transmission'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    stepSize: 0.001,\n                    property: [material, 'thickness'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'transmissionMap'],\n                },\n                makeSamplerUi(material, 'transmissionMap'),\n                {\n                    type: 'image',\n                    property: [material, 'thicknessMap'],\n                },\n                makeSamplerUi(material, 'thicknessMap'),\n                {\n                    type: 'number',\n                    property: [material, 'attenuationDistance'],\n                },\n                {\n                    type: 'color',\n                    property: [material, 'attenuationColor'],\n                },\n            ],\n        }\n    ),\n    clearcoat: (material: PhysicalMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Clearcoat',\n            children: [\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'clearcoat'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    hidden: ()=>material.clearcoat < 0.001,\n                    property: [material, 'clearcoatRoughness'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'clearcoatMap'],\n                },\n                makeSamplerUi(material, 'clearcoatMap'),\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'clearcoatRoughness'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'clearcoatRoughnessMap'],\n                },\n                makeSamplerUi(material, 'clearcoatRoughnessMap'),\n                {\n                    type: 'image',\n                    property: [material, 'clearcoatNormalMap'],\n                },\n                {\n                    type: 'vec2',\n                    property: [material, 'clearcoatNormalScale'],\n                    hidden: ()=>!material.clearcoatNormalMap,\n                },\n                makeSamplerUi(material, 'clearcoatNormalMap'),\n            ],\n        }\n    ),\n    iridescence: (material: PhysicalMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Iridescence',\n            children: [\n                {\n                    type: 'slider',\n                    bounds: [0, 3],\n                    label: 'Intensity',\n                    property: [material, 'iridescence'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 3],\n                    label: 'IOR',\n                    property: [material, 'iridescenceIOR'],\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 500],\n                    label: 'Thickness0',\n                    property: [material.iridescenceThicknessRange, '0'],\n                    onChange: (ev)=>material.setDirty({uiChangeEvent: ev, change: 'iridescenceThicknessRange', key: '0'}),\n                },\n                {\n                    type: 'slider',\n                    bounds: [0, 500],\n                    label: 'Thickness1',\n                    property: [material.iridescenceThicknessRange, '1'],\n                    onChange: (ev)=>material.setDirty({uiChangeEvent: ev, change: 'iridescenceThicknessRange', key: '1'}),\n                },\n                {\n                    type: 'image',\n                    property: [material, 'iridescenceMap'],\n                },\n                makeSamplerUi(material, 'iridescenceMap'),\n                {\n                    type: 'image',\n                    property: [material, 'iridescenceThicknessMap'],\n                },\n                makeSamplerUi(material, 'iridescenceThicknessMap'),\n            ],\n        }\n    ),\n    sheen: (material: PhysicalMaterial): UiObjectConfig => (\n        {\n            type: 'folder',\n            label: 'Sheen',\n            children: [\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'sheen'],\n                },\n                {\n                    type: 'color',\n                    hidden: ()=>material.sheen < 0.001,\n                    property: [material, 'sheenColor'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'sheenColorMap'],\n                },\n                makeSamplerUi(material, 'sheenColorMap'),\n                {\n                    type: 'slider',\n                    bounds: [0, 1],\n                    property: [material, 'sheenRoughness'],\n                },\n                {\n                    type: 'image',\n                    property: [material, 'sheenRoughnessMap'],\n                },\n                makeSamplerUi(material, 'sheenRoughnessMap'),\n            ],\n        }\n    ),\n}\n","import {\n    AddEquation,\n    AlwaysStencilFunc,\n    FrontSide,\n    KeepStencilOp,\n    LessEqualDepth,\n    NormalBlending,\n    OneMinusSrcAlphaFactor,\n    SrcAlphaFactor,\n} from 'three'\n\n/**\n * Map of all material properties and their default values in three.js - Material.js\n * This is used to copy properties and serialize/deserialize them.\n * @note: Upgrade note: keep updated from three.js/src/Material.js:22\n */\nexport const threeMaterialPropList = {\n    // uuid: '', // DONT COPY, should remain commented\n    name: '',\n    blending: NormalBlending,\n    side: FrontSide,\n    vertexColors: false,\n    opacity: 1,\n    transparent: false,\n    blendSrc: SrcAlphaFactor,\n    blendDst: OneMinusSrcAlphaFactor,\n    blendEquation: AddEquation,\n    blendSrcAlpha: null,\n    blendDstAlpha: null,\n    blendEquationAlpha: null,\n    blendColor: '#000000',\n    blendAlpha: 0,\n    depthFunc: LessEqualDepth,\n    depthTest: true,\n    depthWrite: true,\n    stencilWriteMask: 0xff,\n    stencilFunc: AlwaysStencilFunc,\n    stencilRef: 0,\n    stencilFuncMask: 0xff,\n    stencilFail: KeepStencilOp,\n    stencilZFail: KeepStencilOp,\n    stencilZPass: KeepStencilOp,\n    stencilWrite: false,\n    clippingPlanes: null,\n    clipIntersection: false,\n    clipShadows: false,\n    shadowSide: null,\n    colorWrite: true,\n    precision: null,\n    polygonOffset: false,\n    polygonOffsetFactor: 0,\n    polygonOffsetUnits: 0,\n    dithering: false,\n    alphaToCoverage: false,\n    premultipliedAlpha: false,\n    forceSinglePass: false,\n    allowOverride: true,\n    visible: true,\n    toneMapped: true,\n    userData: {},\n    // wireframeLinecap: 'round',\n    // wireframeLinejoin: 'round',\n    alphaTest: 0,\n    alphaHash: false,\n    // fog: true,\n}\nexport const threeMaterialInterpolateProps = [\n    'opacity',\n    'blendColor',\n    'blendAlpha',\n    'alphaTest',\n]\n","import {\n    Color,\n    IUniform,\n    Material,\n    MeshBasicMaterial,\n    MeshBasicMaterialParameters,\n    MultiplyOperation,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {generateUiConfig, UiObjectConfig} from 'uiconfig.js'\nimport {\n    IMaterial,\n    IMaterialEventMap,\n    IMaterialParameters,\n    IMaterialUserData,\n} from '../IMaterial'\nimport {MaterialExtension} from '../../materials'\nimport {AnimateTime, SerializationMetaType, shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {ITexture} from '../ITexture'\nimport {iMaterialCommons} from './iMaterialCommons'\nimport {IObject3D} from '../IObject'\nimport {iMaterialUI} from './IMaterialUi'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\n\n/**\n * And extension of three.js MeshBasicMaterial that can be assigned to objects, and support threepipe features, uiconfig, and serialization.\n *\n * @category Materials\n */\nexport class UnlitMaterial<TE extends IMaterialEventMap = IMaterialEventMap> extends MeshBasicMaterial<TE & IMaterialEventMap> implements IMaterial<TE> {\n    declare ['constructor']: typeof UnlitMaterial\n\n    public static readonly TypeSlug = 'bmat'\n    public static readonly TYPE = 'UnlitMaterial' // not using .type because it is used by three.js\n    public static readonly TypeAlias = ['unlit', 'basic', UnlitMaterial.TYPE, UnlitMaterial.TypeSlug, 'MeshBasicMaterial', 'MeshBasicMaterial2']\n    static {\n        ThreeSerialization.SerializableMaterials.add(UnlitMaterial)\n    }\n\n    assetType = 'material' as const\n\n    declare userData: IMaterialUserData\n\n    public readonly isUnlitMaterial = true\n\n    readonly appliedMeshes: Set<IObject3D> = new Set()\n    readonly setDirty = iMaterialCommons.setDirty\n    dispose(): this {return iMaterialCommons.dispose(super.dispose).call(this)}\n    clone(track = false): this {return iMaterialCommons.clone(super.clone).call(this, track)}\n\n    envMap: ITexture | null = null\n\n    constructor({customMaterialExtensions, ...parameters}: MeshBasicMaterialParameters & IMaterialParameters = {}) {\n        super()\n        !this.defines && (this.defines = {})\n        this.fog = false\n        this.setDirty = this.setDirty.bind(this)\n        if (customMaterialExtensions) this.registerMaterialExtensions(customMaterialExtensions)\n        iMaterialCommons.upgradeMaterial.call(this)\n        this.setValues(parameters)\n    }\n\n    // region Material Extension\n\n    materialExtensions: MaterialExtension[] = []\n    extraUniformsToUpload: Record<string, IUniform> = {}\n    registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + iMaterialCommons.customProgramCacheKey.call(this)\n    }\n\n    onBeforeCompile(shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void { // shader is not Shader but WebglUniforms.getParameters return value type so includes defines\n        const f = [\n            ['vec3 outgoingLight = ', 'afterModulation'], // added markers before found substring\n            ['#include <aomap_fragment>', 'beforeModulation'],\n            ['ReflectedLight reflectedLight = ', 'beforeAccumulation'],\n            ['#include <clipping_planes_fragment>', 'mainStart'],\n        ]\n        const v = [\n            ['#include <uv_vertex>', 'mainStart'],\n        ]\n\n        for (const vElement of v) shader.vertexShader = shaderReplaceString(shader.vertexShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n        for (const vElement of f) shader.fragmentShader = shaderReplaceString(shader.fragmentShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n\n        iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n        // shader.defines.INVERSE_ALPHAMAP = this.userData.inverseAlphaMap ? 1 : 0 // todo\n\n        super.onBeforeCompile(shader, renderer)\n    }\n\n    // onBeforeRender(...args: Parameters<IMaterial['onBeforeRender']>): void {\n    //     super.onBeforeRender(...args)\n    //     iMaterialCommons.onBeforeRender.call(this, ...args)\n    //\n    //     // const t = this.userData.inverseAlphaMap ? 1 : 0 // todo\n    //     // if (t !== this.defines.INVERSE_ALPHAMAP) {\n    //     //     this.defines.INVERSE_ALPHAMAP = t\n    //     //     this.needsUpdate = true\n    //     // }\n    // }\n    /** @ignore */\n    onBeforeRender = iMaterialCommons.onBeforeRenderOverride(super.onBeforeRender)\n    /** @ignore */\n    onAfterRender = iMaterialCommons.onAfterRenderOverride(super.onAfterRender)\n\n    // endregion\n\n    // region Serialization\n\n    /**\n     * Sets the values of this material based on the values of the passed material or an object with material properties\n     * The input is expected to be a valid material or a deserialized material parameters object(including the deserialized userdata)\n     * @param parameters - material or material parameters object\n     * @param allowInvalidType - if true, the type of the oldMaterial is not checked. Objects without type are always allowed.\n     * @param clearCurrentUserData - if undefined, then depends on material.isMaterial. if true, the current userdata is cleared before setting the new values, because it can have data which wont be overwritten if not present in the new material.\n     * @param time - optional data to animate(lerp) from current value to the target value.\n     */\n    setValues(parameters: Material|(MeshBasicMaterialParameters&{type?:string}), allowInvalidType = true, clearCurrentUserData: boolean|undefined = undefined, time?: AnimateTime): this {\n        if (!parameters) return this\n        if (parameters.type && !allowInvalidType && !['MeshBasicMaterial', 'MeshBasicMaterial2', this.constructor.TYPE, this.type].includes(parameters.type)) {\n            console.error('Material type is not supported:', parameters.type)\n            return this\n        }\n        iMaterialCommons.setValues(super.setValues).call(this, parameters, allowInvalidType, clearCurrentUserData, time)\n\n        this.userData.uuid = this.uuid\n        return this\n    }\n    copy(source: Material|any): this {\n        return this.setValues(source, false)\n    }\n\n    /**\n     * Serializes this material to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer->material\n     */\n    toJSON(meta?: SerializationMetaType, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    /**\n     * Deserializes the material from JSON.\n     * Textures should be loaded and in meta.textures before calling this method.\n     * @param data\n     * @param meta\n     * @param _internal\n     */\n    fromJSON(data: any, meta?: SerializationMetaType, _internal = false): this | null {\n        if (_internal) {\n            ThreeSerialization.Deserialize(data, this, meta, true)\n            return this.setValues(data)\n        }\n        // this will deserialize the material from the outside because we need access to the viewer to load textures\n        // todo check if the material is in scene? if not, show an error/warning?\n        this.dispatchEvent({type: 'beforeDeserialize', data, meta, bubbleToObject: true, bubbleToParent: true})\n        return this\n    }\n\n    // endregion\n\n    // region UI Config\n\n    // todo dispose ui config\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Unlit Material',\n        uuid: 'MBM2_' + this.uuid,\n        expanded: true,\n        onChange: (ev)=>{\n            if (!ev.config || ev.config.onChange) return\n            let key = Array.isArray(ev.config.property) ? ev.config.property[1] : ev.config.property\n            key = typeof key === 'string' ? key : undefined\n            // todo set needsUpdate true only for properties that require it like maps.\n            this.setDirty({uiChangeEvent: ev, needsUpdate: !!ev.last, refreshUi: !!ev.last, change: key})\n        },\n        children: [\n            ...iMaterialUI.base(this),\n            ...generateUiConfig(this),\n            iMaterialUI.blending(this),\n            iMaterialUI.aoLightMap(this),\n            iMaterialUI.polygonOffset(this),\n            // iMaterialUI.environment(this),\n            ...iMaterialUI.misc(this),\n        ],\n    }\n\n    // endregion UI Config\n\n    // Class properties can also be listed with annotations like @serialize or @property\n    // used for serialization\n    static readonly MaterialProperties = {\n        ...threeMaterialPropList,\n\n        color: new Color(0xffffff),\n        map: null,\n        lightMap: null,\n        lightMapIntensity: 1,\n        aoMap: null,\n        aoMapIntensity: 1,\n        specularMap: null,\n        alphaMap: null,\n        envMap: null,\n        combine: MultiplyOperation,\n        envMapIntensity: 1,\n        reflectivity: 1,\n        refractionRatio: 0.98,\n        wireframe: false,\n        wireframeLinewidth: 1,\n        wireframeLinecap: 'round',\n        wireframeLinejoin: 'round',\n        skinning: false,\n        fog: true,\n        flatShading: false,\n    }\n    static readonly MapProperties = [\n        'map',\n        'aoMap',\n        'lightMap',\n        'specularMap',\n        'alphaMap',\n        'envMap',\n    ]\n    static readonly InterpolateProperties = [\n        ...threeMaterialInterpolateProps,\n        'color',\n        'color',\n        'specular',\n        'emissive',\n        'reflectivity',\n        'refractionRatio',\n        'envMapIntensity',\n        'lightMapIntensity',\n        'aoMapIntensity',\n        'wireframeLinewidth',\n    ]\n}\n\nexport class MeshBasicMaterial2 extends UnlitMaterial {\n    constructor(parameters?: MeshBasicMaterialParameters) {\n        super(parameters)\n        console.error('MeshBasicMaterial2 is deprecated, use UnlitMaterial instead')\n    }\n}\n","import {\n    ColorManagement,\n    Event,\n    Material,\n    MaterialParameters,\n    Scene,\n    Texture,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {copyProps} from 'ts-browser-helpers'\nimport {copyMaterialUserData} from '../../utils/serialization'\nimport {MaterialExtender, MaterialExtension} from '../../materials'\nimport {IScene} from '../IScene'\nimport {AnimateTimeMaterial, IMaterial, IMaterialEventMap, IMaterialSetDirtyOptions} from '../IMaterial'\nimport {UnlitMaterial} from './UnlitMaterial'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\nimport {lerpParams} from '../../utils/lerp'\nimport {ITexture} from '../ITexture'\nimport {checkTexMapReference} from '../../three'\n\nexport const iMaterialCommons = {\n    threeMaterialPropList,\n    threeMaterialInterpolateProps,\n    setDirty: function(this: IMaterial, options?: IMaterialSetDirtyOptions): void {\n        if (options?.needsUpdate !== false) this.needsUpdate = true\n        iMaterialCommons.refreshTextureRefs.call(this)\n        this.dispatchEvent({bubbleToObject: true, bubbleToParent: true, ...options, type: 'materialUpdate'}) // this sets sceneUpdate in root scene\n        if (options?.last !== false && options?.refreshUi !== false) this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    },\n    /** @ignore */\n    setValues: (superSetValues: Material['setValues']): IMaterial['setValues'] =>\n        function(this: IMaterial, parameters: Material | (MaterialParameters & {type?: string}), _allowInvalidType?: boolean, clearCurrentUserData?: boolean, time?: AnimateTimeMaterial): IMaterial {\n\n            if (clearCurrentUserData === undefined) clearCurrentUserData = (<Material>parameters).isMaterial\n            if (clearCurrentUserData) this.userData = {}\n\n            // legacy check for old color management(non-sRGB) in material.setValues todo: move this to Material.fromJSON\n            const legacyColors = (parameters as any)?.metadata && (parameters as any)?.metadata.version <= 4.5\n            const lastColorManagementEnabled = ColorManagement.enabled\n            if (legacyColors) ColorManagement.enabled = false\n\n            const propList = this.constructor.MaterialProperties\n            const params: any = !propList ? {...parameters} : copyProps(parameters, {} as any, Array.from(Object.keys(propList)))\n\n            // remove undefined values\n            for (const key of Object.keys(params)) if (params[key] === undefined) delete params[key]\n\n            const userData = params.userData\n            delete params.userData\n\n            const interpolateProps = new Set([...this.constructor.InterpolateProperties || UnlitMaterial.InterpolateProperties, ...this.constructor.MapProperties || UnlitMaterial.MapProperties])\n            if (time) {\n                lerpParams(params, this as any, interpolateProps, time)\n            }\n\n            // todo: can migrate to @serialize for properties which have UI etc and use super.setValues for the rest like threeMaterialPropList\n            superSetValues.call(this, params)\n\n            if (userData) copyMaterialUserData(this.userData, userData)\n            this.userData.uuid = this.uuid\n\n            // todo sprops\n\n            // bump map scale fix todo: move this to Material.fromJSON\n            // https://github.com/repalash/three.js/commit/7b13bb515866f6a002928bd28d0a793cafeaeb1a\n            const legacyBumpScale = (parameters as any)?.metadata && (parameters as any)?.metadata.version <= 4.6\n            if ((legacyBumpScale || this.userData.legacyBumpScale) && (this as any)?.bumpScale !== undefined && this?.bumpMap && this.defines) {\n                console.warn('MaterialManager: Old format material loaded, bump map might be incorrect.', parameters, (parameters as any).bumpScale)\n                this.defines.BUMP_MAP_SCALE_LEGACY = '1'\n                this.userData.legacyBumpScale = true\n                this.needsUpdate = true\n            }\n\n            if (legacyColors) ColorManagement.enabled = lastColorManagementEnabled\n\n            this.setDirty && this.setDirty()\n            return this\n        },\n    /** @ignore */\n    dispose: (superDispose: Material['dispose']): IMaterial['dispose'] =>\n        function(this: IMaterial, force = true): void {\n            if (!force && this.userData.disposeOnIdle === false) return\n            superDispose.call(this)\n        },\n    /** @ignore */\n    clone: (superClone: Material['clone']): IMaterial['clone'] =>\n        function(this: IMaterial, track = false): IMaterial {\n            if (track) {\n                if (!this.userData.cloneId) {\n                    this.userData.cloneId = '0'\n                }\n                if (!this.userData.cloneCount) {\n                    this.userData.cloneCount = 0\n                }\n                this.userData.cloneCount += 1\n            }\n\n            const material: IMaterial = new this.constructor()?.setValues(this, false) ?? superClone.call(this)\n\n            if (track) {\n                material.userData.cloneId = material.userData.cloneId + '_' + this.userData.cloneCount\n                material.userData.cloneCount = 0\n                material.name = (material.name || 'mat') + '_' + material.userData.cloneId\n            }\n\n            return material\n        },\n    /** @ignore */\n    dispatchEvent: (superDispatchEvent: Material['dispatchEvent']): IMaterial['dispatchEvent'] =>\n        function(this: IMaterial, event): void {\n            superDispatchEvent.call(this, event)\n            const type = event.type\n            if ((event as IMaterialEventMap['materialUpdate']).bubbleToObject && (\n                type === 'beforeDeserialize' || type === 'materialUpdate' || type === 'textureUpdate' || type === 'select' // todo - add more events\n            )) {\n                this.appliedMeshes.forEach(m => m.dispatchEvent({...event, material: this, type}))\n            }\n        },\n\n    customProgramCacheKey: function(this: IMaterial): string {\n        return MaterialExtender.CacheKeyForExtensions(this, this.materialExtensions) + this.userData.inverseAlphaMap\n    },\n    registerMaterialExtensions: function(this: IMaterial, customMaterialExtensions: MaterialExtension[]): void {\n        MaterialExtender.RegisterExtensions(this, customMaterialExtensions)\n    },\n    unregisterMaterialExtensions: function(this: IMaterial, customMaterialExtensions: MaterialExtension[]): void {\n        MaterialExtender.UnregisterExtensions(this, customMaterialExtensions)\n    },\n\n    onBeforeCompile: function(this: IMaterial, shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void {\n        if (this.materialExtensions) MaterialExtender.ApplyMaterialExtensions(this, shader, this.materialExtensions, renderer)\n\n        this.dispatchEvent({type: 'beforeCompile', shader, renderer})\n\n        shader.fragmentShader = shader.fragmentShader.replaceAll('#glMarker', '// ')\n        shader.vertexShader = shader.vertexShader.replaceAll('#glMarker', '// ')\n    },\n    /** @ignore */\n    onBeforeRender: function(this: IMaterial, renderer, scene: Scene & Partial<IScene>, camera, geometry, object) {\n\n        // moved to three.js WebGLRenderer\n        // if (this.envMapIntensity !== undefined && !this.userData.separateEnvMapIntensity && scene.envMapIntensity !== undefined) {\n        //     this.userData.__envIntensity = this.envMapIntensity\n        //     this.envMapIntensity = scene.envMapIntensity\n        // }\n        if (this.defines && this.envMap !== undefined && scene.fixedEnvMapDirection !== undefined) {\n            if (scene.fixedEnvMapDirection) {\n                if (!this.defines.FIX_ENV_DIRECTION) {\n                    this.defines.FIX_ENV_DIRECTION = '1'\n                    this.needsUpdate = true\n                }\n            } else if (this.defines.FIX_ENV_DIRECTION !== undefined) {\n                delete this.defines.FIX_ENV_DIRECTION\n                this.needsUpdate = true\n            }\n        }\n        this.dispatchEvent({type: 'beforeRender', renderer, scene, camera, geometry, object})\n    } as IMaterial['onBeforeRender'],\n    /** @ignore */\n    onAfterRender: function(this: IMaterial, renderer, scene: Scene & Partial<IScene>, camera, geometry, object) {\n        // if (this.userData.__envIntensity !== undefined) {\n        //     this.envMapIntensity = this.userData.__envIntensity\n        //     delete this.userData.__envIntensity\n        // }\n        this.dispatchEvent({type: 'afterRender', renderer, scene, camera, geometry, object})\n    } as IMaterial['onAfterRender'],\n\n    /** @ignore */\n    onBeforeCompileOverride: (superOnBeforeCompile: Material['onBeforeCompile']): IMaterial['onBeforeCompile'] =>\n        function(this: IMaterial, shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void {\n            iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n            superOnBeforeCompile.call(this, shader, renderer)\n        },\n    /** @ignore */\n    onBeforeRenderOverride: (superOnBeforeRender: Material['onBeforeRender']): IMaterial['onBeforeRender'] =>\n        function(this: IMaterial, ...args: Parameters<Material['onBeforeRender']>): void {\n            superOnBeforeRender.call(this, ...args)\n            iMaterialCommons.onBeforeRender.call(this, ...args)\n        },\n    /** @ignore */\n    onAfterRenderOverride: (superOnAfterRender: Material['onAfterRender']): IMaterial['onAfterRender'] =>\n        function(this: IMaterial, ...args: Parameters<Material['onAfterRender']>): void {\n            superOnAfterRender.call(this, ...args)\n            iMaterialCommons.onAfterRender.call(this, ...args)\n        },\n    /** @ignore */\n    customProgramCacheKeyOverride: (superCustomPropertyCacheKey: Material['customProgramCacheKey']): IMaterial['customProgramCacheKey'] =>\n        function(this: IMaterial): string {\n            return superCustomPropertyCacheKey.call(this) + iMaterialCommons.customProgramCacheKey.call(this)\n        },\n\n    upgradeMaterial: upgradeMaterial,\n\n    getMapsForMaterial: function(this: IMaterial) {\n        const maps = new Map<string, ITexture>()\n        for (const prop of this.constructor?.MapProperties || materialTextureProperties) {\n            checkTexMapReference(prop, this, maps)\n        }\n        if (this.userData)\n            for (const prop of materialTexturePropertiesUserData) {\n                checkTexMapReference(prop, this.userData, maps, true)\n            }\n\n        return maps\n    },\n    refreshTextureRefs: function(this: IMaterial) {\n        if (!this.__textureUpdate) this.__textureUpdate = textureUpdate.bind(this)\n        const newMaps1: Map<string, ITexture> = iMaterialCommons.getMapsForMaterial.call(this)\n        // todo remove spread after node 22 widespread support\n        const newMaps = new Set([...newMaps1.values()])\n        const oldMaps = this._mapRefs || new Set<ITexture>()\n        let changed = false\n        const added = new Set<ITexture>()\n        const removed = new Set<ITexture>()\n        for (const map of newMaps) {\n            if (!map || !map.isTexture) continue\n            map.addEventListener('update', this.__textureUpdate!)\n            if (oldMaps.has(map)) continue\n            changed = true\n            added.add(map)\n        }\n        for (const map of oldMaps) {\n            if (newMaps.has(map)) continue\n            map.removeEventListener('update', this.__textureUpdate!)\n            changed = true\n            removed.add(map)\n        }\n        this._mapRefs = newMaps\n        if (changed) {\n            this.dispatchEvent({\n                type: 'texturesChanged',\n                textures: newMaps, oldTextures: oldMaps,\n                addedTextures: added, removedTextures: removed,\n                material: this,\n                bubbleToObject: true,\n                bubbleToParent: true,\n            })\n        }\n    },\n\n    // todo;\n} as const\n\nconst textureUpdate = function(this: IMaterial, e: Event<'update', Texture>) {\n    if (!this || this.assetType !== 'material') return\n    this.dispatchEvent({texture: e.target, bubbleToParent: true, bubbleToObject: true, ...e, type: 'textureUpdate'})\n}\n\nexport const materialTextureProperties: Set<string> = new Set<string>([])\n// todo add from plugins like custom bump map etc.\nexport const materialTexturePropertiesUserData: Set<string> = new Set<string>([])\n\n/**\n * Convert a standard three.js {@link Material} to {@link IMaterial}\n */\nexport function upgradeMaterial(this: IMaterial): IMaterial {\n    if (!this.isMaterial) {\n        console.error('Material is not a material', this)\n        return this\n    }\n    if (!this.setDirty) this.setDirty = iMaterialCommons.setDirty\n    if (!this.appliedMeshes) this.appliedMeshes = new Set()\n    if (!this.userData) this.userData = {}\n    this.userData.uuid = this.uuid // for serialization\n\n    if (!(this as any).__upgradeSetup) {\n        this.dispatchEvent = iMaterialCommons.dispatchEvent(this.dispatchEvent)\n        ;(this as any).__upgradeSetup = true\n    }\n    // legacy\n    // if (!this.userData.setDirty) this.userData.setDirty = (e: any) => {\n    //     console.warn('userData.setDirty is deprecated. Use setDirty instead.')\n    //     this.setDirty(e)\n    // }\n\n    if (this.assetType === 'material') return this // already upgraded\n    this.assetType = 'material'\n    this.setValues = iMaterialCommons.setValues(this.setValues)\n    this.dispose = iMaterialCommons.dispose(this.dispose)\n    this.clone = iMaterialCommons.clone(this.clone)\n\n    // material extensions\n    if (!this.extraUniformsToUpload) this.extraUniformsToUpload = {}\n    if (!this.materialExtensions) this.materialExtensions = []\n    if (!this.registerMaterialExtensions) this.registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    if (!this.unregisterMaterialExtensions) this.unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n    // in troika text material, onBeforeCompile is a get/set property that chains it, causing infinite loop if we just override it. todo - couldnt find a better way right now than hard check, descriptors are the same\n    const skipOverride = !(this as any).isDerivedMaterial\n    this.onBeforeCompile = !skipOverride ? iMaterialCommons.onBeforeCompile : iMaterialCommons.onBeforeCompileOverride(this.onBeforeCompile)\n    this.onBeforeRender = iMaterialCommons.onBeforeRenderOverride(this.onBeforeRender)\n    this.onAfterRender = iMaterialCommons.onAfterRenderOverride(this.onAfterRender)\n    this.customProgramCacheKey = iMaterialCommons.customProgramCacheKeyOverride(this.customProgramCacheKey)\n\n    // todo: add uiconfig, serialization, other stuff from UnlitMaterial?\n    // dispose uiconfig etc. on dispose\n\n    this.setDirty({change: 'upgradeMaterial'})\n    return this\n}\n","// Pretty much the same as meshnormal.glsl.js in three.js with minor changes.\n\n//#/include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\n#glMarker importsEnd\n\n#define DEPTH_NORMAL\n#define IS_DEPTH_MATERIAL\n\nvarying vec3 vViewPosition;\n\n#ifdef USE_ALPHAMAP\n#define USE_UV // see todo in GBufferMaterialOverride updateMaterialDefines\n#endif\n\nvoid main() {\n\n    #include <uv_vertex>\n\t#include <batching_vertex>\n\n    #include <beginnormal_vertex>\n    #include <morphnormal_vertex>\n    #include <skinbase_vertex>\n    #include <skinnormal_vertex>\n    #include <defaultnormal_vertex>\n    #include <normal_vertex>\n\n    #include <begin_vertex>\n    #include <morphtarget_vertex>\n    #include <skinning_vertex>\n    #include <displacementmap_vertex>\n    #include <project_vertex>\n    #include <logdepthbuf_vertex>\n    #include <clipping_planes_vertex>\n\n    #glMarker beforeOutput\n\n    vViewPosition = - mvPosition.xyz;\n\n}\n","// Similar to meshnormal.glsl.js in three.js, check for ref\n\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\n#glMarker importsEnd\n\n#define DEPTH_NORMAL\n#define IS_DEPTH_MATERIAL\n\n//uniform float opacity;\n\nvarying vec3 vViewPosition;\n\n#ifdef USE_ALPHAMAP\n#define USE_UV\n\n#include <packing>\n\n#endif\n\n#if IS_GLSL3 > 0\n\n#ifndef gl_FragColor // webgl2 with glsl3\nlayout(location = 0) out vec4 gDepthNormal;\nlayout(location = 1) out vec4 gFlags;\n//#define gl_FragColor gDepthNormal\n#endif\n\n#endif\n\nuniform vec2 cameraNearFar;\nuniform vec4 flags;\n\n//vec2 pack16(float value) {\n//    float sMax = 65535.0;\n//    int v = int(clamp(value, 0.0, 1.0)*sMax+0.5);\n//    int digit0 = v/256;\n//    int digit1 = v-digit0*256;\n//    return vec2(float(digit0)/255.0, float(digit1)/255.0);\n//}\nvec2 pack16(float value){\n    float f = clamp(value, 0.0, 1.0)*255.0;\n    float digitLow = fract(f);\n    float digitHigh = floor(f)/255.0;\n    return vec2(digitHigh, digitLow);\n}\n//float unpack16(vec2 value){\n//    return value.x+value.y/255.0;\n//}\n\nvec2 packNormal(vec3 n){\n    float p = sqrt(n.z*8.0+8.0);\n    return vec2(n.xy/p + 0.5);\n}\n\nfloat linstep(float edge0, float edge1, float value) {\n    return clamp((value-edge0)/(edge1-edge0), 0.0, 1.0);\n}\n\nvoid main() {\n    #glMarker mainStart\n\n    #include <clipping_planes_fragment>\n\n    vec4 diffuseColor = vec4( 1.0 );\n\n    #include <map_fragment>\n\n    //#/include <alphamap_fragment> // changed for ALPHA_I_RGBA_PACKING\n    #ifdef USE_ALPHAMAP\n\n    float alphaMapValue =\n    #ifdef ALPHA_I_RGBA_PACKING\n    1. - unpackRGBAToDepth( texture2D( alphaMap, vAlphaMapUv ) );\n    #else\n    texture2D( alphaMap, vAlphaMapUv ).g;\n    #endif\n\n    #if defined(INVERSE_ALPHAMAP) && INVERSE_ALPHAMAP >= 1\n    diffuseColor.a *= 1.0 - alphaMapValue;\n    #else\n    diffuseColor.a *= alphaMapValue;\n    #endif\n\n    #endif\n\n    #include <alphatest_fragment>\n\n    #include <logdepthbuf_fragment>\n    #include <normal_fragment_begin>\n    #include <normal_fragment_maps>\n\n    #glMarker beforeOutput\n\n    #ifdef FORCED_LINEAR_DEPTH\n    float linearZ = float(FORCED_LINEAR_DEPTH);\n    #else\n    float linearZ = linstep(-cameraNearFar.x, -cameraNearFar.y, -vViewPosition.z);\n    #endif\n    vec2 packedZ = pack16(pow(max(0.,linearZ), 0.5));\n    vec2 packedNormal = packNormal(normal);\n\n    #if IS_GLSL3 > 0\n    #ifndef gl_FragColor // webgl2 with glsl3\n    gDepthNormal = vec4(packedZ.x, packedZ.y, packedNormal.x, packedNormal.y);\n    gFlags = flags;\n    #else\n    gl_FragColor = vec4(packedZ.x, packedZ.y, packedNormal.x, packedNormal.y);\n    #endif\n    #else\n    gl_FragColor = vec4(packedZ.x, packedZ.y, packedNormal.x, packedNormal.y);\n    #endif\n}\n","import {\n    BufferGeometry,\n    Camera, Group,\n    IUniform,\n    Material,\n    Object3D,\n    Scene,\n    ShaderMaterial,\n    ShaderMaterialParameters,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {IMaterial, IMaterialEventMap, IMaterialParameters, IMaterialUserData} from '../IMaterial'\nimport {MaterialExtension} from '../../materials'\nimport {iMaterialCommons} from './iMaterialCommons'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\n\nexport class ShaderMaterial2<TE extends IMaterialEventMap = IMaterialEventMap> extends ShaderMaterial<TE & IMaterialEventMap> implements IMaterial<TE> {\n    declare ['constructor']: typeof ShaderMaterial2\n\n    static readonly TypeSlug = 'shaderMat'\n    static readonly TYPE = 'ShaderMaterial2'\n    // static readonly TypeAlias = ['shader', ShaderMaterial2.TYPE, ShaderMaterial2.TypeSlug, 'ShaderMaterial', 'RawShaderMaterial']\n    // static {\n    //     ThreeSerialization.SerializableMaterials.add(ShaderMaterial2)\n    // }\n\n    static readonly MaterialProperties = {\n        ...threeMaterialPropList,\n        fragmentShader: '',\n        vertexShader: '',\n        uniforms: {},\n        defines: {},\n        extensions: {},\n        isRawShaderMaterial: false,\n        uniformsGroups: {},\n        wireframe: false,\n        wireframeLinewidth: 1,\n        clipping: false,\n        lights: false,\n        fog: false,\n        glslVersion: null,\n        defaultAttributeValues: {},\n    }\n\n    static readonly InterpolateProperties = [\n        ...threeMaterialInterpolateProps,\n        'wireframeLinewidth',\n    ]\n\n    assetType = 'material' as const\n\n    declare userData: IMaterialUserData\n\n    public readonly isAShaderMaterial = true\n\n    readonly appliedMeshes: Set<any> = new Set()\n    readonly setDirty = iMaterialCommons.setDirty\n    dispose(): this {return iMaterialCommons.dispose(super.dispose).call(this)}\n    clone(track = false): this {return iMaterialCommons.clone(super.clone).call(this, track)}\n\n    readonly isRawShaderMaterial: boolean\n\n    type: 'ShaderMaterial' | 'RawShaderMaterial' = 'ShaderMaterial'\n\n    constructor({customMaterialExtensions, ...parameters}: ShaderMaterialParameters & IMaterialParameters = {}, isRawShaderMaterial = false) {\n        super()\n        this.isRawShaderMaterial = isRawShaderMaterial\n        if (isRawShaderMaterial) {\n            this.type = 'RawShaderMaterial'\n        }\n        if (customMaterialExtensions) this.registerMaterialExtensions(customMaterialExtensions)\n        iMaterialCommons.upgradeMaterial.call(this)\n        this.setValues(parameters)\n    }\n\n    // region Material Extension\n\n    materialExtensions: MaterialExtension[] = []\n    extraUniformsToUpload: Record<string, IUniform> = {}\n    registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + iMaterialCommons.customProgramCacheKey.call(this)\n    }\n\n    onBeforeCompile(shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void { // shader is not Shader but WebglUniforms.getParameters return value type so includes defines\n        iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n        super.onBeforeCompile(shader, renderer)\n    }\n\n    onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group): void {\n        super.onBeforeRender(renderer, scene, camera, geometry, object, group)\n        iMaterialCommons.onBeforeRender.call(this, renderer, scene, camera, geometry, object, group)\n    }\n\n    onAfterRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group): void {\n        super.onAfterRender(renderer, scene, camera, geometry, object, group)\n        iMaterialCommons.onAfterRender.call(this, renderer, scene, camera, geometry, object, group)\n    }\n\n    // endregion\n\n    /**\n     * Sets the values of this material based on the values of the passed material or an object with material properties\n     * The input is expected to be a valid material or a deserialized material parameters object(including the deserialized userdata)\n     * @param parameters - material or material parameters object\n     */\n    setValues(parameters: Material|(ShaderMaterialParameters)): this {\n        return iMaterialCommons.setValues(super.setValues).call(this, parameters)\n    }\n\n    toJSON(_?: any): any { // todo make abstract?\n        throw new Error('Method not supported for this material.')\n    }\n    fromJSON(_: any, _2?: any): this | null { // todo make abstract?\n        throw new Error('Method not supported for this material.')\n    }\n\n    /**\n     * @deprecated use this directly\n     */\n    get materialObject() {\n        return this\n    }\n}\n","import type {ICamera, IMaterial, IMaterialParameters, IObject3D, PhysicalMaterial} from '../../core'\nimport {\n    BufferGeometry,\n    Camera,\n    DoubleSide,\n    GLSL1,\n    GLSL3, Group,\n    NormalMapTypes,\n    Object3D,\n    Scene,\n    ShaderMaterialParameters,\n    TangentSpaceNormalMap,\n    Texture,\n    UniformsLib,\n    UniformsUtils,\n    Vector2,\n    Vector4,\n    WebGLRenderer,\n} from 'three'\nimport GBufferMatVert from './shaders/GBufferPlugin.mat.vert.glsl'\nimport GBufferMatFrag from './shaders/GBufferPlugin.mat.frag.glsl'\nimport {updateMaterialDefines} from '../../materials'\nimport {ShaderMaterial2} from '../../core/material/ShaderMaterial2'\n\nexport interface GBufferUpdaterContext {\n    material: IMaterial, renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D\n}\nexport interface GBufferUpdater {\n    updateGBufferFlags: (data: Vector4, context: GBufferUpdaterContext) => void\n}\n\n/**\n * Renders DepthNormal to a texture and flags to another\n */\nexport class GBufferMaterial extends ShaderMaterial2 {\n\n    constructor(multipleRT = true, parameters?: ShaderMaterialParameters & IMaterialParameters) {\n        super({\n            vertexShader: GBufferMatVert,\n            fragmentShader: GBufferMatFrag,\n            uniforms: UniformsUtils.merge([\n                UniformsLib.common,\n                UniformsLib.bumpmap,\n                UniformsLib.normalmap,\n                UniformsLib.displacementmap,\n                {\n                    cameraNearFar: {value: new Vector2(0.1, 1000)}, // this has to be set from outside\n                    flags: {value: new Vector4(255, 255, 255, 255)},\n                },\n            ]),\n            defines: {\n                // eslint-disable-next-line @typescript-eslint/naming-convention\n                IS_GLSL3: multipleRT ? '1' : '0',\n            },\n            glslVersion: multipleRT ? GLSL3 : GLSL1,\n            ...parameters,\n        })\n        this.reset()\n    }\n\n    flagUpdaters: Map<string, GBufferUpdater['updateGBufferFlags']> = new Map()\n    normalMapType: NormalMapTypes = TangentSpaceNormalMap\n    flatShading = false\n\n    onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group) {\n        super.onBeforeRender(renderer, scene, camera, geometry, object, group)\n\n        let isOverridden = false\n\n        let material = (object as any).material as IMaterial & Partial<PhysicalMaterial>\n        if (Array.isArray(material)) { // todo: add support for multi materials.\n            material = material[0]\n        }\n        if (material === this as any) {\n            material = (object as IObject3D).currentMaterial as IMaterial & Partial<PhysicalMaterial>\n            isOverridden = true\n        }\n        if (Array.isArray(material)) { // todo: add support for multi materials.\n            material = material[0]\n        }\n        if (!material) return\n\n        if (isOverridden) {\n            updateMaterialDefines({\n                ['FORCED_LINEAR_DEPTH']: material.userData.forcedLinearDepth ?? undefined, // todo add to DepthBufferPlugin as well.\n            }, this)\n\n        } else {\n            const setMap = (key: keyof IMaterial) => {\n                const map = material[key]\n                if (!map) return\n                this.uniforms[key].value = map\n                if (!this.uniforms[key + 'Transform']) console.error('GBufferMaterial: ' + key + 'Transform is not defined in uniform')\n                else {\n                    if ((map as Texture).isTexture)\n                        renderer.materials.refreshTransformUniform((map as Texture), this.uniforms[key + 'Transform'])\n                }\n            }\n\n            setMap('map')\n\n            if (material.side !== undefined) this.side = material.side ?? DoubleSide\n            setMap('alphaMap')\n            if (material.alphaTest !== undefined) this.alphaTest = material.alphaTest < 1e-4 ? 1e-4 : material.alphaTest\n            if (material.alphaHash !== undefined) this.alphaHash = material.alphaHash\n\n            setMap('bumpMap')\n            if (material.bumpScale !== undefined) this.uniforms.bumpScale.value = material.bumpScale\n\n            setMap('normalMap')\n            if (material.normalScale !== undefined) this.uniforms.normalScale.value.copy(material.normalScale)\n            if (material.normalMapType !== undefined) this.normalMapType = material.normalMapType\n            if (material.flatShading !== undefined) this.flatShading = material.flatShading\n\n            setMap('displacementMap')\n            if (material.displacementScale !== undefined) this.uniforms.displacementScale.value = material.displacementScale\n            if (material.displacementBias !== undefined) this.uniforms.displacementBias.value = material.displacementBias\n\n            if (material.wireframe !== undefined) this.wireframe = material.wireframe\n            if (material.wireframeLinewidth !== undefined) this.wireframeLinewidth = material.wireframeLinewidth\n\n            updateMaterialDefines({\n                // ['USE_ALPHAMAP']: this.uniforms.alphaMap.value ? 1 : undefined,\n                ['ALPHAMAP_UV']: this.uniforms.alphaMap.value ? 'uv' : undefined, // todo use getChannel, see WebGLPrograms.js\n                ['USE_DISPLACEMENTMAP']: this.uniforms.displacementMap.value ? 1 : undefined,\n                ['DISPLACEMENTMAP_UV']: this.uniforms.displacementMap.value ? 'uv' : undefined, // todo use getChannel, see WebGLPrograms.js\n                ['ALPHA_I_RGBA_PACKING']: material.userData.ALPHA_I_RGBA_PACKING ? 1 : undefined,\n                ['FORCED_LINEAR_DEPTH']: material.userData.forcedLinearDepth ?? undefined, // todo add to DepthBufferPlugin as well.\n            }, this)\n        }\n\n        const flags = this.uniforms.flags.value\n        this._updateFlagsUniform(flags, material, renderer, scene, camera, geometry, object)\n\n        ;(camera as ICamera).updateShaderProperties(this) // for cameraNearFar\n\n        this.uniformsNeedUpdate = true\n\n        // todo: do the same in DepthBufferPlugin and NormalBufferPlugin\n        // what about the material extension settings in the userData of the source materials?\n        // wont this be very expensive? todo we should expect devs to expose their own gbuffer material instance if they want to use some extension\n        if (material.materialExtensions?.length) {\n            this.registerMaterialExtensions(material.materialExtensions)\n        }\n\n        // this.transparent = true\n        this.needsUpdate = true\n        // @ts-expect-error todo add to type\n        renderer.resetCurrentMaterial && renderer.resetCurrentMaterial()\n\n    }\n\n    protected _updateFlagsUniform(flags: Vector4, material: IMaterial & Partial<PhysicalMaterial>, renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D) {\n        /*\n         GBuffer Flags has the following data\n         1st Rendertarget has Depth and Normal buffers\n         2nd Render Target::\n          x : Empty\n          y : first 3 bits lut index, second 5 bits bevel radius\n          z : material id (userData.gBufferData?.materialId, userData.matId)\n          w : this field is for setting bits - lutEnable-0, tonemap-1, bloom-2, ssao(cast)-3, dof-4, diamondMask-5\n        */\n\n        flags.set(255, 255, 255, 255)\n\n        const materialId = material.userData.gBufferData?.materialId ?? material.userData.matId // matId for backward compatibility\n        flags.z = materialId || 0\n\n        this.flagUpdaters.forEach((updater) => updater(flags, {\n            material,\n            renderer,\n            scene,\n            camera,\n            geometry,\n            object,\n        }))\n\n        flags.x /= 255\n        flags.y /= 255\n        flags.z /= 255\n        flags.w /= 255\n    }\n\n    onAfterRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group) {\n        super.onAfterRender(renderer, scene, camera, geometry, object, group)\n\n        let material = (object as any).material as IMaterial & Partial<PhysicalMaterial>\n        if (Array.isArray(material)) { // todo: add support for multi materials.\n            material = material[0]\n        }\n        if (!material || material === this as any) return\n\n        if (material.materialExtensions?.length) {\n            this.unregisterMaterialExtensions(material.materialExtensions)\n        }\n\n        this.reset()\n    }\n\n    reset() {\n        this.uniforms.map.value = null\n        this.side = DoubleSide\n        this.uniforms.alphaMap.value = null\n        this.alphaTest = 0.001\n        this.alphaHash = false\n\n        this.uniforms.bumpMap.value = null\n        this.uniforms.bumpScale.value = 1\n\n        this.uniforms.normalMap.value = null\n        this.uniforms.normalScale.value.set(1, 1)\n        this.normalMapType = TangentSpaceNormalMap\n        this.flatShading = false\n\n        this.uniforms.displacementMap.value = null\n        this.uniforms.displacementScale.value = 1\n        this.uniforms.displacementBias.value = 0\n\n        this.uniforms.flags.value.set(255, 255, 255, 255)\n\n        this.wireframe = false\n        this.wireframeLinewidth = 1\n    }\n}\n\n\n/**\n * @deprecated use GBufferMaterial instead\n */\nexport class DepthNormalMaterial extends GBufferMaterial {\n    constructor(multipleRT: boolean, parameters?: ShaderMaterialParameters & IMaterialParameters) {\n        super(multipleRT, parameters)\n        console.warn('DepthNormalMaterial is deprecated, use GBufferMaterial instead')\n    }\n}\n","import {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {IObject3D, LineMaterial2} from '../core'\nimport {GBufferMaterial} from '../plugins/pipeline/GBufferMaterial'\nimport {Material, MeshDepthMaterial, NoBlending, RGBADepthPacking} from 'three'\nimport {shaderReplaceString} from './shader-helpers'\n\n// todo this should be set in the gbuffer plugin\nexport function createLineGBufferMaterial(object: LineSegments2 & IObject3D, lineDepthMaterial: Material = new GBufferMaterial(true, {\n    blending: NoBlending, transparent: false,\n})) {\n    lineDepthMaterial.onBeforeCompile = (shader) => {\n        if ((shader as any).__modified) return\n        ;(shader as any).__modified = true\n        let lineMaterial = object.material as LineMaterial2\n        if (lineMaterial === lineDepthMaterial as any)\n            lineMaterial = object.currentMaterial as LineMaterial2\n        if (!lineMaterial.isLineMaterial) return\n        shader.uniforms = {\n            ...lineMaterial.uniforms,\n            ...shader.uniforms,\n        }\n        const parsFrag = shader.fragmentShader.split('void main()')[0].split('#glMarker importsEnd')[1] || ''\n        const mainFrag = '\\nvec3 normal = vec3(0.,0.,1.);\\n' + shader.fragmentShader.split('#glMarker beforeOutput')[1]\n        shader.fragmentShader = shaderReplaceString(lineMaterial.fragmentShader, 'void main()', parsFrag + '\\n', {prepend: true})\n        shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#include <logdepthbuf_fragment>', mainFrag + '\\n//end-frag-patch\\n', {append: true})\n        shader.fragmentShader = shader.fragmentShader.split('//end-frag-patch')[0]\n\n        const parsVert = shader.vertexShader.split('void main()')[0].split('#glMarker importsEnd')[1] || ''\n        const mainVert = shader.vertexShader.split('#glMarker beforeOutput')[1].replace(/}\\s*$/, '') + '\\n' // remove last }\n        shader.vertexShader = shaderReplaceString(lineMaterial.vertexShader, 'void main()', parsVert, {prepend: true})\n        shader.vertexShader = shaderReplaceString(shader.vertexShader, '#include <clipping_planes_vertex>', mainVert, {append: true})\n    }\n    return lineDepthMaterial\n}\n\nexport function createLineDepthMaterial(object: LineSegments2 & IObject3D, lineDepthMaterial: Material = new MeshDepthMaterial({\n    depthPacking: RGBADepthPacking, // this is required for three.js shadows\n    blending: NoBlending,\n    transparent: false,\n})) {\n    lineDepthMaterial.onBeforeCompile = (shader) => {\n        if ((shader as any).__modified) return\n        ;(shader as any).__modified = true\n        let lineMaterial = object.material as LineMaterial2\n        if (lineMaterial === lineDepthMaterial as any)\n            lineMaterial = object.currentMaterial as LineMaterial2\n        if (!lineMaterial.isLineMaterial) return\n        shader.uniforms = {\n            ...lineMaterial.uniforms,\n            ...shader.uniforms,\n        }\n        shader.defines = {\n            ...lineMaterial.defines,\n            ...shader.defines,\n        }\n        const parsFrag = '\\nvarying vec2 vHighPrecisionZW;\\n#include <packing>\\n'\n        const mainFrag = shader.fragmentShader.split('#include <logdepthbuf_fragment>')[1]\n        shader.fragmentShader = shaderReplaceString(lineMaterial.fragmentShader, 'void main()', parsFrag, {prepend: true})\n        shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#include <logdepthbuf_fragment>', mainFrag + '\\n//end-frag-patch\\n', {append: true})\n        shader.fragmentShader = shader.fragmentShader.split('//end-frag-patch')[0]\n\n        const parsVert = '\\nvarying vec2 vHighPrecisionZW;\\n'\n        const mainVert = '\\nvHighPrecisionZW = gl_Position.zw;\\n'\n        shader.vertexShader = shaderReplaceString(lineMaterial.vertexShader, 'void main()', parsVert, {prepend: true})\n        shader.vertexShader = shaderReplaceString(shader.vertexShader, '#include <clipping_planes_vertex>', mainVert, {append: true})\n    }\n    return lineDepthMaterial\n}\n","import {Event, Matrix4, Mesh, Vector3} from 'three'\nimport {IMaterial} from '../IMaterial'\nimport {IEvent, objectHasOwn} from 'ts-browser-helpers'\nimport {IObject3D, IObject3DEventMap, IObjectSetDirtyOptions} from '../IObject'\nimport {copyObject3DUserData} from '../../utils/serialization'\nimport {getPropDesc} from '../../utils/browser-helpers'\nimport {IGeometry, IGeometryEventMap} from '../IGeometry'\nimport {Box3B, checkTexMapReference} from '../../three'\nimport {incrementObjectCloneName, makeIObject3DUiConfig} from './IObjectUi'\nimport {iGeometryCommons} from '../geometry/iGeometryCommons'\nimport {iMaterialCommons} from '../material/iMaterialCommons'\nimport {ILight} from '../light/ILight'\nimport {ITexture} from '../ITexture'\nimport {createLineDepthMaterial, createLineGBufferMaterial} from '../../utils/line-material'\nimport {ThreeViewer} from '../../viewer'\n\nexport const iObjectCommons = {\n    setDirty: function(this: IObject3D, options?: IObjectSetDirtyOptions, ...args: any[]): void {\n        if (typeof options === 'string') { // just incase called by decorators\n            options = {change: options}\n        }\n        this.dispatchEvent({bubbleToParent: this.userData?.autoUpdateParent ?? true, object: this, ...options, type: 'objectUpdate', args}) // this sets sceneUpdate in root scene\n        if (options?.refreshUi !== false && options?.last !== false && this.refreshUi) this.refreshUi()\n        // console.log('object update')\n    },\n\n    upgradeObject3D: upgradeObject3D,\n    makeUiConfig: makeIObject3DUiConfig,\n\n    autoCenter: function<T extends IObject3D>(this: T, setDirty = true, undo = false): T {\n        // todo use bounding sphere?\n        if (undo) {\n            if (!this.userData.autoCentered || !this.userData._lastCenter) return this\n            if (!isFinite(this.userData._lastCenter.lengthSq())) return this\n            this.position.add(this.userData._lastCenter)\n            delete this.userData.autoCentered\n            delete this.userData.isCentered\n            delete this.userData._lastCenter\n        } else {\n            const bb = new Box3B().expandByObject(this, true, true)\n            const center = bb.getCenter(new Vector3())\n            if (!isFinite(center.lengthSq())) return this\n            this.userData._lastCenter = center/* .clone()*/\n            this.position.sub(center)\n            this.userData.autoCentered = true\n            this.userData.isCentered = true\n        }\n        this.updateMatrix()\n        if (setDirty) this.setDirty && this.setDirty({change: 'autoCenter', undo})\n        return this\n    },\n\n    autoScale: function<T extends IObject3D>(this: T, autoScaleRadius?: number, isCentered?: boolean, setDirty = true, undo = false): T {\n        let scale = 1\n        if (undo) { // Note - undo only works for quick undo, not for multiple times\n            if (!this.userData.autoScaled || !this.userData._lastScaleRadius) return this\n            const rad = this.userData.autoScaleRadius || autoScaleRadius || 1\n            scale = this.userData._lastScaleRadius / rad\n            if (!isFinite(scale)) return this // NaN when radius is 0\n            this.userData.autoScaled = true\n            this.userData.autoScaleRadius = autoScaleRadius\n            delete this.userData._lastScaleRadius\n        } else {\n            const bbox = new Box3B().expandByObject(this, true, true)\n            const radius = bbox.getSize(new Vector3()).length() * 0.5\n            if (autoScaleRadius === undefined) {\n                autoScaleRadius = this.userData.autoScaleRadius || 1\n            }\n            scale = autoScaleRadius / radius\n            if (!isFinite(scale)) return this // NaN when radius is 0\n            this.userData.autoScaled = true\n            this.userData.autoScaleRadius = autoScaleRadius\n            this.userData._lastScaleRadius = radius\n        }\n\n        if (this.userData.pseudoCentered) {\n            this.children.forEach(child => {\n                child.scale.multiplyScalar(scale)\n            })\n        } else\n            this.scale.multiplyScalar(scale)\n        if (isCentered || this.userData.isCentered) this.position.multiplyScalar(scale)\n\n        this.traverse((obj) => {\n            const l = obj as any\n            if (l.isLight && l.shadow?.camera?.right) {\n                l.shadow.camera.right *= scale\n                l.shadow.camera.left *= scale\n                l.shadow.camera.top *= scale\n                l.shadow.camera.bottom *= scale\n                obj.setDirty && obj.setDirty()\n            }\n            if (l.isCamera && l.right) {\n                l.right *= scale\n                l.left *= scale\n                l.top *= scale\n                l.bottom *= scale\n                obj.setDirty && obj.setDirty()\n            }\n        })\n\n        if (setDirty) this.setDirty && this.setDirty({change: 'autoScale', undo})\n\n        return this\n    },\n\n    pivotToBoundsCenter: function<T extends IObject3D>(this: T, setDirty = true): ()=>void {\n        const bb = new Box3B().expandByObject(this, true, true)\n        const center = bb.getCenter(new Vector3())\n        return iObjectCommons.pivotToPoint.call(this, center, setDirty)\n    },\n\n    pivotToPoint: function<T extends IObject3D>(this: T, point: Vector3, setDirty = true, compensateSharedGeometry = true): ()=>void {\n        const worldCenter = new Vector3().copy(point)\n        const localCenter = new Vector3().copy(worldCenter)\n\n        const worldMatrixInv = new Matrix4().copy(this.matrixWorld).invert()\n        const m = this.parent?.matrixWorld\n        const parentWorldMatrixInv = new Matrix4()\n        if (m !== undefined)\n            parentWorldMatrixInv.copy(m).invert()\n\n        // Get the center with respect to the parent\n        worldCenter.applyMatrix4(parentWorldMatrixInv)\n        const lastPosition = this.position.clone()\n\n        // Apply the new position\n        this.position.copy(worldCenter)\n\n        // local center\n        localCenter.applyMatrix4(worldMatrixInv).negate()\n\n        // Shift the geometry and compensate other meshes sharing it\n        const otherMeshPositions = new Map<IObject3D, Vector3>()\n        if (this.geometry) {\n            // Adjust positions of other meshes using the same geometry so they stay in place\n            const appliedMeshes = compensateSharedGeometry ? this.geometry.appliedMeshes as Set<IObject3D> | undefined : undefined\n            if (appliedMeshes) {\n                for (const mesh of appliedMeshes) {\n                    if (mesh === this) continue\n                    otherMeshPositions.set(mesh, mesh.position.clone())\n                    mesh.updateMatrix()\n                    const offset = new Vector3(-localCenter.x, -localCenter.y, -localCenter.z).applyMatrix4(mesh.matrix)\n                    mesh.position.copy(offset)\n                    if (setDirty) mesh.setDirty && mesh.setDirty({change: 'pivotToPoint'})\n                }\n            }\n            this.geometry.translate(localCenter.x, localCenter.y, localCenter.z)\n        }\n        // Add offsets to children\n        this.children.forEach((object)=> {\n            object.position.add(localCenter)\n        })\n        if (setDirty) this.setDirty && this.setDirty({change: 'pivotToPoint', undo: false})\n\n        return ()=>{\n            // undo\n            this.position.copy(lastPosition)\n            if (this.geometry) {\n                this.geometry.translate(-localCenter.x, -localCenter.y, -localCenter.z)\n                // Restore other meshes' positions\n                for (const [mesh, pos] of otherMeshPositions) {\n                    mesh.position.copy(pos)\n                    if (setDirty) mesh.setDirty && mesh.setDirty({change: 'pivotToPoint'})\n                }\n            }\n            this.children.forEach((object)=> {\n                object.position.sub(localCenter)\n            })\n            if (setDirty) this.setDirty && this.setDirty({change: 'pivotToPoint', undo: true})\n        }\n    },\n\n    traverseModels: function<T extends IObject3D>(this: T, callback: (object: IObject3D) => boolean|void, {\n        visible = false,\n        widgets = false,\n        ...ops\n    }): void {\n        if (!this.assetType) return\n        if (!widgets && this.assetType === 'widget') return\n        if (visible && !this.visible) return\n\n        const res = callback(this)\n        if (res === false) return\n\n        const children = this.children\n\n        for (let i = 0, l = children.length; i < l; i++) {\n            const child = children[ i ]\n            if (!child.assetType || !child.traverseModels) continue\n            child.traverseModels(callback, {visible, widgets, ...ops})\n        }\n    },\n\n    eventCallbacks: {\n        onAddedToParent: function(this: IObject3D, e: Event): void {\n            // added to some parent\n            // console.warn('added to parent', this, this.parent, this.objectProcessor, this.parent?.parentRoot ?? this.parent, (this.parent?.parentRoot ?? this.parent)?.objectProcessor)\n            const root = this.parent?.parentRoot ?? this.parent\n            if (root !== this.parentRoot) {\n                this.traverse(o=>{\n                    const old = o.parentRoot\n                    if (old === root) return\n                    o.parentRoot = root\n                    o.dispatchEvent({...e, type: 'parentRootChanged', object: o, oldParentRoot: old || undefined, bubbleToParent: false})\n                })\n            }\n            if (!this.objectProcessor && root?.objectProcessor) { // this is added so that when an upgraded(not processed) object is added to the scene, it will be processed by the scene processor\n                this.traverse(o=>{\n                    o.objectProcessor = root.objectProcessor\n                    o.objectProcessor?.processObject(o)\n                })\n            }\n            this.setDirty?.({...e, change: 'addedToParent'})\n        },\n        onRemovedFromParent: function(this: IObject3D, e: Event): void {\n            // removed from some parent\n            this.setDirty?.({...e, change: 'removedFromParent'})\n            if (this.parentRoot) {\n                this.traverse(o=>{\n                    const old = o.parentRoot\n                    if (!old) return\n                    o.parentRoot = undefined\n                    o.dispatchEvent({...e, type: 'parentRootChanged', object: o, oldParentRoot: old || undefined, bubbleToParent: false})\n                })\n            }\n        },\n        onGeometryUpdate: function(this: IObject3D, e: IGeometryEventMap['geometryUpdate']&Event<'geometryUpdate'>): void {\n            if (!e.bubbleToObject) return\n            this.dispatchEvent({bubbleToParent: true, ...e, object: this, geometry: e.geometry})\n        },\n    },\n\n    initMaterial: function(this: IObject3D): void {\n        if (objectHasOwn(this, '_currentMaterial')) return\n        this._currentMaterial = null\n\n        const {protoDesc} = getPropDesc(this, 'material')\n        const currentMaterial = this.material\n        delete this.material\n        Object.defineProperty(this, 'currentMaterial', {\n            configurable: true,\n            enumerable: true,\n            get() {\n                return protoDesc?.get ? protoDesc.get.call(this) : iObjectCommons.getMaterial.call(this)\n            },\n            set(val) {\n                iObjectCommons.setMaterial.call(this, val) // this has to be first\n                protoDesc?.set?.call(this, val)\n            },\n        })\n        Object.defineProperty(this, 'material', {\n            configurable: true,\n            enumerable: true,\n            get() {\n                return this.forcedOverrideMaterial ?? this.currentMaterial\n            },\n            set(val) {\n                if (this.forcedOverrideMaterial) console.warn('IObject3D: Material is being set on an object with forcedOverrideMaterial set')\n                this.currentMaterial = val\n            },\n        })\n        Object.defineProperty(this, 'materials', {\n            configurable: true,\n            enumerable: true,\n            get: iObjectCommons.getMaterials,\n            set: iObjectCommons.setMaterials,\n        })\n        // this is called initially in Material manager from process model below, not required here...\n        // todo: shouldnt be called from there. maybe check if material is upgraded before\n        // if (currentMaterial && !Array.isArray(currentMaterial) && !currentMaterial.assetType) {\n        //     console.error('todo: initMaterial: material not upgraded')\n        // }\n        this.material = currentMaterial\n\n\n        if (this.isLineSegments2 || this.isLine2 || this.isWireframe) {\n            // setup depth, normal, gbuffer\n            Object.defineProperty(this, 'customDepthMaterial', {\n                configurable: true,\n                enumerable: true,\n                get: () => {\n                    if (this._customDepthMaterial) return this._customDepthMaterial\n                    this._customDepthMaterial = createLineDepthMaterial(this as any)\n                    return this._customDepthMaterial\n                },\n                set: (val) => {\n                    this._customDepthMaterial = val\n                    if (val) val.needsUpdate = true\n                    this.setDirty && this.setDirty({change: 'customDepthMaterial'})\n                },\n            })\n            Object.defineProperty(this, 'customGBufferMaterial', {\n                configurable: true,\n                enumerable: true,\n                get: () => {\n                    if (this._customGBufferMaterial) return this._customGBufferMaterial\n                    this._customGBufferMaterial = createLineGBufferMaterial(this as any)\n                    return this._customGBufferMaterial\n                },\n                set: (val) => {\n                    this._customGBufferMaterial = val\n                    if (val) val.needsUpdate = true\n                    this.setDirty && this.setDirty({change: 'customDepthMaterial'})\n                },\n            })\n            // todo createNormalMaterial\n        }\n\n\n        // Legacy\n        if (!(this as any).setMaterial) {\n            (this as any).setMaterial = (m: IMaterial | IMaterial[]| undefined)=>{\n                const mats = this.material\n                console.error('IObject3D: setMaterial is deprecated, use material property directly')\n                this.material = m\n                return mats\n            }\n        }\n        // Legacy\n        // if (this.userData.setMaterial) console.error('userData.setMaterial already defined')\n        // this.userData.setMaterial = (m: any)=>{\n        //     console.error('userData.setMaterial is deprecated, use setMaterial directly')\n        //     this.material = m\n        // }\n\n    },\n\n    getMaterial: function(this: IObject3D): IMaterial | IMaterial[] | undefined {\n        return this._currentMaterial || undefined\n    },\n    getMaterials: function(this: IObject3D): IMaterial[] {\n        const current = this.currentMaterial\n        return !current ? [] : Array.isArray(current) ? [...current] : [current]\n    },\n\n    setMaterial: function(this: IObject3D, material: IMaterial | IMaterial[] | undefined) {\n        const imats = (Array.isArray(material) ? material : [material]).filter(v=>v)\n        if (this.material == imats || imats.length === 1 && this.material === imats[0]) return []\n        // todo: check by uuid?\n\n        // Remove old material listeners\n        const oldMats = this.material\n        const mats = Array.isArray(oldMats) ? [...oldMats] : [oldMats!]\n\n        let removed = []\n        const added = []\n\n        for (const mat of mats) {\n            if (!mat) continue\n            removed.push(mat)\n            // if (mat.appliedMeshes) {\n            //     mat.appliedMeshes.delete(this)\n            //     // if (mat.userData && mat.appliedMeshes?.size === 0 && mat.userData.disposeOnIdle !== false)\n            //     mat.dispose(false) // this will dispose textures(if they are idle) if the material is registered in the material manager\n            // }\n        }\n\n        const materials = []\n        for (const mat of imats) {\n            // const mat = material?.materialObject\n            if (!mat) continue\n            if (!mat.assetType) {\n                // console.warn('Upgrading Material', mat)\n                iMaterialCommons.upgradeMaterial.call(mat)\n            }\n            if (removed.includes(mat)) removed = removed.filter(m=>m !== mat)\n            else added.push(mat)\n            materials.push(mat)\n            // if (mat && mat.appliedMeshes) {\n            //     mat.appliedMeshes.add(this)\n            // }\n        }\n\n        // todo should these be before or after `materialChanged` event? right now its before, also .material will return the old one since _currentMaterial is old\n        for (const mat of removed) {\n            mat.dispatchEvent({type: 'removeFromMesh', object: this})\n        }\n        for (const mat of added) {\n            mat.dispatchEvent({type: 'addToMesh', object: this})\n            // note - material bubbleToObject is handled in dispatchEvent override in iMaterialCommons\n        }\n\n        this._currentMaterial = !materials.length ? null : materials.length !== 1 ? materials : materials[0] || null\n\n        this.dispatchEvent({type: 'materialChanged', material: this._currentMaterial ?? null, oldMaterial: oldMats ?? null, object: this, bubbleToParent: true})\n        this.refreshUi && this.refreshUi()\n    },\n    setMaterials: function(this: IObject3D, materials: IMaterial[]) {\n        this.currentMaterial = materials || undefined\n    },\n\n    initGeometry: function(this: IObject3D): void {\n        this._currentGeometry = null\n        const {protoDesc} = getPropDesc(this, 'geometry')\n        const currentGeometry = this.geometry\n        delete this.geometry\n        Object.defineProperty(this, 'geometry', {\n            configurable: true,\n            enumerable: true,\n            get() {\n                return this.forcedOverrideGeometry ?? (protoDesc?.get ? protoDesc.get.call(this) : iObjectCommons.getGeometry.call(this))\n            },\n            set(val) {\n                if (this.forcedOverrideGeometry) console.warn('IObject3D: Geometry is being set on an object with forcedOverrideGeometry set')\n                iObjectCommons.setGeometry.call(this, val) // this has to be first\n                protoDesc?.set?.call(this, val)\n            },\n        })\n        this.geometry = currentGeometry\n\n        // Legacy\n        if (!(this as any).setGeometry) {\n            (this as any).setGeometry = (geometry: IGeometry) =>{\n                const geom = this.geometry\n                console.error('IObject3D: setGeometry is deprecated, use geometry property directly')\n                this.geometry = geometry\n                return geom\n            }\n        }\n        // Legacy\n        // if (this.userData.setGeometry) console.error('userData.setGeometry already defined')\n        // this.userData.setGeometry = (g: any)=>{\n        //     console.error('userData.setGeometry is deprecated, use setGeometry directly')\n        //     this.geometry = g\n        // }\n\n    },\n    getGeometry: function(this: IObject3D&Mesh): IGeometry | undefined {\n        return this._currentGeometry || undefined\n    },\n    setGeometry: function(this: IObject3D&Mesh, geometry: IGeometry | undefined): void {\n        const geom = this.geometry || undefined\n        // todo: check by uuid?\n        if (geom === geometry) return\n        if (geom) {\n            this._onGeometryUpdate && geom.removeEventListener('geometryUpdate', this._onGeometryUpdate)\n        }\n        if (geometry) {\n            if (!geometry.assetType) {\n                // console.error('Geometry not upgraded')\n                iGeometryCommons.upgradeGeometry.call(geometry)\n            }\n        }\n        this._currentGeometry = geometry || null\n        if (geometry) {\n            this._onGeometryUpdate && geometry.addEventListener('geometryUpdate', this._onGeometryUpdate)\n        }\n        this.dispatchEvent({type: 'geometryChanged', geometry: geometry ?? null, oldGeometry: geom, bubbleToParent: true, object: this})\n        this.refreshUi && this.refreshUi()\n\n    },\n\n    refreshUi: function(this: IObject3D): void {\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    },\n\n    /** @ignore */\n    dispatchEvent: (superDispatch: IObject3D['dispatchEvent']): IObject3D['dispatchEvent'] =>\n        function(this: IObject3D, event): void {\n            if ((event as IEvent<any>).target && (event as IEvent<any>).target !== this && this.acceptChildEvents === false) return\n            if ((event as IObject3DEventMap['objectUpdate']).bubbleToParent || this.userData?.__autoBubbleToParentEvents?.includes(event.type)) {\n                // console.log('parent dispatch', e, this.parentRoot, this.parent)\n                const pRoot = this.parentRoot || this.parent\n                if (this.parentRoot !== this) pRoot?.dispatchEvent(event)\n            }\n            superDispatch.call(this, event)\n        },\n    /** @ignore */\n    clone: (superClone: IObject3D['clone']): IObject3D['clone'] =>\n        function(this: IObject3D, recursive: boolean, ...rest): IObject3D {\n            const userData = this.userData\n            this.userData = {} // super calls JSON.stringify\n            const clone: IObject3D = superClone.call(this, recursive, ...rest)\n            this.userData = userData\n            copyObject3DUserData(clone.userData, userData) // this will deep copy/clone todo: do same for this.toJSON()\n            iObjectCommons.upgradeObject3D.call(clone)\n            clone.userData.cloneParent = this.uuid // todo should this be serialized? add to userdata types?\n            if (this._sChildren) {\n                if (recursive) {\n                    clone._sChildren = []\n                    for (const c of this._sChildren) {\n                        if (!c) continue\n                        let cClone\n                        if (this.children.includes(c as any)) {\n                            const ind = this.children.indexOf(c as any)\n                            cClone = clone.children[ind] as IObject3D\n                        } else\n                            cClone = c.clone(true) as IObject3D\n                        clone._sChildren.push(cClone)\n                    }\n                } else {\n                    clone._sChildren = [...this._sChildren]\n                }\n            }\n            return clone\n        },\n    /** @ignore */\n    copy: (superCopy: IObject3D['copy']): IObject3D['copy'] =>\n        function(this: IObject3D, source: IObject3D, ...args): IObject3D {\n            const lightTarget = this.isLight ? (this as ILight).target : null\n\n            const userData = source.userData\n            source.userData = {}\n\n            const selfUserData = this.userData\n            superCopy.call(this, source, ...args)\n            this.userData = selfUserData\n\n            source.userData = userData\n            copyObject3DUserData(this.userData, source.userData) // todo: do same for object.toJSON()\n\n            if (lightTarget && (this as ILight).target) { // For eg DirectionalLight2\n                lightTarget.position.copy((this as ILight).target!.position)\n                lightTarget.updateMatrixWorld()\n                ;(this as ILight).target = lightTarget // because t is a child and because of UI.\n            }\n\n            return this\n        },\n    /** @ignore */\n    add: (superAdd: IObject3D['add']): IObject3D['add'] =>\n        function(this: IObject3D, ...args): IObject3D {\n            if (this.autoUpgradeChildren !== false) {\n                for (const a of args) {\n                    iObjectCommons.upgradeObject3D.call(a)\n                }\n            }\n            return superAdd.call(this, ...args)\n        },\n    /** @ignore */\n    dispose: (superDispose?: IObject3D['dispose']) =>\n        function(this: IObject3D, removeFromParent = true): any {\n            if (removeFromParent && this.parent) {\n                this.removeFromParent()\n                delete this.parentRoot\n            }\n\n            this.dispatchEvent({type: 'dispose', bubbleToParent: false})\n\n            // if (this.__disposed) {\n            //     console.warn('Object already disposed', this)\n            //     return\n            // }\n            // this.__disposed = true\n\n            for (const c of [...this.children]) c?.dispose && c.dispose(false) // not removing the children from parent to preserve hierarchy\n            // this.children = []\n\n            // this.uiConfig?.dispose?.() // todo: make uiConfig.dispose\n\n            superDispose && superDispose.call(this)\n            return this\n        },\n\n    getMapsForObject3D: function(this: IObject3D): Map<string, ITexture> {\n        const maps = new Map<string, ITexture>()\n        // @ts-expect-error todo add type\n        for (const prop of this.constructor?.MapProperties || object3DTextureProperties) {\n            checkTexMapReference(prop, this, maps)\n        }\n        if (this.isScene) {\n            for (const prop of sceneTextureProperties) {\n                checkTexMapReference(prop, this, maps)\n            }\n        }\n        // todo userdata properties\n        return maps\n    },\n\n    deleteObject: async(object: IObject3D, e?: any)=>{ // e is supposed to be mouse or keyboard event from ui interaction\n        const res =\n            e?.shiftKey ? true :\n                await ThreeViewer.Dialog.confirm('Delete Object: Are you sure you want to delete this object?')\n        if (!res) return\n        const parent = object.parent\n        object.dispose && object.dispose(true)\n        return ()=>{ // undo\n            if (parent) parent.add(object)\n        }\n    },\n    duplicateObject: async(object: IObject3D, e?: any)=>{ // e is supposed to be mouse or keyboard event from ui interaction\n        const parent = object.parent\n        const clone = object.clone(true) as IObject3D\n        incrementObjectCloneName(object, clone)\n        const select = e ? !e.shiftKey : false\n        return {\n            action: ()=>{\n                if (parent && !clone.parent)\n                    parent.add(clone) // todo same index?\n                select && clone.dispatchEvent({type: 'select', value: clone, object: clone, ui: !!e, bubbleToParent: true, trackUndo: false})\n            },\n            undo: ()=>{\n                if (clone.parent === parent)\n                    clone.removeFromParent()\n            },\n        }\n    },\n}\n\nexport const sceneTextureProperties: Set<string> = new Set<string>([\n    'environmentMap',\n    'background',\n])\n\nexport const object3DTextureProperties: Set<string> = new Set<string>([])\n\n/**\n * Converts three.js Object3D to IObject3D, setup object events, adds utility methods, and runs objectProcessor.\n * @param parent\n */\nfunction upgradeObject3D(this: IObject3D, parent?: IObject3D|undefined/* , objectProcessor?: IObjectProcessor*/): IObject3D {\n    if (!this) return this\n    if (!this.userData) this.userData = {}\n    // this.userData.uuid = this.uuid\n\n    // not checking assetType but custom var __objectSetup because its required in types sometimes, check PerspectiveCamera2\n    // if (this.assetType) return this\n    if (this.__objectSetup) {\n        // this.objectProcessor?.processObject(this)\n        return this\n    }\n    this.__objectSetup = true\n\n    if (!this.objectExtensions) this.objectExtensions = []\n\n    if (!this.userData.__autoBubbleToParentEvents) this.userData.__autoBubbleToParentEvents = ['select']\n    // Event bubbling. todo: set bubbleToParent in these events when dispatched from child and remove from here?\n\n    if (this.isLight) this.assetType = 'light'\n    else if (this.isCamera) this.assetType = 'camera'\n    else if (this.isWidget) this.assetType = 'widget'\n    else this.assetType = 'model'\n\n    if (parent) this.parentRoot = parent.parentRoot || parent\n\n    // const oldFunctions = {\n    //     dispatchEvent: this.dispatchEvent,\n    //     clone: this.clone,\n    //     copy: this.copy,\n    //     add: this.add,\n    //     dispose: this.dispose,\n    // }\n    // this.addEventListener('dispose', () => Object.assign(this, oldFunctions)) // todo: is this required?\n\n    // typed because of type-checking\n    this.dispatchEvent = iObjectCommons.dispatchEvent(this.dispatchEvent)\n    this.dispose = iObjectCommons.dispose(this.dispose)\n    this.clone = iObjectCommons.clone(this.clone)\n    this.copy = iObjectCommons.copy(this.copy) // todo: do same for object.toJSON()\n    this.add = iObjectCommons.add(this.add)\n\n    if (!this.setDirty) this.setDirty = iObjectCommons.setDirty\n    if (!this.refreshUi) this.refreshUi = iObjectCommons.refreshUi\n    if (!this.autoScale) this.autoScale = iObjectCommons.autoScale.bind(this)\n    if (!this.autoCenter) this.autoCenter = iObjectCommons.autoCenter.bind(this)\n    if (!this.pivotToBoundsCenter) this.pivotToBoundsCenter = iObjectCommons.pivotToBoundsCenter.bind(this)\n    if (!this.pivotToPoint) this.pivotToPoint = iObjectCommons.pivotToPoint.bind(this)\n    if (!this.traverseModels) this.traverseModels = iObjectCommons.traverseModels.bind(this)\n\n    // fired from Object3D.js\n    this.addEventListener('added', iObjectCommons.eventCallbacks.onAddedToParent)\n    this.addEventListener('removed', iObjectCommons.eventCallbacks.onRemovedFromParent)\n\n    // this.addEventListener('dispose', ()=>{\n    //     this.removeEventListener('added', iObjectCommons.eventCallbacks.onAddedToParent)\n    //     this.removeEventListener('removed', iObjectCommons.eventCallbacks.onRemovedFromParent)\n    // })\n\n    if (this.isLineSegments2 || this.isLine2) {\n        this.isMesh = true // required for shadows etc\n    }\n    if ((this.isMesh || this.isLine) && !this.__meshSetup) {\n        this.__meshSetup = true\n\n        // todo move this to object3dmanager and remove\n        this._onGeometryUpdate = (e) => iObjectCommons.eventCallbacks.onGeometryUpdate.call(this, e)\n\n        // Material, Geometry prop init\n        iObjectCommons.initMaterial.call(this)\n        iObjectCommons.initGeometry.call(this)\n\n        // from GLTFObject3DExtrasExtension\n        if (!this.userData.__keepShadowDef) {\n            const mat = Array.isArray(this.material) ? this.material[0] : this.material\n            this.castShadow = !mat || !mat.transparent && !mat.transmission\n            this.receiveShadow = true\n            this.userData.__keepShadowDef = true\n        }\n\n        this.addEventListener('dispose', ()=>{\n\n            (this.materials || [<IMaterial> this.material]).forEach(m => m?.dispose(false))\n            this.geometry?.dispose(false)\n\n            // if (this.material) {\n            //     // const oldMats = Array.isArray(this.material) ? [...(this.material as IMaterial[])] : [this.material!]\n            //     this.material = undefined // this will dispose material if not used by other meshes\n            //     // delete this.material\n            //     // for (const oldMat of oldMats) {\n            //     //     if (oldMat && oldMat.userData && oldMat.appliedMeshes?.size === 0 && oldMat.userData.disposeOnIdle !== false) oldMat.dispose()\n            //     // }\n            // }\n            // if (this.geometry) {\n            //     // const oldGeom = this.geometry\n            //     this.geometry = undefined // this will dispose geometry if not used by other meshes\n            //     // delete this.geometry\n            //     // if (oldGeom && oldGeom.userData && oldGeom.appliedMeshes?.size === 0 && oldGeom.userData.disposeOnIdle !== false) oldGeom.dispose()\n            // }\n            //\n            // delete this._onGeometryUpdate\n        })\n\n    }\n\n    if (!this.uiConfig && (this.assetType === 'model' || this.assetType === 'camera')) {\n        // todo: lights/other types?\n        iObjectCommons.makeUiConfig.call(this)\n    }\n\n    // todo: serialization?\n\n    if (this.autoUpgradeChildren !== false) {\n        const children = [...this.children]\n        for (const c of children) upgradeObject3D.call(c, this/* , objectProcessor*/)\n    }\n\n    // region Legacy\n\n    // eslint-disable-next-line deprecation/deprecation\n    !(this as any).modelObject && Object.defineProperty(this, 'modelObject', {\n        get: ()=>{\n            console.error('IObject3D: modelObject is deprecated, use object directly')\n            return this\n        },\n    })\n\n    // endregion\n\n    // this.objectProcessor?.processObject(this)\n\n    return this\n}\n","import {CatmullRomCurve3, EventDispatcher, Quaternion, Vector3} from 'three'\nimport {onChange3, serializable, serialize} from 'ts-browser-helpers'\nimport {IUiConfigContainer, uiButton, uiInput, uiNumber, UiObjectConfig, uiPanelContainer, uiVector} from 'uiconfig.js'\nimport {ICamera} from '../ICamera'\nimport {generateUUID} from '../../three'\n\nexport interface ICameraView extends IUiConfigContainer{\n    name: string\n    position: Vector3\n    target: Vector3\n    quaternion: Quaternion\n    zoom: number\n    /*\n     * Duration multiplier when the camera is animating to the view.\n     */\n    duration?: number\n    isWorldSpace?: boolean\n    animate?(camera?: ICamera, duration?: number): void\n    set?(camera?: ICamera): void\n    update?(camera?: ICamera): void\n    delete?(camera?: ICamera): void\n    setDirty?: (ops?: any)=> void\n}\n\nexport interface CameraViewEventMap {\n    setView: {camera?: ICamera, view: ICameraView}\n    animateView: {camera?: ICamera, duration?: number, view: ICameraView}\n    updateView: {camera?: ICamera, view: ICameraView}\n    deleteView: {camera?: ICamera, view: ICameraView}\n    update: {key?: string}\n}\n\n@serializable('CameraView')\n@uiPanelContainer('Camera View')\nexport class CameraView extends EventDispatcher<CameraViewEventMap> implements ICameraView, IUiConfigContainer {\n    uuid = generateUUID()\n\n    @onChange3('setDirty')\n    @serialize() @uiInput() name = 'Camera View'\n\n    @onChange3('setDirty')\n    @serialize() @uiVector() position = new Vector3()\n    @onChange3('setDirty')\n    @serialize() @uiVector() target = new Vector3()\n    @onChange3('setDirty')\n    @serialize() @uiVector() quaternion = new Quaternion()\n    @onChange3('setDirty')\n    @serialize() @uiNumber() zoom = 1\n    /**\n     * Duration multiplier. Set to 0 for instant camera jump.\n     */\n    @onChange3('setDirty')\n    @serialize() @uiNumber() duration = 1\n    @onChange3('setDirty')\n    @serialize() isWorldSpace = true\n\n    @uiButton() set = (camera?: ICamera) => this.dispatchEvent({type: 'setView', camera, view: this})\n    @uiButton() update = (camera?: ICamera) => this.dispatchEvent({type: 'updateView', camera, view: this})\n    @uiButton() delete = (camera?: ICamera) => this.dispatchEvent({type: 'deleteView', camera, view: this})\n    @uiButton() animate = (camera?: ICamera, duration?: number) => this.dispatchEvent({type: 'animateView', camera, duration, view: this})\n\n    constructor(name?: string, position?: Vector3, target?: Vector3, quaternion?: Quaternion, zoom?: number, duration = 1, isWoldSpace?: boolean) {\n        super()\n        if (name !== undefined) this.name = name\n        if (position) this.position.copy(position)\n        if (target) this.target.copy(target)\n        if (quaternion) this.quaternion.copy(quaternion)\n        if (zoom !== undefined) this.zoom = zoom\n        if (duration !== undefined && duration !== 0) this.duration = duration\n        if (isWoldSpace !== undefined) this.isWorldSpace = isWoldSpace\n    }\n\n    setDirty = (ops?: any) => {\n        this.dispatchEvent({...ops, type: 'update'})\n        if (this.uiConfig) {\n            if (ops?.key === 'name') {\n                this.uiConfig.label = this.name\n                this.uiConfig.uiRefresh?.()\n            } else {\n                this.uiConfig.uiRefresh?.(true, 'postFrame')\n            }\n        }\n    }\n\n    clone() {\n        return new CameraView(this.name, this.position, this.target, this.quaternion, this.zoom, this.duration, this.isWorldSpace)\n    }\n\n    uiConfig?: UiObjectConfig\n    // uiConfig = generateUiFolder(this.name, this)\n\n}\n\nexport function createCameraPath(views: CameraView[]) {\n    const splineCurve = 'chordal'\n    const points = views.map(c => c.position.clone())\n    const spline = new CatmullRomCurve3(points, true, splineCurve, 0.75)\n\n    const getPosition = (t: number, viewIndex: number, v?: Vector3) => {\n        v = v || new Vector3()\n        const ip = 1. / points.length\n        const i = viewIndex === 0 ? points.length : viewIndex\n        const d = (i - 1) * ip\n        spline.getPointAt(d + t * ip, v)\n        return v\n    }\n\n    const targets = views.map(c => c.target.clone())\n    const targetSpline = new CatmullRomCurve3(targets, true, splineCurve, 0.75)\n\n    const getTarget = (t: number, viewIndex: number, v?: Vector3) => {\n        v = v || new Vector3()\n        const ip = 1. / targets.length\n        const i = viewIndex === 0 ? targets.length : viewIndex\n        const d = (i - 1) * ip\n        targetSpline.getPointAt(d + t * ip, v)\n        return v\n    }\n    return {getPosition, getTarget}\n}\n","import {iObjectCommons} from './iObjectCommons'\nimport {Camera, IUniform, Object3D, Vector3} from 'three'\nimport type {ICamera, ICameraEventMap, ICameraSetDirtyOptions} from '../ICamera'\nimport {CameraView, ICameraView} from '../camera/CameraView'\nimport {Box3B} from '../../three/math/Box3B'\nimport {getFittingDistance} from '../../three/utils/camera'\n\nexport const iCameraCommons = {\n    setDirty: function(this: ICamera, options?: ICameraSetDirtyOptions): void {\n        if (!this._positionWorld) return // not initialized yet\n\n        // noinspection SuspiciousTypeOfGuard it can be string when called from bindToValue\n        const isStr = typeof options === 'string'\n        const changeKey = isStr ? options as string : options?.change ?? options?.key // todo use both?\n        let projectionUpdated = false\n        if (options?.projectionUpdated !== false && (!changeKey ||\n            ['zoom', 'fov', 'left', 'right', 'top', 'bottom', 'aspect', 'frustumSize', 'view', 'coordinateSystem', 'projection', 'activateMain', 'deactivateMain', 'near', 'far', 'nearFar', 'deserialize'].includes(changeKey))\n        ) {\n            this.updateProjectionMatrix()\n            projectionUpdated = true\n        }\n        projectionUpdated = projectionUpdated || options?.projectionUpdated || false\n\n        if (isStr) options = undefined\n\n        this.getWorldPosition(this._positionWorld)\n        // console.log('target', target, this._controls, this._camera)\n        // noinspection PointlessBooleanExpressionJS\n        if (this.controls && this.controls.target && this.controls.enabled !== false && this.target !== this.controls.target) {\n            this.controls.target.copy(this.target)\n            // this.controls.update() // this should be done automatically postFrame\n        }\n        // if (!this.controls || !this.controls.enabled) {\n        else if (this.userData.autoLookAtTarget) {\n            this.lookAt(this.target)\n        }\n        // todo refresh target on rotation change if autoLookAtTarget is false? (calculate distanceToTarget from the current/prev target and position\n\n        this.dispatchEvent({...options, type: 'update', bubbleToParent: false, camera: this}) // does not bubble\n        this.dispatchEvent({...options, type: 'cameraUpdate', projectionUpdated, bubbleToParent: true, camera: this}) // this sets dirty in the viewer\n        iObjectCommons.setDirty.call(this, {refreshScene: false, ...options, projectionUpdated})\n    },\n    activateMain: function(this: ICamera, options: Omit<ICameraEventMap['activateMain'], 'bubbleToParent'> = {}, _internal = false, _refresh = true, canvas?: HTMLCanvasElement): void {\n        if (!_internal) {\n            if (options.camera === null) return this.deactivateMain(options, _internal, _refresh)\n            // if (!canvas)\n            // so that viewer can update the canvas ref set on the camera\n            return this.dispatchEvent({\n                type: 'activateMain', ...options,\n                camera: this,\n                bubbleToParent: true,\n            })\n        } // this will be used by RootScene to deactivate other cameras and activate this one\n        if (this.userData.__isMainCamera) return\n        this.userData.__isMainCamera = true\n        this.userData.__lastScale = this.scale.clone()\n        this.scale.divide(this.getWorldScale(new Vector3())) // make unit scale, for near far and all\n        if (canvas && this.setCanvas) this.setCanvas(canvas, _refresh)\n        else if (_refresh) {\n            this.refreshCameraControls(false)\n            this.refreshAspect(false)\n        }\n        this.setDirty({change: 'activateMain', ...options})\n        // console.log({...this._camera.modelObject.position})\n    },\n    deactivateMain: function(this: ICamera, options: Omit<ICameraEventMap['activateMain'], 'bubbleToParent'> = {}, _internal = false, _refresh = true, clearCanvas = false): void {\n        if (!_internal) return this.dispatchEvent({\n            type: 'activateMain', ...options,\n            camera: undefined,\n            bubbleToParent: true,\n        }) // this will be used by RootScene to deactivate other cameras and activate this one\n        if (!this.userData.__isMainCamera) return\n        this.userData.__isMainCamera = false // or delete?\n        if (this.userData.__lastScale) {\n            this.scale.copy(this.userData.__lastScale)\n            delete this.userData.__lastScale\n        }\n        if (clearCanvas) this.setCanvas(undefined, _refresh)\n        else if (_refresh) this.refreshCameraControls(false)\n        if (_refresh) {\n            this.refreshCameraControls(false)\n        }\n        this.setDirty({change: 'deactivateMain', ...options})\n    },\n    refreshUi: function(this: ICamera) {\n        // todo\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    },\n    refreshTarget: function(this: ICamera, distanceFromTarget = 4, setDirty = true) {\n        if (this.controls?.enabled && this.controls.target) {\n            if (this.controls.target !== this.target) this.target.copy(this.controls.target)\n        } else {\n            // this.cameraObject.updateWorldMatrix(true, false)\n            this.getWorldDirection(this.target)\n                // .transformDirection(this.cameraObject.matrixWorldInverse)\n                // .multiplyScalar(distanceFromTarget).add(this._position)\n                .multiplyScalar(distanceFromTarget).add(this.getWorldPosition(new Vector3()))\n            // if (this.cameraObject.parent) this.cameraObject.parent.worldToLocal(this._target)\n        }\n        if (setDirty) this.setDirty({change: 'target'})\n    },\n    refreshAspect: function(this: ICamera, setDirty = true) {\n        if (this.autoAspect) {\n            if (!this._canvas) {\n                console.warn('ICamera: cannot calculate aspect ratio without canvas/container')\n            } else {\n                let aspect = this._canvas.clientWidth / this._canvas.clientHeight\n                if (!isFinite(aspect)) aspect = 1\n                this.aspect = aspect\n                this.refreshFrustum && this.refreshFrustum(false)\n            }\n        }\n        if (setDirty) this.setDirty({change: 'aspect'})\n    },\n    updateShaderProperties: function(this: ICamera, material: {defines: Record<string, string | number | undefined>; uniforms: {[p: string]: IUniform}}) {\n        material.uniforms.cameraPositionWorld?.value?.copy(this._positionWorld)\n        material.uniforms.cameraNearFar?.value?.set(this.near, this.far)\n        if (material.uniforms.projection) material.uniforms.projection.value = this.projectionMatrix // todo: rename to projectionMatrix2?\n        material.defines.PERSPECTIVE_CAMERA = this.type === 'PerspectiveCamera' ? '1' : '0'\n        material.defines.ORTHOGRAPHIC_CAMERA = this.type === 'OrthographicCamera' ? '1' : '0' // todo\n        return this\n    },\n\n    upgradeCamera: upgradeCamera,\n\n    copy: (superCopy: ICamera['copy']): ICamera['copy'] =>\n        function(this: ICamera, camera: ICamera | Camera, recursive?, distanceFromTarget?, worldSpace?, ...args): ICamera {\n            if (!camera.isCamera) {\n                console.error('ICamera.copy: camera is not a Camera', camera)\n                return this\n            }\n            superCopy.call(this, camera, recursive, ...args)\n            // moved to setView in ThreeViewer\n            // const worldPos = camera.getWorldPosition(this.position)\n            // camera.getWorldQuaternion(this.quaternion)\n            // if (this.parent) {\n            //     this.position.copy(this.parent.worldToLocal(worldPos))\n            //     this.quaternion.premultiply(this.parent.quaternion.clone().invert())\n            // }\n            if ((<ICamera>camera).target?.isVector3) this.target.copy((<ICamera>camera).target)\n            else {\n                const minDistance = (this.controls as any)?.minDistance ?? distanceFromTarget ?? 4\n                camera.getWorldDirection(this.target).multiplyScalar(minDistance).add(this.getWorldPosition(new Vector3()))\n            }\n\n\n            if (worldSpace) { // default = false\n                const worldPos = camera.getWorldPosition(this.position)\n                // this.getWorldQuaternion(this.quaternion) // todo: do if autoLookAtTarget is false\n                // todo up vector\n                if (this.parent) {\n                    this.position.copy(this.parent.worldToLocal(worldPos))\n                    //     this.quaternion.premultiply(this.parent.quaternion.clone().invert())\n                }\n            }\n\n            this.updateMatrixWorld(true)\n            this.updateProjectionMatrix()\n            this.refreshAspect(false)\n            this.setDirty()\n            return this\n        },\n\n    getView: function<T extends ICameraView = CameraView>(this: ICamera, worldSpace = true, _view?: T): T {\n        const up = new Vector3()\n        this.updateWorldMatrix(true, false)\n        const matrix = this.matrixWorld\n        up.x = matrix.elements[4]\n        up.y = matrix.elements[5]\n        up.z = matrix.elements[6]\n        up.normalize()\n        const view = _view || new CameraView()\n        view.name = this.name\n        view.position.copy(this.position)\n        view.target.copy(this.target)\n        view.quaternion.copy(this.quaternion)\n        view.zoom = this.zoom\n        // view.up.copy(up)\n        const parent = this.parent\n        if (parent) {\n            if (worldSpace) {\n                view.position.applyMatrix4(parent.matrixWorld)\n                this.getWorldQuaternion(view.quaternion)\n                // target, up is already in world space\n            } else {\n                up.transformDirection(parent.matrixWorld.clone().invert())\n                // pos is already in local space\n                // target should always be in world space\n            }\n        }\n        view.isWorldSpace = worldSpace\n        return view as T\n    },\n\n    setView: function<T extends ICameraView = CameraView>(this: ICamera, view: T): void {\n        this.position.copy(view.position)\n        this.target.copy(view.target)\n        // this.up.copy(view.up)\n        this.quaternion.copy(view.quaternion)\n        this.zoom = view.zoom\n        this.setDirty()\n    },\n\n    /**\n     * Instantly frames the camera to fit the given objects in the viewport.\n     * Computes the bounding box, fitting distance, and sets the camera position and target.\n     * The camera direction is preserved — only distance from target changes.\n     */\n    fitObject: function(this: ICamera, objects: Object3D|Object3D[], distanceMultiplier = 1.5, distanceBounds?: {min?: number, max?: number}): void {\n        const arr = Array.isArray(objects) ? objects : [objects]\n        if (!arr.length) return\n        const bbox = new Box3B().expandByObject(arr[0], false, true)\n        for (let i = 1; i < arr.length; i++) {\n            bbox.expandByObject(arr[i], false, true)\n        }\n        const cameraZ = getFittingDistance(this, bbox)\n        const center = bbox.getCenter(new Vector3())\n        const scale = bbox.getSize(new Vector3())\n        if (scale.lengthSq() <= 0) {\n            arr[0].getWorldPosition(center)\n        }\n        const dMin = distanceBounds?.min ?? 0.5\n        const dMax = distanceBounds?.max ?? 50.0\n        const distance = Math.min(dMax, Math.max(dMin, cameraZ * distanceMultiplier))\n\n        const view = this.getView(true) // world space\n        view.target.copy(center)\n        const direction = new Vector3().subVectors(view.target, view.position).normalize()\n        view.position.copy(direction.multiplyScalar(-distance).add(view.target))\n        this.setView(view)\n    },\n\n    // todo rename to setFromCamera?\n    setViewFromCamera: function(this: ICamera, camera: Camera|ICamera, distanceFromTarget?: number, worldSpace = true): void {\n        // todo: getView, setView can also be used, do we need copy? as that will copy all the properties\n        this.copy(camera, undefined, distanceFromTarget, worldSpace)\n    },\n\n    setViewToMain: function(this: ICamera, eventOptions: Omit<ICameraEventMap['setView'], 'camera'|'bubbleToParent'>): void {\n        this.dispatchEvent({type: 'setView', ...eventOptions, camera: this, bubbleToParent: true})\n    },\n\n    setNearFar(camera: ICamera, near: number, far: number, setDirty: boolean, source?: string) {\n        const changed = Math.abs(camera.near - near) + Math.abs(camera.far - far) > 0.001\n        camera.near = near\n        camera.far = far\n        if (setDirty && changed && camera.setDirty) {\n            camera.setDirty({change: 'nearFar', source})\n            return true\n        } else {\n            camera.updateProjectionMatrix()\n        }\n        return false\n    },\n\n    defaultMinNear: 0.1,\n    defaultMaxFar: 1000,\n}\n\nfunction upgradeCamera(this: ICamera) {\n    if (!this.isCamera) {\n        console.error('Object is not a camera', this)\n        return\n    }\n    if (this.userData.__cameraSetup) return\n    this.userData.__cameraSetup = true\n    iObjectCommons.upgradeObject3D.call(this)\n    this.copy = iCameraCommons.copy(this.copy)\n    if (!this.target) this.target = new Vector3()\n    if (!this._positionWorld) this._positionWorld = new Vector3()\n    if (!this.refreshTarget) this.refreshTarget = iCameraCommons.refreshTarget\n    if (!this.refreshAspect) this.refreshAspect = iCameraCommons.refreshAspect\n    if (!this.updateShaderProperties) this.updateShaderProperties = iCameraCommons.updateShaderProperties\n\n    if (!this.activateMain) this.activateMain = iCameraCommons.activateMain\n    if (!this.deactivateMain) this.deactivateMain = iCameraCommons.deactivateMain\n    if (!this.refreshUi) this.refreshUi = iCameraCommons.refreshUi\n    if (!this.setDirty) this.setDirty = iCameraCommons.setDirty\n    // if (!this.controlsMode) this.controlsMode = ''\n\n    if (!this.getView) this.getView = iCameraCommons.getView\n    if (!this.setView) this.setView = iCameraCommons.setView\n    if (!this.fitObject) this.fitObject = iCameraCommons.fitObject\n    if (!this.setViewFromCamera) this.setViewFromCamera = iCameraCommons.setViewFromCamera\n    if (!this.setViewToMain) this.setViewToMain = iCameraCommons.setViewToMain\n\n    if (!this.setCanvas) this.setCanvas = ()=>notSupported('setCanvas')\n    if (!this.setControlsCtor) this.setControlsCtor = ()=>notSupported('setControlsCtor')\n    if (!this.removeControlsCtor) this.removeControlsCtor = ()=>notSupported('removeControlsCtor')\n    if (!this.refreshCameraControls) this.refreshCameraControls = ()=>notSupported('refreshCameraControls')\n    if (!this.setInteractions) this.setInteractions = ()=>notSupported('setInteractions')\n    if (!this.dispose) this.dispose = ()=>notSupported('dispose')\n\n\n    this.assetType = 'camera'\n    // todo uiconfig, anything else?\n}\n\nfunction notSupported(n: string) {\n    console.warn(`ICamera.${n} is not supported on this object. Please use objects of PerspectiveCamera2 or OrthographicCamera2 classes.`)\n}\n","import {Camera, Euler, Object3D, PerspectiveCamera, Quaternion, Vector3} from 'three'\nimport {\n    generateUiConfig,\n    uiDropdown,\n    uiInput,\n    uiNumber,\n    UiObjectConfig,\n    uiSlider,\n    uiToggle,\n    uiVector,\n} from 'uiconfig.js'\nimport {onChange, onChange2, onChange3, serialize} from 'ts-browser-helpers'\nimport type {ICamera, ICameraEventMap, ICameraUserData, TCameraControlsMode} from '../ICamera'\nimport {ICameraSetDirtyOptions} from '../ICamera'\nimport type {ICameraControls, TControlsCtor} from './ICameraControls'\nimport {OrbitControls3} from '../../three/controls/OrbitControls3'\nimport {IObject3D} from '../IObject'\nimport {ThreeSerialization} from '../../utils'\nimport {iCameraCommons} from '../object/iCameraCommons'\nimport {bindToValue} from '../../three/utils/decorators'\nimport {makeICameraCommonUiConfig, objectExtensionsUiConfig} from '../object/IObjectUi'\n\n// todo: maybe change domElement to some wrapper/base class of viewer\n/**\n * A camera class that extends {@link PerspectiveCamera} with additional features and built-in control support.\n */\nexport class PerspectiveCamera2<TE extends ICameraEventMap = ICameraEventMap> extends PerspectiveCamera<TE&ICameraEventMap> implements ICamera<TE&ICameraEventMap> {\n    assetType = 'camera' as const\n    get controls(): ICameraControls | undefined {\n        return this._controls\n    }\n\n    @uiInput('Name') declare name: string\n\n    @serialize('camControls')\n    private _controls?: ICameraControls\n    private _currentControlsMode: TCameraControlsMode = '';\n    ['_canvas']?: HTMLCanvasElement\n\n    @uiDropdown('Controls Mode', undefined, (t: PerspectiveCamera2)=>({\n        children: ['none', ...t.controlsCtors.keys()].map(k=>({label: k, value: k === 'none' ? '' : k})),\n    }))\n    @serialize()\n    @onChange2(PerspectiveCamera2.prototype.refreshCameraControls)\n        controlsMode: TCameraControlsMode\n    get isMainCamera(): boolean {\n        return this.userData ? this.userData.__isMainCamera || false : false\n    }\n\n    @serialize()\n        userData: ICameraUserData = {}\n\n    @onChange3(PerspectiveCamera2.prototype.setDirty)\n    @uiSlider('Field Of View', [1, 180], 0.001)\n    @serialize() declare fov: number\n\n    @onChange3(PerspectiveCamera2.prototype.setDirty)\n    @serialize() declare focus: number\n\n    @onChange3(PerspectiveCamera2.prototype.setDirty)\n    @uiNumber('FoV Zoom')\n    @serialize() declare zoom: number\n\n    @uiVector<PerspectiveCamera2>('Position', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'position'})}))\n    @serialize() declare readonly position: Vector3\n\n    @uiVector<PerspectiveCamera2>('Up', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'up'})}))\n    @serialize() declare readonly up: Vector3\n\n    // todo serialize?\n    // @uiVector<PerspectiveCamera2>('Quaternion', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'quaternion'}), disabled: ()=>t.autoLookAtTarget}))\n    /* @serialize() */declare readonly quaternion: Quaternion\n\n    @uiVector<PerspectiveCamera2>('Rotation', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'rotation'}), disabled: ()=>t.autoLookAtTarget}))\n    /* @serialize()*/ declare readonly rotation: Euler\n\n    /**\n     * The target position of the camera (where the camera looks at). Also syncs with the controls.target, so it's not required to set that separately.\n     * Note: this is always in world-space\n     * Note: {@link autoLookAtTarget} must be set to `true` to make the camera look at the target when no controls are enabled\n     */\n    @uiVector<PerspectiveCamera2>('Target', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'target'}), disabled: ()=>!t.autoLookAtTarget}))\n    @serialize() readonly target: Vector3 = new Vector3(0, 0, 0)\n\n    /**\n     * Automatically manage aspect ratio based on window/canvas size.\n     * Defaults to `true` if {@link domElement}(canvas) is set.\n     */\n    @serialize()\n    @onChange2('refreshAspect')\n    @uiToggle('Auto Aspect')\n        autoAspect: boolean\n\n    @serialize()\n    @onChange2('refreshAspect')\n    @uiNumber<PerspectiveCamera2>('Aspect Ratio', (t)=>({hidden: ()=>t.autoAspect}))\n    declare aspect: number\n\n    /**\n     * Near clipping plane.\n     * This is managed by RootScene for active cameras\n     * To change the minimum that's possible set {@link minNearPlane}\n     * To use a fixed value set {@link autoNearFar} to false and set {@link minNearPlane}, or set directly\n     */\n    near = 0.1\n\n    /**\n     * Far clipping plane.\n     * This is managed by RootScene for active cameras\n     * To change the maximum that's possible set {@link maxFarPlane}\n     * To use a fixed value set {@link autoNearFar} to false and set {@link maxFarPlane} or set directly\n     */\n    far = 2000\n\n    /**\n     * Automatically make the camera look at the {@link target} on {@link setDirty} call\n     * Defaults to false. Note that this must be set to true to make the camera look at the target without any controls\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        autoLookAtTarget = false // bound to userData so that it's saved in the glb.\n\n    /**\n     * Automatically manage near and far clipping planes based on scene size.\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        autoNearFar = true // bound to userData so that it's saved in the glb.\n\n    /**\n     * Minimum near clipping plane allowed. (Distance from camera)\n     * Used in RootScene when {@link autoNearFar} is true.\n     * @default undefined (0.5 is used internally)\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        minNearPlane?: number = undefined\n\n    /**\n     * Maximum far clipping plane allowed. (Distance from camera)\n     * Used in RootScene when {@link autoNearFar} is `true`.\n     * @default undefined (1000 is used internally)\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        maxFarPlane?: number = undefined\n\n    /**\n     * Automatically move the camera(dolly) when the field of view(fov) changes.\n     * Works when controls are enabled or `autoLookAtTarget` is `true`.\n     *\n     * Note - this is not exact\n     */\n    @bindToValue({obj: 'userData'})\n        dollyFov = false // bound to userData so that it's saved in the glb.\n\n    constructor(controlsMode?: TCameraControlsMode, domElement?: HTMLCanvasElement, autoAspect?: boolean, fov?: number, aspect?: number) {\n        super(fov, aspect)\n        this._canvas = domElement\n        this.autoAspect = autoAspect ?? !!domElement\n\n        iCameraCommons.upgradeCamera.call(this) // todo: test if autoUpgrade = false works as expected if we call upgradeObject3D externally after constructor, because we have setDirty, refreshTarget below.\n\n        this.controlsMode = controlsMode || ''\n\n        this.refreshTarget(undefined, false)\n\n        this.setDirty()\n\n        // if (domElement)\n        //     domElement.style.touchAction = 'none' // this is done in orbit controls anyway\n\n\n        // const ae = this._canvas.addEventListener\n        // todo: this breaks tweakpane UI.\n        // this._canvas.addEventListener = (type: string, listener: any, options1: any) => { // see https://github.com/mrdoob/three.js/pull/19782\n        //     ae(type, listener, type === 'wheel' && typeof options1 !== 'boolean' ? {\n        //         ...typeof options1 === 'object' ? options1 : {},\n        //         capture: false,\n        //         passive: false,\n        //     } : options1)\n        // }\n\n    }\n\n    // region interactionsEnabled\n\n    private _interactionsDisabledBy = new Set<string>()\n\n    /**\n     * If interactions are enabled for this camera. It can be disabled by some code or plugin.\n     * see also {@link setInteractions}\n     * @deprecated use {@link canUserInteract} to check if the user can interact with this camera\n     * @readonly\n     */\n    get interactionsEnabled(): boolean {\n        return this._interactionsDisabledBy.size === 0\n    }\n\n    setInteractions(enabled: boolean, by: string, setDirty = true): void {\n        const size = this._interactionsDisabledBy.size\n        if (enabled) {\n            this._interactionsDisabledBy.delete(by)\n        } else {\n            this._interactionsDisabledBy.add(by)\n        }\n        if (size !== this._interactionsDisabledBy.size) this.refreshCameraControls(setDirty)\n    }\n\n    get canUserInteract() {\n        return this._interactionsDisabledBy.size === 0 && this.isMainCamera && this.controlsMode !== ''\n    }\n\n    // endregion\n\n    // region refreshing\n\n    setDirty(options?: ICameraSetDirtyOptions): void {\n        iCameraCommons.setDirty.call(this, options)\n\n        if (options?.last !== false)\n            this._camUi?.forEach(u=>u?.uiRefresh?.(false, 'postFrame', 1)) // because camera changes a lot. so we dont want to deep refresh ui on every change\n    }\n\n    /**\n     * when aspect ratio is set to auto it must be refreshed on resize, this is done by the viewer for the main camera.\n     * @param setDirty\n     */\n    refreshAspect = iCameraCommons.refreshAspect\n\n    refreshUi = iCameraCommons.refreshUi\n    refreshTarget = iCameraCommons.refreshTarget\n    activateMain = iCameraCommons.activateMain\n    deactivateMain = iCameraCommons.deactivateMain\n    updateShaderProperties = iCameraCommons.updateShaderProperties\n\n    // endregion\n\n    // region controls\n\n    // todo: move orbit to a plugin maybe? so that its not forced\n    controlsCtors = new Map<string, TControlsCtor>([['orbit', (object, domElement)=>{\n        const elem = domElement ? !domElement.ownerDocument ? domElement.documentElement : domElement : document.body\n        const controls = new OrbitControls3(object, elem)\n        // this._controls.enabled = false\n\n        // set tab index so that we get keyboard events\n        if (elem.tabIndex === -1) {\n            elem.tabIndex = 1000\n            // disable focus outline\n            elem.style.outline = 'none'\n        }\n\n        controls.listenToKeyEvents(elem) // optional // todo: make option for this\n        // controls.enableKeys = true\n        controls.screenSpacePanning = true\n\n        return controls\n    }]])\n    setControlsCtor(key: string, ctor: TControlsCtor, replace = false): void {\n        if (!replace && this.controlsCtors.has(key)) {\n            console.error('PerspectiveCamera2: ' + key + ' already exists.')\n            return\n        }\n        this.controlsCtors.set(key, ctor)\n    }\n    removeControlsCtor(key: string): void {\n        this.controlsCtors.delete(key)\n    }\n\n    private _controlsChanged = ()=>{\n        if (this._controls && this._controls.target) this.refreshTarget(undefined, false)\n        this.setDirty({change: 'controls'})\n    }\n\n    private _initCameraControls() {\n        const mode = this.controlsMode\n        this._controls = this.controlsCtors.get(mode)?.(this, this._canvas) ?? undefined\n        if (!this._controls && mode !== '') console.error('ICamera - Unable to create controls with mode ' + mode + '. Are you missing a plugin?')\n        this._controls?.addEventListener && this._controls.addEventListener('change', this._controlsChanged)\n        this._currentControlsMode = this._controls ? mode : ''\n        // todo maybe set target like this:\n        //  if (this._controls) this._controls.target = this.target\n    }\n\n    private _disposeCameraControls() {\n        if (this._controls) {\n            if (this._controls.target === this.target) this._controls.target = new Vector3() // just in case\n            this._controls.removeEventListener && this._controls.removeEventListener('change', this._controlsChanged)\n            this._controls.dispose && this._controls.dispose()\n        }\n        this._currentControlsMode = ''\n        this._controls = undefined\n    }\n\n    refreshCameraControls(setDirty = true): void {\n        if (!this.controlsCtors) return // class not initialized\n        if (this._controls) {\n            if (this._currentControlsMode !== this.controlsMode ||\n                this !== this._controls.object ||\n                this._controls.domElement && this._canvas !== this._controls.domElement\n            ) { // in-case camera changed or mode changed\n                this._disposeCameraControls()\n                this._initCameraControls()\n            }\n        } else {\n            this._initCameraControls()\n        }\n\n        // todo: only for orbit control like controls?\n        if (this._controls) {\n            const ce = this.canUserInteract\n            this._controls.enabled = ce\n            if (ce) this.up.copy(Object3D.DEFAULT_UP)\n        }\n\n        if (setDirty) this.setDirty()\n        this.refreshUi()\n    }\n\n    // endregion\n\n    // region serialization\n\n    /**\n     * Serializes this camera with controls to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer\n     */\n    toJSON(meta?: any, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        // todo add camOptions for backwards compatibility?\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    fromJSON(data: any, meta?: any): this | null {\n        if (data.camOptions || data.aspect === 'auto')\n            data = {...data}\n        if (data.camOptions) {\n            const op = data.camOptions\n            if (op.fov) data.fov = op.fov\n            if (op.focus) data.focus = op.focus\n            if (op.zoom) data.zoom = op.zoom\n            if (op.aspect) data.aspect = op.aspect\n            if (op.controlsMode) data.controlsMode = op.controlsMode\n            // todo: add support for this\n            // if (op.left) data.left = op.left\n            // if (op.right) data.right = op.right\n            // if (op.top) data.top = op.top\n            // if (op.bottom) data.bottom = op.bottom\n            // if (op.frustumSize) data.frustumSize = op.frustumSize\n            // if (op.controlsEnabled) data.controlsEnabled = op.controlsEnabled\n            delete data.camOptions\n        }\n        if (data.aspect === 'auto') {\n            data.aspect = this.aspect\n            this.autoAspect = true\n        }\n        // if (data.cameraObject) this._camera.fromJSON(data.cameraObject)\n        // todo: add check for OrbitControls being not deserialized(inited properly) if it doesn't exist yet (if it is not inited properly)\n        // console.log(JSON.parse(JSON.stringify(data)))\n        ThreeSerialization.Deserialize(data, this, meta, true)\n        this.refreshAspect(false)\n        this.setDirty({change: 'deserialize'})\n        return this\n    }\n\n    // endregion\n\n    // region camera views\n\n    getView = iCameraCommons.getView\n    setView = iCameraCommons.setView\n    fitObject = iCameraCommons.fitObject\n    setViewFromCamera = iCameraCommons.setViewFromCamera\n    setViewToMain = iCameraCommons.setViewToMain;\n\n    // endregion\n\n    // region utils/others\n\n    // for shader prop updater\n    ['_positionWorld'] = new Vector3()\n\n    dispose(): void {\n        this._disposeCameraControls()\n        // todo: anything else?\n        // iObjectCommons.dispose and dispatch event dispose is called automatically because of updateObject3d\n    }\n\n    setCanvas(canvas: HTMLCanvasElement|undefined, refresh = true) {\n        this._canvas = canvas\n        if (!refresh) return\n        this.refreshCameraControls()\n        this.refreshAspect(false)\n    }\n\n    // endregion\n\n    // region ui\n\n    private _camUi: UiObjectConfig[] = [\n        ...generateUiConfig(this) || [],\n        {\n            type: 'input',\n            label: 'Dolly FoV',\n            property: [this, 'dollyFov'],\n        },\n        ...makeICameraCommonUiConfig.call(this),\n        objectExtensionsUiConfig.call(this),\n    ]\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: ()=>this.name || 'Camera',\n        children: [\n            ...this._camUi,\n            // todo hack for zoom in and out for now.\n            ()=>(this._controls as OrbitControls3)?.zoomIn ? {\n                type: 'button',\n                label: 'Zoom in',\n                value: ()=> (this._controls as OrbitControls3)?.zoomIn(1),\n            } : {},\n            ()=>(this._controls as OrbitControls3)?.zoomOut ? {\n                type: 'button',\n                label: 'Zoom out',\n                value: ()=> (this._controls as OrbitControls3)?.zoomOut(1),\n            } : {},\n            ()=>this._controls?.uiConfig,\n        ],\n    }\n\n    // endregion\n\n    // region deprecated/old\n\n    @onChange((k: string, v: boolean)=>{\n        if (!v) console.warn('Setting camera invisible is not supported', k, v)\n    })\n    declare visible: boolean\n\n    get isActiveCamera(): boolean {\n        return this.isMainCamera\n    }\n    /**\n     * @deprecated use `<T>camera.controls` instead\n     */\n    getControls<T extends ICameraControls>(): T|undefined {\n        return this._controls as any as T\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get cameraObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated - use setDirty directly\n     * @param setDirty\n     */\n    targetUpdated(setDirty = true): void {\n        if (setDirty) this.setDirty()\n    }\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare copy: (source: ICamera|Camera|IObject3D, recursive?: boolean, distanceFromTarget?: number, worldSpace?: boolean) => this\n    // dispatchEvent: (event: ICameraEvent) => void\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n\n/**\n * Empty class with the constructor same as PerspectiveCamera in three.js.\n * This can be used to remain compatible with three.js construct signature.\n */\nexport class PerspectiveCamera0 extends PerspectiveCamera2 {\n    constructor(fov?: number, aspect?: number, near?: number, far?: number) {\n        super(undefined, undefined, undefined, fov, aspect || 1)\n        this.dollyFov = false\n        if (near || far) {\n            this.autoNearFar = false\n            if (near) {\n                this.near = near\n                this.minNearPlane = near\n            }\n            if (far) {\n                this.far = far\n                this.maxFarPlane = far\n            }\n        }\n    }\n}\n","import {Camera, Euler, Object3D, OrthographicCamera, Quaternion, Vector3} from 'three'\nimport {generateUiConfig, uiDropdown, uiInput, uiNumber, UiObjectConfig, uiToggle, uiVector} from 'uiconfig.js'\nimport {onChange, onChange2, onChange3, serialize} from 'ts-browser-helpers'\nimport type {ICamera, ICameraEventMap, ICameraUserData, TCameraControlsMode} from '../ICamera'\nimport {ICameraSetDirtyOptions} from '../ICamera'\nimport type {ICameraControls, TControlsCtor} from './ICameraControls'\nimport {OrbitControls3} from '../../three/controls/OrbitControls3'\nimport {IObject3D} from '../IObject'\nimport {ThreeSerialization} from '../../utils'\nimport {iCameraCommons} from '../object/iCameraCommons'\nimport {bindToValue} from '../../three/utils/decorators'\nimport {makeICameraCommonUiConfig, objectExtensionsUiConfig} from '../object/IObjectUi'\n\n// todo: extract out common functions with perspective camera into iCameraCommons\n// todo: maybe change domElement to some wrapper/base class of viewer\nexport class OrthographicCamera2<TE extends ICameraEventMap = ICameraEventMap> extends OrthographicCamera<TE&ICameraEventMap> implements ICamera<TE&ICameraEventMap> {\n    assetType = 'camera' as const\n    get controls(): ICameraControls | undefined {\n        return this._controls\n    }\n\n    @uiInput('Name') declare name: string\n\n    @serialize('camControls')\n    private _controls?: ICameraControls\n    private _currentControlsMode: TCameraControlsMode = '';\n    ['_canvas']?: HTMLCanvasElement\n\n    @uiDropdown('Controls Mode', undefined, (t: OrthographicCamera2)=>({\n        children: ['none', ...t.controlsCtors.keys()].map(k=>({label: k, value: k === 'none' ? '' : k})),\n    }))\n    @serialize()\n    @onChange2(OrthographicCamera2.prototype.refreshCameraControls)\n        controlsMode: TCameraControlsMode\n    get isMainCamera(): boolean {\n        return this.userData ? this.userData.__isMainCamera || false : false\n    }\n\n    @serialize()\n        userData: ICameraUserData = {}\n\n    @onChange3(OrthographicCamera2.prototype.setDirty)\n    @uiNumber('Zoom')\n    @serialize() declare zoom: number\n\n    @onChange3(OrthographicCamera2.prototype.setDirty)\n    @uiNumber<OrthographicCamera2>('Left', (t)=>({hidden: ()=>t._frustumSize !== undefined}))\n    @serialize() declare left: number\n\n    @onChange3(OrthographicCamera2.prototype.setDirty)\n    @uiNumber<OrthographicCamera2>('Right', (t)=>({hidden: ()=>t._frustumSize !== undefined}))\n    @serialize() declare right: number\n\n    @onChange3(OrthographicCamera2.prototype.setDirty)\n    @uiNumber<OrthographicCamera2>('Top', (t)=>({hidden: ()=>t._frustumSize !== undefined}))\n    @serialize() declare top: number\n\n    @onChange3(OrthographicCamera2.prototype.setDirty)\n    @uiNumber<OrthographicCamera2>('Bottom', (t)=>({hidden: ()=>t._frustumSize !== undefined}))\n    @serialize() declare bottom: number\n\n    private _frustumSize: number | undefined = undefined\n\n    /**\n     * Frustum size of the camera. This is used to calculate bounds (left, right, top, bottom) based on aspect ratio.\n     * Set to 0 (or negative) value to disable automatic, and to set the bounds manually.\n     */\n    @uiInput<OrthographicCamera2>('Frustum Size'/* , (t)=>({hidden: ()=>t.frustumSize === undefined})*/)\n    get frustumSize(): number {\n        return this._frustumSize ?? 0\n    }\n\n    set frustumSize(value: number) {\n        this._frustumSize = value <= 0 ? undefined : value\n        this.refreshFrustum(false)\n        this.setDirty()\n    }\n\n    // @onChange3(OrthographicCamera2.prototype.setDirty)\n    // @serialize() declare focus: number\n\n    // @onChange3(OrthographicCamera2.prototype.setDirty)\n    // @uiSlider('FoV Zoom', [0.001, 10], 0.001)\n    // @serialize() declare zoom: number\n\n    @uiVector<OrthographicCamera2>('Position', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'position'})}))\n    @serialize() declare readonly position: Vector3\n\n    @uiVector<OrthographicCamera2>('Up', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'up'})}))\n    @serialize() declare readonly up: Vector3\n\n    // todo serialize?\n    // @uiVector<OrthographicCamera2>('Quaternion', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'quaternion'}), disabled: ()=>t.autoLookAtTarget}))\n    /* @serialize() */declare readonly quaternion: Quaternion\n\n    @uiVector<OrthographicCamera2>('Rotation', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'rotation'}), disabled: ()=>t.autoLookAtTarget}))\n    /* @serialize()*/ declare readonly rotation: Euler\n\n    /**\n     * The target position of the camera (where the camera looks at). Also syncs with the controls.target, so it's not required to set that separately.\n     * Note: this is always in world-space\n     * Note: {@link autoLookAtTarget} must be set to `true` to make the camera look at the target when no controls are enabled\n     */\n    @uiVector<OrthographicCamera2>('Target', undefined, undefined, (t)=>({onChange: ()=>t.setDirty({change: 'target'}), disabled: ()=>!t.autoLookAtTarget}))\n    @serialize() readonly target: Vector3 = new Vector3(0, 0, 0)\n\n    /**\n     * Automatically manage aspect ratio based on window/canvas size.\n     * Defaults to `true` if {@link domElement}(canvas) is set.\n     */\n    @serialize()\n    @onChange2('refreshAspect')\n    @uiToggle('Auto Aspect')\n        autoAspect: boolean\n\n    /**\n     * Aspect ratio to use when {@link frustumSize} is defined\n     */\n    @serialize()\n    @onChange2('refreshAspect')\n    @uiNumber<OrthographicCamera2>('Aspect Ratio', (t)=>({hidden: ()=>t.autoAspect}))\n        aspect: number\n\n    /**\n     * Near clipping plane.\n     * This is managed by RootScene for active cameras\n     * To change the minimum that's possible set {@link minNearPlane}\n     * To use a fixed value set {@link autoNearFar} to false and set {@link minNearPlane} or set directly\n     */\n    near = 0.1\n\n    /**\n     * Far clipping plane.\n     * This is managed by RootScene for active cameras\n     * To change the maximum that's possible set {@link maxFarPlane}\n     * To use a fixed value set {@link autoNearFar} to false and set {@link maxFarPlane} or set directly\n     */\n    far = 2000\n\n    /**\n     * Automatically make the camera look at the {@link target} on {@link setDirty} call\n     * Defaults to false. Note that this must be set to true to make the camera look at the target without any controls\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        autoLookAtTarget = false // bound to userData so that it's saved in the glb.\n\n    /**\n     * Automatically manage near and far clipping planes based on scene size.\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        autoNearFar = true // bound to userData so that it's saved in the glb.\n\n    /**\n     * Minimum near clipping plane allowed. (Distance from camera)\n     * Used in RootScene when {@link autoNearFar} is true.\n     * @default undefined (0.5 is used internally)\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        minNearPlane?: number = undefined\n\n    /**\n     * Maximum far clipping plane allowed. (Distance from camera)\n     * Used in RootScene when {@link autoNearFar} is `true`.\n     * @default undefined (1000 is used internally)\n     */\n    @bindToValue({obj: 'userData', onChange: 'setDirty'})\n        maxFarPlane?: number = undefined\n\n    constructor(controlsMode?: TCameraControlsMode, domElement?: HTMLCanvasElement, autoAspect?: boolean, frustumSize?: number, left?: number, right?: number, top?: number, bottom?: number, near?: number, far?: number, aspect?: number) {\n        super(left, right, top, bottom, near, far)\n        this._canvas = domElement\n        this.aspect = aspect || 1\n        this._frustumSize = frustumSize ?? 4\n        this.autoAspect = autoAspect ?? !!domElement\n\n        iCameraCommons.upgradeCamera.call(this) // todo: test if autoUpgrade = false works as expected if we call upgradeObject3D externally after constructor, because we have setDirty, refreshTarget below.\n\n        this.controlsMode = controlsMode || ''\n\n        this.refreshTarget(undefined, false)\n        this.refreshFrustum(false)\n\n        // if (!camera)\n        //     this.targetUpdated(false)\n        this.setDirty()\n\n\n        // if (domElement)\n        //     domElement.style.touchAction = 'none' // this is done in orbit controls anyway\n\n        // this.refreshCameraControls() // this is done on set controlsMode\n        // const target = this.target\n\n    }\n\n    private _interactionsDisabledBy = new Set<string>()\n\n    /**\n     * If interactions are enabled for this camera. It can be disabled by some code or plugin.\n     * see also {@link setInteractions}\n     * @deprecated use {@link canUserInteract} to check if the user can interact with this camera\n     * @readonly\n     */\n    get interactionsEnabled(): boolean {\n        return this._interactionsDisabledBy.size === 0\n    }\n\n    setInteractions(enabled: boolean, by: string): void {\n        const size = this._interactionsDisabledBy.size\n        if (enabled) {\n            this._interactionsDisabledBy.delete(by)\n        } else {\n            this._interactionsDisabledBy.add(by)\n        }\n        if (size !== this._interactionsDisabledBy.size) this.refreshCameraControls(true)\n    }\n\n    get canUserInteract() {\n        return this._interactionsDisabledBy.size === 0 && this.isMainCamera && this.controlsMode !== ''\n    }\n\n    // endregion\n\n    // region refreshing\n\n    setDirty(options?: ICameraSetDirtyOptions): void {\n        iCameraCommons.setDirty.call(this, options)\n\n        if (options?.last !== false)\n            this._camUi?.forEach(u=>u?.uiRefresh?.(false, 'postFrame', 1)) // because camera changes a lot. so we dont want to deep refresh ui on every change\n    }\n\n    /**\n     * when aspect ratio is set to auto it must be refreshed on resize, this is done by the viewer for the main camera.\n     * @param setDirty\n     */\n    refreshAspect = iCameraCommons.refreshAspect\n\n    refreshUi = iCameraCommons.refreshUi\n    refreshTarget = iCameraCommons.refreshTarget\n    activateMain = iCameraCommons.activateMain\n    deactivateMain = iCameraCommons.deactivateMain\n    updateShaderProperties = iCameraCommons.updateShaderProperties\n\n    refreshFrustum(setDirty = true) {\n        if (this._frustumSize === undefined) return\n        this.top = this._frustumSize / 2\n        this.bottom = -this.top\n        this.left = this.bottom * this.aspect\n        this.right = this.top * this.aspect\n        setDirty && this.setDirty()\n    }\n\n    // endregion\n\n    // region controls\n\n    // todo: move orbit to a plugin maybe? so that its not forced\n    readonly controlsCtors = new Map<string, TControlsCtor>([['orbit', (object, domElement)=>{\n        const elem = domElement ? !domElement.ownerDocument ? domElement.documentElement : domElement : document.body\n        const controls = new OrbitControls3(object, elem)\n        // this._controls.enabled = false\n\n        // set tab index so that we get keyboard events\n        if (elem.tabIndex === -1) {\n            elem.tabIndex = 1000\n            // disable focus outline\n            elem.style.outline = 'none'\n        }\n\n        controls.listenToKeyEvents(elem) // optional // todo: make option for this\n        // controls.enableKeys = true\n        controls.screenSpacePanning = true\n        return controls\n    }]])\n    setControlsCtor(key: string, ctor: TControlsCtor, replace = false): void {\n        if (!replace && this.controlsCtors.has(key)) {\n            console.error('OrthographicCamera2: ' + key + ' already exists.')\n            return\n        }\n        this.controlsCtors.set(key, ctor)\n    }\n    removeControlsCtor(key: string): void {\n        this.controlsCtors.delete(key)\n    }\n\n    private _controlsChanged = ()=>{\n        if (this._controls && this._controls.target) this.refreshTarget(undefined, false)\n        this.setDirty({change: 'controls'})\n    }\n\n    private _initCameraControls() {\n        const mode = this.controlsMode\n        this._controls = this.controlsCtors.get(mode)?.(this, this._canvas) ?? undefined\n        if (!this._controls && mode !== '') console.error('ICamera - Unable to create controls with mode ' + mode + '. Are you missing a plugin?')\n        this._controls?.addEventListener && this._controls.addEventListener('change', this._controlsChanged)\n        this._currentControlsMode = this._controls ? mode : ''\n        // todo maybe set target like this:\n        //  if (this._controls) this._controls.target = this.target\n    }\n\n    private _disposeCameraControls() {\n        if (this._controls) {\n            if (this._controls.target === this.target) this._controls.target = new Vector3() // just in case\n            this._controls.removeEventListener && this._controls.removeEventListener('change', this._controlsChanged)\n            this._controls.dispose && this._controls.dispose()\n        }\n        this._currentControlsMode = ''\n        this._controls = undefined\n    }\n\n    refreshCameraControls(setDirty = true): void {\n        if (!this.controlsCtors) return // class not initialized\n        if (this._controls) {\n            if (this._currentControlsMode !== this.controlsMode ||\n                this !== this._controls.object ||\n                this._controls.domElement && this._canvas !== this._controls.domElement\n            ) { // in-case camera changed or mode changed\n                this._disposeCameraControls()\n                this._initCameraControls()\n            }\n        } else {\n            this._initCameraControls()\n        }\n\n        // todo: only for orbit control like controls?\n        if (this._controls) {\n            const ce = this.canUserInteract\n            this._controls.enabled = ce\n            if (ce) this.up.copy(Object3D.DEFAULT_UP)\n        }\n\n        if (setDirty) this.setDirty()\n        this.refreshUi()\n    }\n\n    // endregion\n\n    // region serialization\n\n    /**\n     * Serializes this camera with controls to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer\n     */\n    toJSON(meta?: any, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    fromJSON(data: any, meta?: any): this | null {\n        ThreeSerialization.Deserialize(data, this, meta, true)\n        this.setDirty({change: 'deserialize'})\n        return this\n    }\n\n    // endregion\n\n    // region camera views\n\n    getView = iCameraCommons.getView\n    setView = iCameraCommons.setView\n    fitObject = iCameraCommons.fitObject\n    setViewFromCamera = iCameraCommons.setViewFromCamera\n    setViewToMain = iCameraCommons.setViewToMain;\n\n    // endregion\n\n    // region utils/others\n\n    // for shader prop updater\n    ['_positionWorld'] = new Vector3()\n\n    dispose(): void {\n        this._disposeCameraControls()\n        // todo: anything else?\n        // iObjectCommons.dispose and dispatch event dispose is called automatically because of updateObject3d\n    }\n\n    setCanvas(canvas: HTMLCanvasElement|undefined, refresh = true) {\n        this._canvas = canvas\n        if (!refresh) return\n        this.refreshCameraControls()\n        this.refreshAspect(false)\n    }\n\n    // endregion\n\n    // region ui\n\n    private _camUi: UiObjectConfig[] = [\n        ...generateUiConfig(this) || [],\n        ...makeICameraCommonUiConfig.call(this),\n        objectExtensionsUiConfig.call(this),\n    ]\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: ()=>this.name || 'Camera',\n        children: [\n            ...this._camUi,\n            ()=>this._controls?.uiConfig,\n        ],\n    }\n\n    // endregion\n\n    // region deprecated/old\n\n    @onChange((k: string, v: boolean)=>{\n        if (!v) console.warn('Setting camera invisible is not supported', k, v)\n    })\n    declare visible: boolean\n\n    get isActiveCamera(): boolean {\n        return this.isMainCamera\n    }\n    /**\n     * @deprecated use `<T>camera.controls` instead\n     */\n    getControls<T extends ICameraControls>(): T|undefined {\n        return this._controls as any as T\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get cameraObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated - use setDirty directly\n     * @param setDirty\n     */\n    targetUpdated(setDirty = true): void {\n        if (setDirty) this.setDirty()\n    }\n\n    // endregion\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare copy: (source: ICamera|Camera|IObject3D, recursive?: boolean, distanceFromTarget?: number, worldSpace?: boolean) => this\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n\n/**\n * Empty class with the constructor same as OrthographicCamera in three.js.\n * This can be used to remain compatible with three.js construct signature.\n */\nexport class OrthographicCamera0 extends OrthographicCamera2 {\n    constructor(left?: number, right?: number, top?: number, bottom?: number, near?: number, far?: number) {\n        super(undefined, undefined, undefined, undefined, left, right, top, bottom, near, far, 1)\n        if (near !== undefined || far) {\n            this.autoNearFar = false\n            if (near) {\n                this.near = near\n                this.minNearPlane = near\n            }\n            if (far) {\n                this.far = far\n                this.maxFarPlane = far\n            }\n        }\n    }\n}\n","import {ShaderMaterial2} from './ShaderMaterial2'\nimport {getTexelDecoding} from '../../three'\nimport {\n    BufferGeometry,\n    Camera,\n    ColorSpace, Group,\n    IUniform,\n    LinearSRGBColorSpace,\n    Object3D,\n    Scene,\n    ShaderMaterialParameters,\n    Vector2,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {shaderReplaceString} from '../../utils'\nimport {IMaterialEventMap, IMaterialUserData} from '../IMaterial'\n\n// earlier it was ShaderMaterialEncodingSupport\nexport class ExtendedShaderMaterial<TE extends IMaterialEventMap = IMaterialEventMap> extends ShaderMaterial2<TE & IMaterialEventMap> {\n    declare ['constructor']: (typeof ExtendedShaderMaterial) & (typeof ShaderMaterial2)\n\n    textures: {colorSpace: ColorSpace, id: string}[] = []\n\n    declare userData: IMaterialUserData\n\n    constructor(parameters: ShaderMaterialParameters, textureIds: string[], isRawShaderMaterial = false) {\n        super(parameters, isRawShaderMaterial)\n        this.setTextureIds(textureIds)\n    }\n\n    setTextureIds(ids: string[]) {\n        if (this.textures.map(t=>t.id).join(';') !== ids.join(';')) {\n            this.textures = ids.map(t=>({id: t, colorSpace: LinearSRGBColorSpace}))\n            this.setDirty()\n        }\n    }\n\n    private _setUniformTexSize(uniform?: IUniform, t?: {width: number, height: number}) {\n        if (!t || !uniform) return\n        const w = t?.width ?? 512\n        const h = t?.height ?? 512\n        const last = uniform.value\n        if (!last.isVector2) console.warn('uniform is not a Vector2')\n        if (last && Math.abs(last.x - w) + Math.abs(last.y - h) > 0.1) {\n            last.x = w; last.y = h\n            this.uniformsNeedUpdate = true\n        }\n    }\n\n    onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group): void {\n        this.uniforms.screenSize && this._setUniformTexSize(this.uniforms.screenSize, renderer.getRenderTarget() ?? renderer.getSize(new Vector2()))\n\n        for (const item of this.textures) {\n            const textureID = item.id\n            const t = this.uniforms[textureID]?.value\n            if (t) {\n                this._setUniformTexSize(this.uniforms[textureID + 'Size'], t.image)\n                if (t.colorSpace !== item.colorSpace) {\n                    item.colorSpace = t.colorSpace\n                    this.needsUpdate = true\n                }\n            }\n        }\n\n        super.onBeforeRender(renderer, scene, camera, geometry, object, group)\n    }\n\n    onBeforeCompile(s: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer) {\n        const pars = '\\n' + this.textures\n            .map(t=>`uniform sampler2D ${t.id}; \\n`\n                    + getTexelDecoding(t.id ?? 'input', t.colorSpace)).join('\\n')\n\n        if (s.fragmentShader.includes('#include <encodings_pars_fragment>')) {\n            s.fragmentShader = shaderReplaceString(s.fragmentShader, '#include <encodings_pars_fragment>', pars, {append: true})\n        } else if (s.fragmentShader.includes('precision highp float;')) {\n            s.fragmentShader = shaderReplaceString(s.fragmentShader, 'precision highp float;', pars, {append: true})\n        } else {\n            s.fragmentShader = pars + s.fragmentShader\n        }\n        super.onBeforeCompile(s, renderer)\n    }\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + this.textures.map(t=>t.id + t.colorSpace).join(';')\n    }\n\n}\n","import {generateUiConfig, UiObjectConfig} from 'uiconfig.js'\nimport {\n    BufferGeometry,\n    Camera,\n    Color, Euler, Group,\n    IUniform,\n    Material,\n    MeshPhysicalMaterial,\n    MeshPhysicalMaterialParameters,\n    Object3D,\n    Scene,\n    TangentSpaceNormalMap,\n    Vector2,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {shaderReplaceString} from '../../utils/shader-helpers'\nimport {ThreeSerialization, type SerializationMetaType} from '../../utils/serialization'\nimport type {AnimateTime} from '../../utils/lerp'\nimport {\n    IMaterial,\n    IMaterialEventMap,\n    IMaterialParameters,\n    IMaterialUserData,\n} from '../IMaterial'\nimport {MaterialExtension} from '../../materials'\nimport {iMaterialCommons} from './iMaterialCommons'\nimport {IObject3D} from '../IObject'\nimport {ITexture} from '../ITexture'\nimport {iMaterialUI} from './IMaterialUi'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\n\n/**\n * And extension of three.js MeshPhysicalMaterial that can be assigned to objects, and support threepipe features, uiconfig, and serialization.\n *\n * @category Materials\n */\nexport class PhysicalMaterial<TE extends IMaterialEventMap = IMaterialEventMap> extends MeshPhysicalMaterial<TE & IMaterialEventMap> implements IMaterial<TE> {\n    declare ['constructor']: typeof PhysicalMaterial\n    public static readonly TypeSlug = 'pmat'\n    public static readonly TYPE = 'PhysicalMaterial' // not using .type because it is used by three.js\n    public static readonly TypeAlias = ['physical', 'standard', PhysicalMaterial.TYPE, PhysicalMaterial.TypeSlug, 'MeshStandardMaterial', 'MeshStandardMaterial2', 'MeshPhysicalMaterial']\n    static {\n        ThreeSerialization.SerializableMaterials.add(PhysicalMaterial)\n    }\n\n    assetType = 'material' as const\n\n    declare userData: IMaterialUserData\n\n    public readonly isPhysicalMaterial = true\n\n    readonly appliedMeshes: Set<IObject3D> = new Set()\n    readonly setDirty = iMaterialCommons.setDirty\n    dispose(): this {return iMaterialCommons.dispose(super.dispose).call(this)}\n    clone(track = false): this {return iMaterialCommons.clone(super.clone).call(this, track)}\n\n    map: ITexture | null = null\n    alphaMap: ITexture | null = null\n    roughnessMap: ITexture | null = null\n    metalnessMap: ITexture | null = null\n    normalMap: ITexture | null = null\n    bumpMap: ITexture | null = null\n    displacementMap: ITexture | null = null\n\n\n    constructor({customMaterialExtensions, ...parameters}: MeshPhysicalMaterialParameters & IMaterialParameters = {}) {\n        super()\n        this.fog = false\n        this.attenuationDistance = 0 // infinite distance (for Ui)\n        this.setDirty = this.setDirty.bind(this)\n        if (customMaterialExtensions) this.registerMaterialExtensions(customMaterialExtensions)\n        iMaterialCommons.upgradeMaterial.call(this)\n        this.setValues(parameters)\n    }\n\n    // region Material Extension\n\n    materialExtensions: MaterialExtension[] = []\n    extraUniformsToUpload: Record<string, IUniform> = {}\n    registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + iMaterialCommons.customProgramCacheKey.call(this)\n    }\n\n    onBeforeCompile(shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void { // shader is not Shader but WebglUniforms.getParameters return value type so includes defines\n        const f = [\n            ['vec3 totalDiffuse = ', 'afterModulation'],\n            ['#include <aomap_fragment>', 'beforeModulation'],\n            ['#include <lights_physical_fragment>', 'beforeAccumulation'],\n            ['#include <clipping_planes_fragment>', 'mainStart'],\n        ]\n        const v = [\n            ['#include <uv_vertex>', 'mainStart'],\n        ]\n        for (const vElement of v) shader.vertexShader = shaderReplaceString(shader.vertexShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n        for (const fElement of f) shader.fragmentShader = shaderReplaceString(shader.fragmentShader, fElement[0], '#glMarker ' + fElement[1] + '\\n' + fElement[0])\n\n        // for NaN. todo do the same in Unlit and line materials?\n        shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#include <opaque_fragment>', 'gl_FragColor = clamp(gl_FragColor, 0.0, 1000.0);\\n', {append: true})\n\n        iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n\n        shader.defines && (shader.defines.INVERSE_ALPHAMAP = this.userData.inverseAlphaMap ? 1 : 0)\n\n        super.onBeforeCompile(shader, renderer)\n    }\n\n    onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group): void {\n        super.onBeforeRender(renderer, scene, camera, geometry, object, group)\n        iMaterialCommons.onBeforeRender.call(this, renderer, scene, camera, geometry, object, group)\n\n        const t = this.userData.inverseAlphaMap ? 1 : 0\n        if (t !== this.defines.INVERSE_ALPHAMAP) {\n            this.defines.INVERSE_ALPHAMAP = t\n            this.needsUpdate = true\n        }\n    }\n\n    /**\n     * onAfterRender is called after the material is rendered\n     * @ignore\n     */\n    onAfterRender = iMaterialCommons.onAfterRenderOverride(super.onAfterRender)\n\n    // endregion\n\n\n    // region UI Config\n\n    // todo dispose ui config\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Physical Material',\n        uuid: 'MPM2_' + this.uuid,\n        expanded: true,\n        onChange: (ev)=>{\n            if (!ev.config || ev.config.onChange) return\n            // todo frameFade\n            let key = Array.isArray(ev.config.property) ? ev.config.property[1] : ev.config.property\n            key = typeof key === 'string' ? key : undefined\n            // todo set needsUpdate true only for properties that require it like maps.\n            this.setDirty({uiChangeEvent: ev, needsUpdate: !!ev.last, refreshUi: !!ev.last, change: key})\n        },\n        children: [\n            ...iMaterialUI.base(this),\n            ...generateUiConfig(this),\n            iMaterialUI.blending(this),\n            iMaterialUI.roughMetal(this),\n            iMaterialUI.bumpNormal(this),\n            iMaterialUI.emission(this),\n            iMaterialUI.transmission(this),\n            iMaterialUI.environment(this),\n            iMaterialUI.aoLightMap(this),\n            iMaterialUI.clearcoat(this),\n            iMaterialUI.iridescence(this),\n            iMaterialUI.sheen(this),\n            iMaterialUI.polygonOffset(this),\n            ...iMaterialUI.misc(this),\n        ],\n    }\n\n    // endregion UI Config\n\n\n    // region Serialization\n\n    /**\n     * Sets the values of this material based on the values of the passed material or an object with material properties\n     * The input is expected to be a valid material or a deserialized material parameters object(including the deserialized userdata)\n     * @param parameters - material or material parameters object\n     * @param allowInvalidType - if true, the type of the oldMaterial is not checked. Objects without type are always allowed.\n     * @param clearCurrentUserData - if undefined, then depends on material.isMaterial. if true, the current userdata is cleared before setting the new values, because it can have data which wont be overwritten if not present in the new material.\n     * @param time - optional data to animate(lerp) from current value to the target value.\n     */\n    setValues(parameters: Material|(MeshPhysicalMaterialParameters&{type?:string}), allowInvalidType = true, clearCurrentUserData: boolean|undefined = undefined, time?: AnimateTime): void {\n        if (!parameters) return\n        if (parameters.type && !allowInvalidType && !['MeshPhysicalMaterial', 'MeshStandardMaterial', 'MeshStandardMaterial2', this.constructor.TYPE, this.type].includes(parameters.type)) {\n            console.error('Material type is not supported:', parameters.type)\n            return\n        }\n\n        // Blender exporter used to export a scalar. See three.js:#7459\n        if (typeof (<any>parameters).normalScale === 'number') {\n            (<any>parameters).normalScale = [(<any>parameters).normalScale, (<any>parameters).normalScale]\n        }\n\n        if ((parameters as any).ior !== undefined) this.ior = (parameters as any).ior // ior is not serialized in MeshPhysicalMaterial.toJSON, so we need to set it here\n        iMaterialCommons.setValues(super.setValues).call(this, parameters, allowInvalidType, clearCurrentUserData, time)\n\n        if (!isFinite(this.attenuationDistance)) this.attenuationDistance = 0 // hack for ui\n\n        this.userData.uuid = this.uuid\n    }\n\n    copy(source: Material|any): this {\n        this.setValues(source, false)\n        return this\n    }\n\n    /**\n     * Serializes this material to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer->material\n     */\n    toJSON(meta?: SerializationMetaType, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    /**\n     * Deserializes the material from JSON.\n     * Note: some properties that are not serialized in Material.toJSON when they are default values (like side, alphaTest, blending, maps), they wont be reverted back if not present in JSON\n     * If _internal = true, Textures should be loaded and in meta.textures before calling this method.\n     * @param data\n     * @param meta\n     * @param _internal\n     */\n    fromJSON(data: any, meta?: SerializationMetaType, _internal = false): this | null {\n        if (_internal) {\n            ThreeSerialization.Deserialize(data, this, meta, true)\n            this.setValues(data)\n            return this\n        }\n        this.dispatchEvent({type: 'beforeDeserialize', data, meta, bubbleToObject: true, bubbleToParent: true})\n        return this\n    }\n\n    // endregion\n\n    // used for serialization\n    static readonly MaterialProperties = {\n        // keep updated with properties in MeshStandardMaterial.js\n        ...threeMaterialPropList,\n\n        color: new Color(0xffffff),\n        roughness: 1,\n        metalness: 0,\n        map: null,\n        lightMap: null,\n        lightMapIntensity: 1,\n        aoMap: null,\n        aoMapIntensity: 1,\n        emissive: '#000000',\n        emissiveIntensity: 1,\n        emissiveMap: null,\n        bumpMap: null,\n        bumpScale: 1,\n        normalMap: null,\n        normalMapType: TangentSpaceNormalMap,\n        normalScale: new Vector2(1, 1),\n        displacementMap: null,\n        displacementScale: 1,\n        displacementBias: 0,\n        roughnessMap: null,\n        metalnessMap: null,\n        alphaMap: null,\n        envMap: null,\n        envMapRotation: new Euler(),\n        envMapIntensity: 1,\n        // refractionRatio: 0,\n        wireframe: false,\n        wireframeLinewidth: 1,\n        wireframeLinecap: 'round',\n        wireframeLinejoin: 'round',\n        flatShading: false,\n        fog: true,\n\n        // skinning: false,\n\n        // vertexTangents: false, //removed from threejs\n\n        // morphTargets: false,\n        // morphNormals: false,\n\n        // GLTF Extensions // todo: supported anywhere?\n\n        // glossiness: 0,\n        // glossinessMap: null,\n\n        // specularColor: new Color(0),\n        // specularColorMap: null,\n\n\n\n        // keep updated with properties in MeshPhysicalMaterial.js\n        clearcoat: 0,\n        clearcoatMap: null,\n        clearcoatRoughness: 0,\n        clearcoatRoughnessMap: null,\n        clearcoatNormalScale: new Vector2(1, 1),\n        clearcoatNormalMap: null,\n\n        dispersion: 0,\n\n        reflectivity: 0.5, // because this is used in Material.js->toJSON and fromJSON instead of ior\n\n        iridescence: 0,\n        iridescenceMap: null,\n        iridescenceIOR: 1.3,\n        iridescenceThicknessRange: [100, 400],\n        iridescenceThicknessMap: null,\n\n        sheen: 0,\n        sheenColor: new Color(0x000000),\n        sheenColorMap: null,\n        sheenRoughness: 1.0,\n        sheenRoughnessMap: null,\n\n        transmission: 0,\n        transmissionMap: null,\n        thickness: 0,\n        thicknessMap: null,\n        attenuationDistance: Infinity,\n        attenuationColor: new Color(1, 1, 1),\n\n        specularIntensity: 1.0,\n        specularIntensityMap: null,\n        specularColor: new Color(1, 1, 1),\n        specularColorMap: null,\n\n        anisotropy: 0,\n        anisotropyRotation: 0,\n        anisotropyMap: null,\n    }\n    static readonly MapProperties = [\n        'map',\n        'lightMap',\n        'aoMap',\n        'emissiveMap',\n        'bumpMap',\n        'normalMap',\n        'displacementMap',\n        'roughnessMap',\n        'metalnessMap',\n        'alphaMap',\n        'envMap',\n        // glossinessMap\n        // specularColorMap\n        'clearcoatMap',\n        'clearcoatRoughnessMap',\n        'clearcoatNormalMap',\n        'iridescenceMap',\n        'iridescenceThicknessMap',\n        'sheenColorMap',\n        'sheenRoughnessMap',\n        'transmissionMap',\n        'thicknessMap',\n        'specularIntensityMap',\n        'specularColorMap',\n        'anisotropyMap',\n    ]\n\n\n    static readonly InterpolateProperties = [\n        ...threeMaterialInterpolateProps,\n        'color',\n        'emissive',\n        'roughness',\n        'metalness',\n        'lightMapIntensity',\n        'aoMapIntensity',\n        'emissiveIntensity',\n        'bumpScale',\n        'normalScale',\n        'displacementScale',\n        'displacementBias',\n        'envMapIntensity',\n        'wireframeLinewidth',\n        'reflectivity',\n        'clearcoat',\n        'clearcoatRoughness',\n        'clearcoatNormalScale',\n        'iridescence',\n        'iridescenceIOR',\n        'iridescenceThicknessRange',\n        'sheen',\n        'sheenColor',\n        'sheenRoughness',\n        'transmission',\n        'thickness',\n        'attenuationDistance',\n        'attenuationColor',\n        'specularIntensity',\n        'specularColor',\n        'anisotropy',\n        'anisotropyRotation',\n    ]\n\n}\n\nexport class MeshStandardMaterial2 extends PhysicalMaterial {\n    constructor(parameters?: MeshPhysicalMaterialParameters) {\n        super(parameters)\n        console.error('MeshStandardMaterial2 is deprecated, use UnlitMaterial instead')\n    }\n}\n","import {\n    IUniform,\n    Material,\n    ShaderMaterial,\n    ShaderMaterialParameters,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {generateUiConfig, UiObjectConfig} from 'uiconfig.js'\nimport {\n    IMaterial,\n    IMaterialEventMap,\n    IMaterialParameters,\n    IMaterialUserData,\n} from '../IMaterial'\nimport {MaterialExtension} from '../../materials'\nimport {AnimateTime, SerializationMetaType, ThreeSerialization} from '../../utils'\nimport {iMaterialCommons} from './iMaterialCommons'\nimport {IObject3D} from '../IObject'\nimport {iMaterialUI} from './IMaterialUi'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\n\n/**\n * And extension of three.js ShaderMaterial that can be assigned to objects, and support threepipe features, uiconfig, and serialization.\n *\n * @category Materials\n */\nexport class ObjectShaderMaterial<TE extends IMaterialEventMap = IMaterialEventMap> extends ShaderMaterial<TE & IMaterialEventMap> implements IMaterial<TE> {\n    declare ['constructor']: typeof ObjectShaderMaterial\n\n    public static readonly TypeSlug = 'shmat'\n    public static readonly TYPE = 'ObjectShaderMaterial' // not using .type because it is used by three.js\n    public static readonly TypeAlias = ['shader', ObjectShaderMaterial.TYPE, ObjectShaderMaterial.TypeSlug, 'ShaderMaterial']\n    static {\n        ThreeSerialization.SerializableMaterials.add(ObjectShaderMaterial)\n    }\n\n    assetType = 'material' as const\n\n    declare userData: IMaterialUserData\n\n    public readonly isObjectShaderMaterial = true\n\n    readonly appliedMeshes: Set<IObject3D> = new Set()\n    readonly setDirty = iMaterialCommons.setDirty\n    dispose(): this {return iMaterialCommons.dispose(super.dispose).call(this)}\n    clone(track = false): this {return iMaterialCommons.clone(super.clone).call(this, track)}\n\n    // envMap: ITexture | null = null\n\n    constructor({customMaterialExtensions, ...parameters}: ShaderMaterialParameters & IMaterialParameters = {}) {\n        super()\n        !this.defines && (this.defines = {})\n        this.fog = false\n        this.setDirty = this.setDirty.bind(this)\n        if (customMaterialExtensions) this.registerMaterialExtensions(customMaterialExtensions)\n        iMaterialCommons.upgradeMaterial.call(this)\n        this.setValues(parameters)\n    }\n\n    // region Material Extension\n\n    materialExtensions: MaterialExtension[] = []\n    extraUniformsToUpload: Record<string, IUniform> = {}\n    registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + iMaterialCommons.customProgramCacheKey.call(this)\n    }\n\n    onBeforeCompile(shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void { // shader is not Shader but WebglUniforms.getParameters return value type so includes defines\n        // const f = [\n        //     ['vec3 outgoingLight = ', 'afterModulation'], // added markers before found substring\n        //     ['#include <aomap_fragment>', 'beforeModulation'],\n        //     ['ReflectedLight reflectedLight = ', 'beforeAccumulation'],\n        //     ['#include <clipping_planes_fragment>', 'mainStart'],\n        // ]\n        // const v = [\n        //     ['#include <uv_vertex>', 'mainStart'],\n        // ]\n        //\n        // for (const vElement of v) shader.vertexShader = shaderReplaceString(shader.vertexShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n        // for (const vElement of f) shader.fragmentShader = shaderReplaceString(shader.fragmentShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n\n        iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n        // shader.defines.INVERSE_ALPHAMAP = this.userData.inverseAlphaMap ? 1 : 0\n\n        super.onBeforeCompile(shader, renderer)\n    }\n\n    // onBeforeRender(...args: Parameters<IMaterial['onBeforeRender']>): void {\n    //     super.onBeforeRender(...args)\n    //     iMaterialCommons.onBeforeRender.call(this, ...args)\n    // }\n\n    /** @ignore */\n    onBeforeRender = iMaterialCommons.onBeforeRenderOverride(super.onBeforeRender)\n    /** @ignore */\n    onAfterRender = iMaterialCommons.onAfterRenderOverride(super.onAfterRender)\n\n    // endregion\n\n    // region Serialization\n\n    /**\n     * Sets the values of this material based on the values of the passed material or an object with material properties\n     * The input is expected to be a valid material or a deserialized material parameters object(including the deserialized userdata)\n     * @param parameters - material or material parameters object\n     * @param allowInvalidType - if true, the type of the oldMaterial is not checked. Objects without type are always allowed.\n     * @param clearCurrentUserData - if undefined, then depends on material.isMaterial. if true, the current userdata is cleared before setting the new values, because it can have data which wont be overwritten if not present in the new material.\n     * @param time - optional data to animate(lerp) from current value to the target value.\n     */\n    setValues(parameters: Material|(ShaderMaterialParameters&{type?:string}), allowInvalidType = true, clearCurrentUserData: boolean|undefined = undefined, time?: AnimateTime): this {\n        if (!parameters) return this\n        if (parameters.type && !allowInvalidType && !['ShaderMaterial', 'ShaderMaterial2', 'ExtendedShaderMaterial', this.constructor.TYPE, this.type].includes(parameters.type)) {\n            console.error('Material type is not supported:', parameters.type)\n            return this\n        }\n        iMaterialCommons.setValues(super.setValues).call(this, parameters, allowInvalidType, clearCurrentUserData, time)\n\n        this.userData.uuid = this.uuid\n        return this\n    }\n    copy(source: Material|any): this {\n        return this.setValues(source, false)\n    }\n\n    /**\n     * Serializes this material to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer->material\n     */\n    toJSON(meta?: SerializationMetaType, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    /**\n     * Deserializes the material from JSON.\n     * Textures should be loaded and in meta.textures before calling this method.\n     * todo - needs to be tested\n     * @param data\n     * @param meta\n     * @param _internal\n     */\n    fromJSON(data: any, meta?: SerializationMetaType, _internal = false): this | null {\n        if (_internal) {\n            ThreeSerialization.Deserialize(data, this, meta, true)\n            return this.setValues(data)\n        }\n        this.dispatchEvent({type: 'beforeDeserialize', data, meta, bubbleToObject: true, bubbleToParent: true})\n        return this\n    }\n\n    // endregion\n\n    // region UI Config\n\n    // todo dispose ui config\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Shader Material',\n        uuid: 'OSM2_' + this.uuid,\n        expanded: true,\n        onChange: (ev)=>{\n            if (!ev.config || ev.config.onChange) return\n            let key = Array.isArray(ev.config.property) ? ev.config.property[1] : ev.config.property\n            key = typeof key === 'string' ? key : undefined\n            // todo set needsUpdate true only for properties that require it like maps.\n            this.setDirty({uiChangeEvent: ev, needsUpdate: !!ev.last, refreshUi: !!ev.last, change: key})\n        },\n        children: [\n            ...generateUiConfig(this),\n            ...iMaterialUI.base(this),\n            iMaterialUI.blending(this),\n            iMaterialUI.polygonOffset(this),\n            ...iMaterialUI.misc(this),\n        ],\n    }\n\n    // endregion UI Config\n\n\n    // Class properties can also be listed with annotations like @serialize or @property\n    // used for serialization // todo change for shadermaterial\n    static readonly MaterialProperties = {\n        ...threeMaterialPropList,\n\n        defines: {},\n        uniforms: {},\n        uniformsGroups: [],\n\n        vertexShader: '',\n        fragmentShader: '',\n\n        linewidth: 1,\n\n        wireframe: false,\n        wireframeLinewidth: 1,\n\n        fog: false, // set to use scene fog\n        lights: false, // set to use scene lights\n        clipping: false, // set to use user-defined clipping planes\n\n        forceSinglePass: true,\n\n        extensions: {\n            derivatives: false, // set to use derivatives\n            fragDepth: false, // set to use fragment depth values\n            drawBuffers: false, // set to use draw buffers\n            shaderTextureLOD: false, // set to use shader texture LOD\n        },\n\n        // When rendered geometry doesn't include these attributes but the material does,\n        // use these default values in WebGL. This avoids errors when buffer data is missing.\n        defaultAttributeValues: {\n            'color': [1, 1, 1],\n            'uv': [0, 0],\n            'uv1': [0, 0],\n        },\n\n        index0AttributeName: undefined,\n        uniformsNeedUpdate: false,\n\n        glslVersion: null,\n        flatShading: false,\n    }\n\n    static readonly InterpolateProperties = [\n        ...threeMaterialInterpolateProps,\n        'linewidth',\n        'wireframeLinewidth',\n    ]\n}\n\n// todo gltf material extension\n","import {\n    Color,\n    IUniform,\n    LineBasicMaterial,\n    LineBasicMaterialParameters,\n    Material,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {\n    IMaterial,\n    IMaterialEventMap,\n    IMaterialParameters,\n    IMaterialUserData,\n} from '../IMaterial'\nimport {MaterialExtension} from '../../materials'\nimport {AnimateTime, SerializationMetaType, shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {iMaterialCommons} from './iMaterialCommons'\nimport {IObject3D} from '../IObject'\nimport {makeSamplerUi} from '../../ui/image-ui'\nimport {iMaterialUI} from './IMaterialUi'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\n\n/**\n * And extension of three.js LineBasicMaterial that can be assigned to lines, and support threepipe features, uiconfig, and serialization.\n *\n * @category Materials\n */\nexport class UnlitLineMaterial<TE extends IMaterialEventMap = IMaterialEventMap> extends LineBasicMaterial<TE & IMaterialEventMap> implements IMaterial<TE> {\n    declare ['constructor']: typeof UnlitLineMaterial\n\n    public static readonly TypeSlug = 'blmat'\n    public static readonly TYPE = 'UnlitLineMaterial' // not using .type because it is used by three.js\n    public static readonly TypeAlias = ['unlitline', 'basicline', UnlitLineMaterial.TYPE, UnlitLineMaterial.TypeSlug, 'LineBasicMaterial']\n    static {\n        ThreeSerialization.SerializableMaterials.add(UnlitLineMaterial)\n    }\n\n    assetType = 'material' as const\n\n    declare userData: IMaterialUserData\n\n    public readonly isUnlitLineMaterial = true\n\n    readonly appliedMeshes: Set<IObject3D> = new Set()\n    readonly setDirty = iMaterialCommons.setDirty\n    dispose(): this {return iMaterialCommons.dispose(super.dispose).call(this)}\n    clone(track = false): this {return iMaterialCommons.clone(super.clone).call(this, track)}\n\n    constructor({customMaterialExtensions, ...parameters}: LineBasicMaterialParameters & IMaterialParameters = {}) {\n        super()\n        !this.defines && (this.defines = {})\n        this.fog = false\n        this.setDirty = this.setDirty.bind(this)\n        if (customMaterialExtensions) this.registerMaterialExtensions(customMaterialExtensions)\n        iMaterialCommons.upgradeMaterial.call(this)\n        this.setValues(parameters)\n    }\n\n    // region Material Extension\n\n    materialExtensions: MaterialExtension[] = []\n    extraUniformsToUpload: Record<string, IUniform> = {}\n    registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + iMaterialCommons.customProgramCacheKey.call(this)\n    }\n\n    onBeforeCompile(shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void { // shader is not Shader but WebglUniforms.getParameters return value type so includes defines\n        const f = [\n            ['vec3 outgoingLight = ', 'afterModulation'], // added markers before found substring\n            ['#include <aomap_fragment>', 'beforeModulation'],\n            ['ReflectedLight reflectedLight = ', 'beforeAccumulation'],\n            ['#include <clipping_planes_fragment>', 'mainStart'],\n        ]\n        const v = [\n            ['#include <uv_vertex>', 'mainStart'],\n        ]\n\n        for (const vElement of v) shader.vertexShader = shaderReplaceString(shader.vertexShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n        for (const vElement of f) shader.fragmentShader = shaderReplaceString(shader.fragmentShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n\n        iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n\n        super.onBeforeCompile(shader, renderer)\n    }\n\n    /** @ignore */\n    onBeforeRender = iMaterialCommons.onBeforeRenderOverride(super.onBeforeRender)\n    /** @ignore */\n    onAfterRender = iMaterialCommons.onAfterRenderOverride(super.onAfterRender)\n\n    // endregion\n\n    // region Serialization\n\n    /**\n     * Sets the values of this material based on the values of the passed material or an object with material properties\n     * The input is expected to be a valid material or a deserialized material parameters object(including the deserialized userdata)\n     * @param parameters - material or material parameters object\n     * @param allowInvalidType - if true, the type of the oldMaterial is not checked. Objects without type are always allowed.\n     * @param clearCurrentUserData - if undefined, then depends on material.isMaterial. if true, the current userdata is cleared before setting the new values, because it can have data which won't be overwritten if not present in the new material.\n     * @param time - optional data to animate(lerp) from current value to the target value.\n     */\n    setValues(parameters: Material|(LineBasicMaterialParameters&{type?:string}), allowInvalidType = true, clearCurrentUserData: boolean|undefined = undefined, time?: AnimateTime): this {\n        if (!parameters) return this\n        if (parameters.type && !allowInvalidType && !['LineBasicMaterial', 'LineBasicMaterial2', this.constructor.TYPE, this.type].includes(parameters.type)) {\n            console.error('Material type is not supported:', parameters.type)\n            return this\n        }\n        iMaterialCommons.setValues(super.setValues).call(this, parameters, allowInvalidType, clearCurrentUserData, time)\n\n        this.userData.uuid = this.uuid\n        return this\n    }\n    copy(source: Material|any): this {\n        return this.setValues(source, false)\n    }\n\n    /**\n     * Serializes this material to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer->material\n     */\n    toJSON(meta?: SerializationMetaType, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    /**\n     * Deserializes the material from JSON.\n     * Textures should be loaded and in meta.textures before calling this method.\n     * todo - needs to be tested\n     * @param data\n     * @param meta\n     * @param _internal\n     */\n    fromJSON(data: any, meta?: SerializationMetaType, _internal = false): this | null {\n        if (_internal) {\n            ThreeSerialization.Deserialize(data, this, meta, true)\n            return this.setValues(data)\n        }\n        this.dispatchEvent({type: 'beforeDeserialize', data, meta, bubbleToObject: true, bubbleToParent: true})\n        return this\n    }\n\n    // endregion\n\n    // region UI Config\n\n    // todo dispose ui config\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Unlit Line Material',\n        uuid: 'MBLM2_' + this.uuid,\n        expanded: true,\n        onChange: (ev)=>{\n            if (!ev.config || ev.config.onChange) return\n            let key = Array.isArray(ev.config.property) ? ev.config.property[1] : ev.config.property\n            key = typeof key === 'string' ? key : undefined\n            // todo set needsUpdate true only for properties that require it like maps.\n            this.setDirty({uiChangeEvent: ev, needsUpdate: !!ev.last, refreshUi: !!ev.last, change: key})\n        },\n        children: [\n            {\n                type: 'input',\n                property: [this, 'name'],\n            },\n            // {\n            //     type: 'monitor',\n            //     property: [this, 'uuid'],\n            // },\n            {\n                type: 'checkbox',\n                property: [this, 'vertexColors'],\n            },\n            {\n                type: 'color',\n                property: [this, 'color'],\n            },\n            makeSamplerUi(this, 'map'),\n            {\n                type: 'number',\n                property: [this, 'linewidth'],\n            },\n            {\n                type: 'dropdown',\n                property: [this, 'linecap'],\n                children: ['butt', 'round', 'square'].map(label => ({label})),\n            },\n            {\n                type: 'dropdown',\n                property: [this, 'linejoin'],\n                children: ['bevel', 'round', 'miter'].map(label => ({label})),\n            },\n            // {\n            //     type: 'checkbox',\n            //     property: [this, 'fog'],\n            // },\n            iMaterialUI.blending(this),\n            iMaterialUI.polygonOffset(this),\n            ...iMaterialUI.misc(this),\n        ],\n    }\n\n    // endregion UI Config\n\n\n    // Class properties can also be listed with annotations like @serialize or @property\n    // used for serialization\n    static readonly MaterialProperties = {\n        ...threeMaterialPropList,\n\n        color: new Color(0xffffff),\n        map: null,\n        linewidth: 1,\n        linecap: 'round',\n        linejoin: 'round',\n        fog: true,\n    }\n    static readonly MapProperties = [\n        'map',\n    ]\n\n    static readonly InterpolateProperties = [\n        ...threeMaterialInterpolateProps,\n        'color',\n        'linewidth',\n    ]\n}\n\n/**\n * @deprecated Use {@link UnlitLineMaterial} instead.\n */\nexport class LineBasicMaterial2 extends UnlitLineMaterial {\n    constructor(parameters?: LineBasicMaterialParameters) {\n        super(parameters)\n        console.error('LineBasicMaterial2 is deprecated, use UnlitLineMaterial instead')\n    }\n}\n","import {generateUiConfig, uiColor, uiInput, uiNumber, UiObjectConfig, uiToggle, uiVector} from 'uiconfig.js'\nimport {\n    BufferGeometry,\n    Camera,\n    Color, Group,\n    IUniform,\n    Material,\n    Object3D,\n    Scene,\n    Vector2,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {AnimateTime, SerializationMetaType, shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {\n    IMaterial,\n    IMaterialEventMap,\n    IMaterialParameters,\n    IMaterialUserData,\n} from '../IMaterial'\nimport {MaterialExtension} from '../../materials'\nimport {iMaterialCommons} from './iMaterialCommons'\nimport {IObject3D} from '../IObject'\nimport {iMaterialUI} from './IMaterialUi'\nimport {LineMaterial, type LineMaterialParameters} from 'three/examples/jsm/lines/LineMaterial.js'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\n\n/**\n * And extension of three.js LineMaterial that can be assigned to lines, and support threepipe features, uiconfig, and serialization.\n *\n * @category Materials\n */\nexport class LineMaterial2<TE extends IMaterialEventMap = IMaterialEventMap> extends LineMaterial<TE & IMaterialEventMap> implements IMaterial<TE> {\n    declare ['constructor']: typeof LineMaterial2\n    public static readonly TypeSlug = 'lmat'\n    public static readonly TYPE = 'LineMaterial2' // not using .type because it is used by three.js\n    public static readonly TypeAlias = ['line', LineMaterial2.TYPE, LineMaterial2.TypeSlug, 'LineMaterial']\n    static {\n        ThreeSerialization.SerializableMaterials.add(LineMaterial2)\n    }\n\n    assetType = 'material' as const\n\n    declare userData: IMaterialUserData\n\n    public readonly isLineMaterial2 = true\n\n    readonly appliedMeshes: Set<IObject3D> = new Set()\n    readonly setDirty = iMaterialCommons.setDirty\n    dispose(): this {return iMaterialCommons.dispose(super.dispose).call(this)}\n    clone(track = false): this {return iMaterialCommons.clone(super.clone).call(this, track)}\n\n    constructor({customMaterialExtensions, ...parameters}: LineMaterialParameters & IMaterialParameters = {}) {\n        super()\n        this.fog = false\n        this.setDirty = this.setDirty.bind(this)\n        if (customMaterialExtensions) this.registerMaterialExtensions(customMaterialExtensions)\n        iMaterialCommons.upgradeMaterial.call(this)\n        this.setValues(parameters)\n    }\n\n    // region Material Extension\n\n    materialExtensions: MaterialExtension[] = []\n    extraUniformsToUpload: Record<string, IUniform> = {}\n    registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + iMaterialCommons.customProgramCacheKey.call(this)\n    }\n\n    onBeforeCompile(shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void { // shader is not Shader but WebglUniforms.getParameters return value type so includes defines\n        const f = [\n            ['vec4 diffuseColor = ', 'beforeAccumulation'],\n            ['#include <clipping_planes_fragment>', 'mainStart'],\n        ]\n        const v = [\n            ['#ifdef USE_COLOR', 'mainStart'],\n        ]\n        for (const vElement of v) shader.vertexShader = shaderReplaceString(shader.vertexShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n        for (const fElement of f) shader.fragmentShader = shaderReplaceString(shader.fragmentShader, fElement[0], '#glMarker ' + fElement[1] + '\\n' + fElement[0])\n\n        iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n\n        super.onBeforeCompile(shader, renderer)\n    }\n\n    autoUpdateResolution = true\n\n    onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group): void {\n        if (this.autoUpdateResolution) renderer.getSize(this.resolution)\n        super.onBeforeRender(renderer, scene, camera, geometry, object, group)\n        iMaterialCommons.onBeforeRender.call(this, renderer, scene, camera, geometry, object, group)\n    }\n\n    onAfterRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group): void {\n        super.onAfterRender(renderer, scene, camera, geometry, object, group)\n        iMaterialCommons.onAfterRender.call(this, renderer, scene, camera, geometry, object, group)\n    }\n\n    // endregion\n\n\n    // region UI Config\n\n    @uiInput() declare name: string\n    @uiColor() declare color: Color\n    @uiToggle() declare dashed: boolean\n    @uiNumber() declare dashScale: number\n    @uiNumber() declare dashSize: number\n    @uiNumber() declare dashOffset: number\n    @uiNumber() declare gapSize: number\n    @uiNumber() declare linewidth: number\n    @uiVector() declare resolution: Vector2\n    @uiToggle() declare alphaToCoverage: boolean\n    @uiToggle() declare worldUnits: boolean\n    // @uiToggle() declare fog = true\n\n\n    // todo dispose ui config\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Line Material',\n        uuid: 'MPM2_' + this.uuid,\n        expanded: true,\n        onChange: (ev)=>{\n            if (!ev.config || ev.config.onChange) return\n            // this.uniformsNeedUpdate = true\n            // this.appliedMeshes.forEach(m=>{\n            //     if ((m.isLineSegments2 || m.isLineSegments) && m.computeLineDistances) {\n            //         m.computeLineDistances()\n            //     }\n            // })\n            let key = Array.isArray(ev.config.property) ? ev.config.property[1] : ev.config.property\n            key = typeof key === 'string' ? key : undefined\n            // todo set needsUpdate true only for properties that require it like maps.\n            this.setDirty({uiChangeEvent: ev, needsUpdate: !!ev.last, refreshUi: !!ev.last, change: key})\n        },\n        children: [\n            ...generateUiConfig(this) || [],\n            iMaterialUI.blending(this),\n            iMaterialUI.polygonOffset(this),\n            ...iMaterialUI.misc(this),\n        ],\n    }\n\n    // endregion UI Config\n\n\n    // region Serialization\n\n    /**\n     * Sets the values of this material based on the values of the passed material or an object with material properties\n     * The input is expected to be a valid material or a deserialized material parameters object(including the deserialized userdata)\n     * @param parameters - material or material parameters object\n     * @param allowInvalidType - if true, the type of the oldMaterial is not checked. Objects without type are always allowed.\n     * @param clearCurrentUserData - if undefined, then depends on material.isMaterial. if true, the current userdata is cleared before setting the new values, because it can have data which wont be overwritten if not present in the new material.\n     * @param time\n     */\n    setValues(parameters: Material|(LineMaterialParameters&{type?:string}), allowInvalidType = true, clearCurrentUserData: boolean|undefined = undefined, time?: AnimateTime): this {\n        if (!parameters) return this\n        if (parameters.type && !allowInvalidType && !['LineMaterial', this.constructor.TYPE, this.type].includes(parameters.type) && !(parameters as LineMaterial2).isLineMaterial && !(parameters as LineMaterial2).isLineMaterial2) {\n            console.error('Material type is not supported:', parameters.type)\n            return this\n        }\n        iMaterialCommons.setValues(super.setValues).call(this, parameters, allowInvalidType, clearCurrentUserData, time)\n\n        this.userData.uuid = this.uuid\n        return this\n    }\n\n    copy(source: Material|any): this {\n        return this.setValues(source, false)\n    }\n\n    /**\n     * Serializes this material to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer->material\n     */\n    toJSON(meta?: SerializationMetaType, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    /**\n     * Deserializes the material from JSON.\n     * Note: some properties that are not serialized in Material.toJSON when they are default values (like side, alphaTest, blending, maps), they wont be reverted back if not present in JSON\n     * If _internal = true, Textures should be loaded and in meta.textures before calling this method.\n     * @param data\n     * @param meta\n     * @param _internal\n     */\n    fromJSON(data: any, meta?: SerializationMetaType, _internal = false): this | null {\n        if (_internal) {\n            ThreeSerialization.Deserialize(data, this, meta, true)\n            return this.setValues(data) // todo remove this and add @serialize decorator to properties\n        }\n        this.dispatchEvent({type: 'beforeDeserialize', data, meta, bubbleToObject: true, bubbleToParent: true})\n        return this\n    }\n\n    // endregion\n\n    // used for serialization and used in setValues\n    static readonly MaterialProperties = {\n        // keep updated with properties in LineMaterial.js\n        ...threeMaterialPropList,\n\n        color: new Color(0xffffff),\n        dashed: false,\n        dashScale: 1,\n        dashSize: 1,\n        dashOffset: 0,\n        gapSize: 1,\n        linewidth: 1,\n        resolution: new Vector2(1, 1),\n        alphaToCoverage: false,\n        worldUnits: false,\n\n        uniforms: {},\n        defines: {},\n        extensions: {},\n        clipping: false,\n        fog: true,\n        fragmentShader: '',\n        vertexShader: '',\n\n    }\n\n    static readonly InterpolateProperties = [\n        ...threeMaterialInterpolateProps,\n        'color',\n        'dashScale',\n        'dashSize',\n        'dashOffset',\n        'gapSize',\n        'linewidth',\n        'resolution',\n    ]\n\n}\n\nexport class MeshLineMaterial extends LineMaterial2 {}\n","import {\n    Color,\n    IUniform,\n    Material,\n    MeshPhongMaterial,\n    MeshPhongMaterialParameters,\n    MultiplyOperation,\n    Vector2,\n    WebGLProgramParametersWithUniforms,\n    WebGLRenderer,\n} from 'three'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {\n    IMaterial,\n    IMaterialEventMap,\n    IMaterialParameters,\n    IMaterialUserData,\n} from '../IMaterial'\nimport {MaterialExtension} from '../../materials'\nimport {AnimateTime, SerializationMetaType, shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {ITexture} from '../ITexture'\nimport {iMaterialCommons} from './iMaterialCommons'\nimport {IObject3D} from '../IObject'\nimport {iMaterialUI} from './IMaterialUi'\nimport {makeSamplerUi} from '../../ui/image-ui'\nimport {threeMaterialInterpolateProps, threeMaterialPropList} from './threeMaterialPropList'\n\nexport class LegacyPhongMaterial<TE extends IMaterialEventMap = IMaterialEventMap> extends MeshPhongMaterial<TE & IMaterialEventMap> implements IMaterial<TE> {\n    declare ['constructor']: typeof LegacyPhongMaterial\n\n    public static readonly TypeSlug = 'phongmat'\n    public static readonly TYPE = 'LegacyPhongMaterial' // not using .type because it is used by three.js\n    public static readonly TypeAlias = ['phong', LegacyPhongMaterial.TYPE, LegacyPhongMaterial.TypeSlug, 'MeshPhongMaterial']\n    static {\n        ThreeSerialization.SerializableMaterials.add(LegacyPhongMaterial)\n    }\n\n    assetType = 'material' as const\n\n    declare userData: IMaterialUserData\n\n    public readonly isLegacyPhongMaterial = true\n\n    readonly appliedMeshes: Set<IObject3D> = new Set()\n    readonly setDirty = iMaterialCommons.setDirty\n    dispose(): this {return iMaterialCommons.dispose(super.dispose).call(this)}\n    clone(track = false): this {return iMaterialCommons.clone(super.clone).call(this, track)}\n\n    envMap: ITexture | null = null\n\n    constructor({customMaterialExtensions, ...parameters}: MeshPhongMaterialParameters & IMaterialParameters = {}) {\n        super()\n        !this.defines && (this.defines = {})\n        this.fog = false\n        this.setDirty = this.setDirty.bind(this)\n        if (customMaterialExtensions) this.registerMaterialExtensions(customMaterialExtensions)\n        iMaterialCommons.upgradeMaterial.call(this)\n        this.setValues(parameters)\n    }\n\n    // region Material Extension\n\n    materialExtensions: MaterialExtension[] = []\n    extraUniformsToUpload: Record<string, IUniform> = {}\n    registerMaterialExtensions = iMaterialCommons.registerMaterialExtensions\n    unregisterMaterialExtensions = iMaterialCommons.unregisterMaterialExtensions\n\n    customProgramCacheKey(): string {\n        return super.customProgramCacheKey() + iMaterialCommons.customProgramCacheKey.call(this)\n    }\n\n    onBeforeCompile(shader: WebGLProgramParametersWithUniforms, renderer: WebGLRenderer): void { // shader is not Shader but WebglUniforms.getParameters return value type so includes defines\n        const f = [\n            ['vec3 outgoingLight = ', 'afterModulation'], // added markers before found substring\n            ['#include <aomap_fragment>', 'beforeModulation'],\n            ['ReflectedLight reflectedLight = ', 'beforeAccumulation'],\n            ['#include <clipping_planes_fragment>', 'mainStart'],\n        ]\n        const v = [\n            ['#include <uv_vertex>', 'mainStart'],\n        ]\n\n        for (const vElement of v) shader.vertexShader = shaderReplaceString(shader.vertexShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n        for (const vElement of f) shader.fragmentShader = shaderReplaceString(shader.fragmentShader, vElement[0], '#glMarker ' + vElement[1] + '\\n' + vElement[0])\n\n        iMaterialCommons.onBeforeCompile.call(this, shader, renderer)\n        // shader.defines.INVERSE_ALPHAMAP = this.userData.inverseAlphaMap ? 1 : 0 // todo\n\n        super.onBeforeCompile(shader, renderer)\n    }\n\n    // onBeforeRender(...args: Parameters<IMaterial['onBeforeRender']>): void {\n    //     super.onBeforeRender(...args)\n    //     iMaterialCommons.onBeforeRender.call(this, ...args)\n    //\n    //     // const t = this.userData.inverseAlphaMap ? 1 : 0 // todo\n    //     // if (t !== this.defines.INVERSE_ALPHAMAP) {\n    //     //     this.defines.INVERSE_ALPHAMAP = t\n    //     //     this.needsUpdate = true\n    //     // }\n    // }\n    /** @ignore */\n    onBeforeRender = iMaterialCommons.onBeforeRenderOverride(super.onBeforeRender)\n    /** @ignore */\n    onAfterRender = iMaterialCommons.onAfterRenderOverride(super.onAfterRender)\n\n    // endregion\n\n    // region Serialization\n\n    /**\n     * Sets the values of this material based on the values of the passed material or an object with material properties\n     * The input is expected to be a valid material or a deserialized material parameters object(including the deserialized userdata)\n     * @param parameters - material or material parameters object\n     * @param allowInvalidType - if true, the type of the oldMaterial is not checked. Objects without type are always allowed.\n     * @param clearCurrentUserData - if undefined, then depends on material.isMaterial. if true, the current userdata is cleared before setting the new values, because it can have data which wont be overwritten if not present in the new material.\n     * @param time - optional data to animate(lerp) from current value to the target value.\n     */\n    setValues(parameters: Material|(MeshPhongMaterialParameters&{type?:string}), allowInvalidType = true, clearCurrentUserData: boolean|undefined = undefined, time?: AnimateTime): this {\n        if (!parameters) return this\n        if (parameters.type && !allowInvalidType && !['MeshPhongMaterial', 'MeshPhongMaterial2', this.constructor.TYPE, this.type].includes(parameters.type)) {\n            console.error('Material type is not supported:', parameters.type)\n            return this\n        }\n        iMaterialCommons.setValues(super.setValues).call(this, parameters, allowInvalidType, clearCurrentUserData, time)\n\n        this.userData.uuid = this.uuid\n        return this\n    }\n    copy(source: Material|any): this {\n        return this.setValues(source, false)\n    }\n\n    /**\n     * Serializes this material to JSON.\n     * @param meta - metadata for serialization\n     * @param _internal - Calls only super.toJSON, does internal three.js serialization and `@serialize` tags. Set it to true only if you know what you are doing. This is used in Serialization->serializer->material\n     */\n    toJSON(meta?: SerializationMetaType, _internal = false): any {\n        if (_internal) return {\n            ...super.toJSON(meta),\n            ...ThreeSerialization.Serialize(this, meta, true), // this will serialize the properties of this class(like defined with @serialize and @serialize attribute)\n        }\n        return ThreeSerialization.Serialize(this, meta, false) // this will call toJSON again, but with _internal=true, that's why we set isThis to false.\n    }\n\n    /**\n     * Deserializes the material from JSON.\n     * Textures should be loaded and in meta.textures before calling this method.\n     * todo - needs to be tested\n     * @param data\n     * @param meta\n     * @param _internal\n     */\n    fromJSON(data: any, meta?: SerializationMetaType, _internal = false): this | null {\n        if (_internal) {\n            ThreeSerialization.Deserialize(data, this, meta, true)\n            return this.setValues(data)\n        }\n        this.dispatchEvent({type: 'beforeDeserialize', data, meta, bubbleToObject: true, bubbleToParent: true})\n        return this\n    }\n\n    // endregion\n\n    // region UI Config\n\n    // todo dispose ui config\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Phong Material',\n        uuid: 'MBM2_' + this.uuid,\n        expanded: true,\n        onChange: (ev)=>{\n            if (!ev.config || ev.config.onChange) return\n            let key = Array.isArray(ev.config.property) ? ev.config.property[1] : ev.config.property\n            key = typeof key === 'string' ? key : undefined\n            // todo set needsUpdate true only for properties that require it like maps.\n            this.setDirty({uiChangeEvent: ev, needsUpdate: !!ev.last, refreshUi: !!ev.last, change: key})\n        },\n        children: [\n            ...iMaterialUI.base(this),\n            iMaterialUI.blending(this),\n            iMaterialUI.polygonOffset(this),\n            iMaterialUI.aoLightMap(this),\n            {\n                type: 'folder',\n                label: 'Specular',\n                children: [\n                    {\n                        type: 'color',\n                        property: [this, 'specular'],\n                    },\n                    {\n                        type: 'image',\n                        property: [this, 'specularMap'],\n                    },\n                    makeSamplerUi(this, 'specularMap'),\n                    {\n                        type: 'slider',\n                        label: 'Shininess',\n                        property: [this, 'shininess'],\n                        bounds: [0, 100],\n                        stepSize: 0.1,\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Reflectivity',\n                        property: [this, 'reflectivity'],\n                        bounds: [0, 1],\n                        stepSize: 0.01,\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Refraction Ratio',\n                        property: [this, 'refractionRatio'],\n                        bounds: [0, 3],\n                        stepSize: 0.01,\n                    },\n                ],\n            },\n            iMaterialUI.bumpNormal(this),\n            iMaterialUI.emission(this),\n            {\n                type: 'folder',\n                label: 'Env Map',\n                children: [\n                    {\n                        type: 'image',\n                        property: [this, 'envMap'],\n                    },\n                    makeSamplerUi(this, 'envMap'),\n                    {\n                        type: 'slider',\n                        label: 'Env Map Intensity',\n                        property: [this, 'envMapIntensity'],\n                        bounds: [0, 5],\n                        stepSize: 0.01,\n                    },\n                ],\n            },\n            ...iMaterialUI.misc(this),\n        ],\n    }\n\n    // endregion UI Config\n\n\n    // Class properties can also be listed with annotations like @serialize or @property\n    // used for serialization\n    static readonly MaterialProperties = {\n        ...threeMaterialPropList,\n\n        color: new Color(0xffffff),\n        specular: new Color(0x111111),\n        shininess: 30,\n        map: null,\n        lightMap: null,\n        lightMapIntensity: 1,\n        aoMap: null,\n        aoMapIntensity: 1,\n        emissive: new Color(0x000000),\n        emissiveIntensity: 1,\n        emissiveMap: null,\n        bumpMap: null,\n        bumpScale: 1,\n        normalMap: null,\n        normalMapType: 'TangentSpaceNormalMap',\n        normalScale: new Vector2(1, 1),\n        displacementMap: null,\n        displacementScale: 1,\n        displacementBias: 0,\n        specularMap: null,\n        alphaMap: null,\n        envMap: null,\n        combine: MultiplyOperation,\n        envMapIntensity: 1,\n        reflectivity: 1,\n        refractionRatio: 0.98,\n        wireframe: false,\n        wireframeLinewidth: 1,\n        wireframeLinecap: 'round',\n        wireframeLinejoin: 'round',\n        skinning: false,\n        fog: true,\n        flatShading: false,\n    }\n    static readonly MapProperties = [\n        'map',\n        'lightMap',\n        'aoMap',\n        'emissiveMap',\n        'bumpMap',\n        'normalMap',\n        'displacementMap',\n        'specularMap',\n        'alphaMap',\n        'envMap',\n    ]\n\n    static readonly InterpolateProperties = [\n        ...threeMaterialInterpolateProps,\n        'color',\n        'specular',\n        'emissive',\n        'shininess',\n        'lightMapIntensity',\n        'aoMapIntensity',\n        'emissiveIntensity',\n        'bumpScale',\n        'normalScale',\n        'displacementScale',\n        'displacementBias',\n        'envMapIntensity',\n        'reflectivity',\n        'refractionRatio',\n        'wireframeLinewidth',\n    ]\n}\n","import {Object3D} from 'three'\nimport {IObject3D, IObject3DEventMap, IObject3DUserData} from '../IObject'\nimport {iObjectCommons} from './iObjectCommons'\nimport {IGeometry} from '../IGeometry'\nimport {IMaterial} from '../IMaterial'\n\nexport class Object3D2<TE extends IObject3DEventMap = IObject3DEventMap,\n    TG extends IGeometry | undefined = undefined,\n    TM extends IMaterial | IMaterial[] | undefined = undefined\n> extends Object3D<TE> implements IObject3D<TE, TG, TM> {\n    assetType = 'model' as IObject3D['assetType']\n    setDirty = iObjectCommons.setDirty\n    refreshUi = iObjectCommons.refreshUi\n\n    declare geometry: TG\n    declare material: TM\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    constructor() {\n        super()\n        iObjectCommons.upgradeObject3D.call(this)\n    }\n    dispose() {\n        // Override in subclasses\n    }\n\n    declare userData: IObject3DUserData\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n    ['_sChildren']?: Object3D[]\n}\n\n","import {Group, Object3D} from 'three'\nimport {IObject3D, IObject3DEventMap, IObject3DUserData} from '../IObject'\nimport {iObjectCommons} from './iObjectCommons'\nimport {IGeometry} from '../IGeometry'\nimport {IMaterial} from '../IMaterial'\n\nexport class Group2<TE extends IObject3DEventMap = IObject3DEventMap,\n    TG extends IGeometry | undefined = undefined,\n    TM extends IMaterial | IMaterial[] | undefined = undefined\n> extends Group<TE> implements IObject3D<TE, TG, TM> {\n    assetType: IObject3D['assetType'] = 'model' as const\n    setDirty = iObjectCommons.setDirty\n    refreshUi = iObjectCommons.refreshUi\n\n    declare geometry: TG\n    declare material: TM\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    constructor() {\n        super()\n        iObjectCommons.upgradeObject3D.call(this)\n    }\n\n    dispose() {\n        // Override in subclasses\n    }\n\n    declare userData: IObject3DUserData\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n    ['_sChildren']?: Object3D[]\n}\n\n","import {Mesh} from 'three'\nimport {IObject3D, IObject3DEventMap, IObject3DUserData} from '../IObject'\nimport {iObjectCommons} from './iObjectCommons'\nimport {IMaterial} from '../IMaterial'\nimport {IGeometry} from '../IGeometry'\n\nexport class Mesh2<\n    TGeometry extends IGeometry = IGeometry,\n    TMaterial extends IMaterial | IMaterial[] = IMaterial | IMaterial[],\n    TE extends IObject3DEventMap = IObject3DEventMap\n> extends Mesh<TGeometry, TMaterial, TE> implements IObject3D<TE, TGeometry, TMaterial> {\n    assetType = 'model' as const\n    setDirty = iObjectCommons.setDirty\n    refreshUi = iObjectCommons.refreshUi\n\n    declare material: TMaterial\n    declare readonly materials: IMaterial[]\n    declare geometry: TGeometry\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    constructor(geometry?: TGeometry, material?: TMaterial) {\n        super(geometry, material)\n        iObjectCommons.upgradeObject3D.call(this)\n    }\n\n    declare userData: IObject3DUserData\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n    dispose: (removeFromParent?: boolean) => void\n\n    // endregion\n\n}\n\n","import {InstancedMesh} from 'three'\nimport {IObject3D, IObject3DEventMap, IObject3DUserData} from '../IObject'\nimport {iObjectCommons} from './iObjectCommons'\nimport {IMaterial} from '../IMaterial'\nimport {IGeometry} from '../IGeometry'\n\nexport class InstancedMesh2<\n    TGeometry extends IGeometry = IGeometry,\n    TMaterial extends IMaterial | IMaterial[] = IMaterial | IMaterial[],\n    TE extends IObject3DEventMap = IObject3DEventMap\n> extends InstancedMesh<TGeometry, TMaterial, TE> implements IObject3D<TE, TGeometry, TMaterial> {\n    assetType = 'model' as const\n    setDirty = iObjectCommons.setDirty\n    refreshUi = iObjectCommons.refreshUi\n\n    declare material: TMaterial\n    declare readonly materials: IMaterial[]\n    declare geometry: TGeometry\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    constructor(geometry?: TGeometry, material?: TMaterial, count = 1) {\n        super(geometry, material, count)\n        iObjectCommons.upgradeObject3D.call(this)\n    }\n\n    declare userData: IObject3DUserData\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n    dispose: (removeFromParent?: boolean) => this\n\n    // endregion\n\n}\n\n","import { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\n\nclass LineGeometry extends LineSegmentsGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isLineGeometry = true;\n\n\t\tthis.type = 'LineGeometry';\n\n\t}\n\n\tsetPositions( array ) {\n\n\t\t// converts [ x1, y1, z1,  x2, y2, z2, ... ] to pairs format\n\n\t\tconst length = array.length - 3;\n\t\tconst points = new Float32Array( 2 * length );\n\n\t\tfor ( let i = 0; i < length; i += 3 ) {\n\n\t\t\tpoints[ 2 * i ] = array[ i ];\n\t\t\tpoints[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tpoints[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tpoints[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tpoints[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tpoints[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tsuper.setPositions( points );\n\n\t\treturn this;\n\n\t}\n\n\tsetColors( array ) {\n\n\t\t// converts [ r1, g1, b1,  r2, g2, b2, ... ] to pairs format\n\n\t\tconst length = array.length - 3;\n\t\tconst colors = new Float32Array( 2 * length );\n\n\t\tfor ( let i = 0; i < length; i += 3 ) {\n\n\t\t\tcolors[ 2 * i ] = array[ i ];\n\t\t\tcolors[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tcolors[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tcolors[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tcolors[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tcolors[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tsuper.setColors( colors );\n\n\t\treturn this;\n\n\t}\n\n\tfromLine( line ) {\n\n\t\tconst geometry = line.geometry;\n\n\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { LineGeometry };\n","import { LineSegments2 } from '../lines/LineSegments2.js';\nimport { LineGeometry } from '../lines/LineGeometry.js';\nimport { LineMaterial } from '../lines/LineMaterial.js';\n\nclass Line2 extends LineSegments2 {\n\n\tconstructor( geometry = new LineGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLine2 = true;\n\n\t\tthis.type = 'Line2';\n\n\t}\n\n}\n\nexport { Line2 };\n","import {LineGeometry2} from '../geometry/LineGeometry2'\nimport {LineMaterial2} from '../material/LineMaterial2'\nimport {IObject3D, IObject3DEventMap, IObject3DUserData} from '../IObject'\nimport {Line2} from 'three/examples/jsm/lines/Line2.js'\nimport {iObjectCommons} from './iObjectCommons'\nimport {IMaterial} from '../IMaterial'\nimport {UiObjectConfig} from 'uiconfig.js'\n\nexport class MeshLine<\n    TGeometry extends LineGeometry2 = LineGeometry2,\n    TMaterial extends LineMaterial2 = LineMaterial2,\n    TE extends IObject3DEventMap = IObject3DEventMap\n> extends Line2<TGeometry, TMaterial, TE> implements IObject3D<TE, TGeometry, TMaterial> {\n    assetType = 'model' as const\n    setDirty = iObjectCommons.setDirty\n    refreshUi = iObjectCommons.refreshUi\n    public readonly isMeshLine = true\n\n    declare material: TMaterial\n    declare readonly materials: IMaterial[]\n    declare geometry: TGeometry\n    declare uiConfig: UiObjectConfig\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    constructor(geometry?: TGeometry, material?: TMaterial) {\n        super(geometry, material)\n        iObjectCommons.upgradeObject3D.call(this)\n    }\n\n    declare userData: IObject3DUserData\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n    dispose: (removeFromParent?: boolean) => void\n\n    // endregion\n\n}\n\n","import {LineSegmentsGeometry2} from '../geometry/LineSegmentsGeometry2'\nimport {LineMaterial2} from '../material/LineMaterial2'\nimport {IObject3D, IObject3DEventMap, IObject3DUserData} from '../IObject'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {iObjectCommons} from './iObjectCommons'\nimport {IMaterial} from '../IMaterial'\n\nexport class MeshLineSegments<\n    TGeometry extends LineSegmentsGeometry2 = LineSegmentsGeometry2,\n    TMaterial extends LineMaterial2= LineMaterial2,\n    TE extends IObject3DEventMap = IObject3DEventMap\n> extends LineSegments2<TGeometry, TMaterial, TE> implements IObject3D<TE, TGeometry, TMaterial> {\n    assetType = 'model' as const\n    setDirty = iObjectCommons.setDirty\n    refreshUi = iObjectCommons.refreshUi\n    public readonly isMeshLineSegments = true\n\n    declare material: TMaterial\n    declare readonly materials: IMaterial[]\n    declare geometry: TGeometry\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    constructor(geometry?: TGeometry, material?: TMaterial) {\n        super(geometry, material)\n        iObjectCommons.upgradeObject3D.call(this)\n    }\n\n    declare userData: IObject3DUserData\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n    dispose: (removeFromParent?: boolean) => void\n\n    // endregion\n\n}\n","import {BufferGeometry, NormalBufferAttributes, NormalOrGLBufferAttributes} from 'three'\nimport type {IGeometry, IGeometryEventMap, IGeometryUserData} from '../IGeometry'\nimport {iGeometryCommons} from './iGeometryCommons'\nimport type {IObject3D} from '../IObject'\n\nexport class BufferGeometry2<Attributes extends NormalOrGLBufferAttributes = NormalBufferAttributes, TE extends IGeometryEventMap = IGeometryEventMap> extends BufferGeometry<Attributes, TE> implements IGeometry<Attributes, TE> {\n    assetType: 'geometry' // dont set the value here since its checked in upgradeGeometry\n    center2 = iGeometryCommons.center2\n    setDirty = iGeometryCommons.setDirty\n    refreshUi = iGeometryCommons.refreshUi\n    appliedMeshes = new Set<IObject3D>()\n    declare userData: IGeometryUserData\n\n    constructor() {\n        super()\n        iGeometryCommons.upgradeGeometry.call(this)\n    }\n\n}\n\n","import {InterleavedBufferAttribute, NormalBufferAttributes, NormalOrGLBufferAttributes} from 'three'\nimport type {IGeometry, IGeometryEventMap, IGeometryUserData} from '../IGeometry'\nimport {LineGeometry} from 'three/examples/jsm/lines/LineGeometry.js'\nimport {iGeometryCommons} from './iGeometryCommons'\nimport type {IObject3D} from '../IObject'\n\nexport class LineGeometry2<Attributes extends NormalOrGLBufferAttributes = NormalBufferAttributes, TE extends IGeometryEventMap = IGeometryEventMap> extends LineGeometry<Attributes, TE> implements IGeometry<Attributes, TE> {\n    assetType: 'geometry' // dont set the value here since its checked in upgradeGeometry\n    center2 = iGeometryCommons.center2\n    setDirty = iGeometryCommons.setDirty\n    refreshUi = iGeometryCommons.refreshUi\n    appliedMeshes = new Set<IObject3D>()\n    declare userData: IGeometryUserData\n\n    constructor() {\n        super()\n        iGeometryCommons.upgradeGeometry.call(this)\n    }\n\n    getPositions() {\n        return pairsToPoints(this.attributes.instanceStart as InterleavedBufferAttribute)\n    }\n\n    getColors() {\n        return pairsToPoints(this.attributes.instanceColorStart as InterleavedBufferAttribute)\n    }\n\n}\n\n/**\n * converts pairs format back to [ x1, y1, z1,  x2, y2, z2, ... ] format.\n * inverse of LineGeometry.setPositions\n *\n * @param start\n */\nfunction pairsToPoints(start?: InterleavedBufferAttribute) {\n    const segments = start?.data.array\n    if (!segments) return null\n\n    const length = segments.length / 2 + 3\n    const positions = new Float32Array(length)\n\n    positions[0] = segments[0]\n    positions[1] = segments[1]\n    positions[2] = segments[2]\n\n    // every second point from pairs\n    for (let i = 3; i < length; i += 3) {\n\n        const segmentIndex = 2 * i - 3\n        positions[i] = segments[segmentIndex]\n        positions[i + 1] = segments[segmentIndex + 1]\n        positions[i + 2] = segments[segmentIndex + 2]\n\n    }\n\n    return positions\n}\n\n","import {InterleavedBufferAttribute, NormalBufferAttributes, NormalOrGLBufferAttributes} from 'three'\nimport type {IGeometry, IGeometryEventMap, IGeometryUserData} from '../IGeometry'\nimport {LineSegmentsGeometry} from 'three/examples/jsm/lines/LineSegmentsGeometry.js'\nimport {iGeometryCommons} from './iGeometryCommons'\nimport type {IObject3D} from '../IObject'\n\nexport class LineSegmentsGeometry2<Attributes extends NormalOrGLBufferAttributes = NormalBufferAttributes, TE extends IGeometryEventMap = IGeometryEventMap> extends LineSegmentsGeometry<Attributes, TE> implements IGeometry<Attributes, TE> {\n    assetType: 'geometry' // dont set the value here since its checked in upgradeGeometry\n    center2 = iGeometryCommons.center2\n    setDirty = iGeometryCommons.setDirty\n    refreshUi = iGeometryCommons.refreshUi\n    appliedMeshes = new Set<IObject3D>()\n    declare userData: IGeometryUserData\n\n    constructor() {\n        super()\n        iGeometryCommons.upgradeGeometry.call(this)\n    }\n\n    getPositions() {\n        const start = this.attributes.instanceStart as InterleavedBufferAttribute\n        return start?.data.array || null\n    }\n    getColors() {\n        const start = this.attributes.instanceColorStart as InterleavedBufferAttribute\n        return start?.data.array || null\n    }\n\n}\n","import {\n\tWireframeGeometry\n} from 'three';\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\n\nclass WireframeGeometry2 extends LineSegmentsGeometry {\n\n\tconstructor( geometry ) {\n\n\t\tsuper();\n\n\t\tthis.isWireframeGeometry2 = true;\n\n\t\tthis.type = 'WireframeGeometry2';\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( geometry ) );\n\n\t\t// set colors, maybe\n\n\t}\n\n}\n\nexport { WireframeGeometry2 };\n","import {\n    BufferGeometry,\n    NormalBufferAttributes,\n    NormalOrGLBufferAttributes,\n} from 'three'\nimport type {IGeometry, IGeometryEventMap, IGeometryUserData} from '../IGeometry'\nimport {WireframeGeometry2} from 'three/examples/jsm/lines/WireframeGeometry2.js'\nimport {iGeometryCommons} from './iGeometryCommons'\nimport type {IObject3D} from '../IObject'\n\nexport class WireframeGeometry3<Attributes extends NormalOrGLBufferAttributes = NormalBufferAttributes, TE extends IGeometryEventMap = IGeometryEventMap> extends WireframeGeometry2<Attributes, TE> implements IGeometry<Attributes, TE> {\n    assetType: 'geometry' // dont set the value here since its checked in upgradeGeometry\n    center2 = iGeometryCommons.center2\n    setDirty = iGeometryCommons.setDirty\n    refreshUi = iGeometryCommons.refreshUi\n    appliedMeshes = new Set<IObject3D>()\n    declare userData: IGeometryUserData\n\n    constructor(geometry: BufferGeometry) {\n        super(geometry)\n        iGeometryCommons.upgradeGeometry.call(this)\n    }\n}\n","/**\n * TODO: Rewrite properly for threepipe with:\n * - Proper IGeometry implementation (extend BufferGeometry2 or upgrade pattern)\n * - Serialization support (register with ThreeSerialization.SerializableClasses)\n * - UI config integration (generationParams pattern like GeometryGeneratorPlugin)\n * - Dedicated example demonstrating usage with different shapes and curves\n * - Integration with GeometryGeneratorPlugin as a generator type\n * - See ShapeTubeExtrudePlugin (below) for the original webgi plugin that used this\n *\n * TubeShapeGeometry — extrudes a closed 2D Shape along a 3D Curve path.\n *\n * Modified from Three.js TubeGeometry to support arbitrary cross-section shapes\n * instead of just circles. Uses Three.js Curve.computeFrenetFrames() for\n * stable normal computation along the path.\n *\n * Features:\n * - Arbitrary closed Shape as cross-section (not just circles)\n * - Shape scaling via shapeScale Vector2\n * - Primary axis control ('shape' or 'path') for triangle orientation\n * - Edge normal fixing for seamless closed shapes\n * - createSplits() for multi-material groups (e.g., road lanes, curb/sidewalk)\n *\n * Reference: Three.js TubeGeometry source\n * https://github.com/mrdoob/three.js/blob/dev/src/geometries/TubeGeometry.js\n */\n\nimport {BufferAttribute, BufferGeometry, Curve, Float32BufferAttribute, Shape, Vector2, Vector3} from 'three'\n\nexport class TubeShapeGeometry extends BufferGeometry {\n    public frames: {tangents: Vector3[]; normals: Vector3[]; binormals: Vector3[]}\n    public parameters: {\n        path: Curve<Vector3>\n        shape: Shape\n        shapeScale: Vector2\n        shapeSegments: number\n        closed: boolean\n        tubularSegments: number\n        primary: 'shape' | 'path'\n    }\n\n    /**\n     * @param shape — closed 2D shape for the cross-section\n     * @param path — 3D curve to extrude along\n     * @param shapeSegments — subdivisions of the shape cross-section\n     * @param tubularSegments — subdivisions along the path\n     * @param closed — whether the path forms a closed loop\n     * @param shapeScale — scale applied to the shape cross-section\n     * @param primary — 'shape' or 'path', controls triangle orientation for optimal rendering\n     */\n    constructor(\n        shape: Shape,\n        path: Curve<Vector3>,\n        shapeSegments = 32,\n        tubularSegments = 64,\n        closed = false,\n        shapeScale: Vector2 = new Vector2(1, 1),\n        primary: 'shape' | 'path' = 'shape',\n    ) {\n        super()\n        // @ts-expect-error type field override\n        this.type = 'TubeShapeGeometry'\n\n        this.parameters = {\n            path: path,\n            shape: shape,\n            shapeSegments: shapeSegments,\n            tubularSegments: tubularSegments,\n            closed: closed,\n            primary: primary,\n            shapeScale: shapeScale.clone(),\n        }\n\n        const frames = path.computeFrenetFrames(tubularSegments, closed)\n        this.frames = frames\n\n        const vertex = new Vector3()\n        const normal = new Vector3()\n        const normal2 = new Vector3()\n        const uv = new Vector2()\n        let P = new Vector3()\n\n        const vertices: number[] = []\n        const uvs: number[] = []\n        const indices: number[] = []\n\n        const points = shape.getSpacedPoints(shapeSegments)\n        for (const point of points) {\n            point.multiply(shapeScale)\n        }\n\n        generateBufferData()\n\n        this.setIndex(indices)\n        this.setAttribute('position', new Float32BufferAttribute(vertices, 3))\n        this.setAttribute('uv', new Float32BufferAttribute(uvs, 2))\n\n        this.computeVertexNormals()\n\n        const normals = this.attributes.normal as BufferAttribute\n        fixEdgeNormals()\n\n        function generateBufferData() {\n            for (let i = 0; i < tubularSegments; i++) {\n                generateSegment(i)\n            }\n            generateSegment(closed === false ? tubularSegments : 0)\n            generateUVs()\n            generateIndices()\n        }\n\n        function generateSegment(i: number) {\n            P = path.getPointAt(i / tubularSegments, P)\n\n            const N = frames.normals[i]\n            const B = frames.binormals[i]\n\n            for (let j = 0; j <= shapeSegments; j++) {\n                const point = points[j % shapeSegments] // shape is assumed to be closed\n\n                normal.set(0, 0, 0)\n                    .addScaledVector(N, point.x).addScaledVector(B, point.y)\n                vertex.copy(P).add(normal)\n\n                vertices.push(vertex.x, vertex.y, vertex.z)\n            }\n        }\n\n        function generateIndices() {\n            const ps = primary === 'shape'\n            const jl = ps ? shapeSegments : tubularSegments\n            const il = ps ? tubularSegments : shapeSegments\n            for (let j = 1; j <= jl; j++) {\n                for (let i = 1; i <= il; i++) {\n                    const [k, m] = ps ? [i, j] : [j, i]\n\n                    const a = (shapeSegments + 1) * (k - 1) + (m - 1)\n                    const b = (shapeSegments + 1) * k + (m - 1)\n                    const c = (shapeSegments + 1) * k + m\n                    const d = (shapeSegments + 1) * (k - 1) + m\n\n                    indices.push(a, b, d)\n                    indices.push(b, c, d)\n                }\n            }\n        }\n\n        function generateUVs() {\n            for (let i = 0; i <= tubularSegments; i++) {\n                for (let j = 0; j <= shapeSegments; j++) {\n                    uv.x = i / tubularSegments\n                    uv.y = j / shapeSegments\n                    uvs.push(uv.x, uv.y)\n                }\n            }\n        }\n\n        /**\n         * Average normals at shape seam edges and path start/end edges\n         * to eliminate visible hard edges on closed shapes.\n         */\n        function fixEdgeNormals() {\n            // Fix shape seam (first/last shape vertex per ring)\n            for (let i = 1; i < shapeSegments; i++) {\n                const j = i + tubularSegments * (shapeSegments + 1)\n                normal.fromBufferAttribute(normals, i)\n                normal2.fromBufferAttribute(normals, j)\n                normal.add(normal2).normalize()\n                normals.setXYZ(i, normal.x, normal.y, normal.z)\n                normals.setXYZ(j, normal.x, normal.y, normal.z)\n            }\n            // Fix path seam (first/last ring)\n            for (let k = 1; k < tubularSegments; k++) {\n                const i = k * (shapeSegments + 1)\n                const j = i + shapeSegments\n                normal.fromBufferAttribute(normals, i)\n                normal2.fromBufferAttribute(normals, j)\n                normal.add(normal2).normalize()\n                normals.setXYZ(i, normal.x, normal.y, normal.z)\n                normals.setXYZ(j, normal.x, normal.y, normal.z)\n            }\n\n            // Fix the 4 corner vertices where both seams meet\n            normal.fromBufferAttribute(normals, 0)\n            normal2.fromBufferAttribute(normals, shapeSegments)\n            normal.add(normal2)\n            const lastI = tubularSegments * (shapeSegments + 1)\n            normal2.fromBufferAttribute(normals, lastI)\n            normal.add(normal2)\n            normal2.fromBufferAttribute(normals, lastI + shapeSegments)\n            normal.add(normal2)\n            normal.normalize()\n\n            normals.setXYZ(0, normal.x, normal.y, normal.z)\n            normals.setXYZ(shapeSegments, normal.x, normal.y, normal.z)\n            normals.setXYZ(lastI, normal.x, normal.y, normal.z)\n            normals.setXYZ(lastI + shapeSegments, normal.x, normal.y, normal.z)\n\n            normals.needsUpdate = true\n        }\n    }\n\n    /**\n     * Split the geometry into material groups at the given normalized positions.\n     * Useful for multi-material tubes (e.g., road with different lane colors).\n     * @param splits Array of normalized positions (0-1) along the primary axis where splits occur\n     * @returns Number of groups created\n     */\n    createSplits(splits: number[]): number {\n        this.clearGroups()\n\n        const divisions = this.parameters.primary === 'shape' ? this.parameters.shapeSegments : this.parameters.tubularSegments\n        const vCount = this.index!.count\n        const splits2 = [...splits, 1].sort((a, b) => a - b)\n        let last = 0\n        let si = 0\n        for (const split of splits2) {\n            const c = Math.round(divisions * split) * vCount / divisions\n            this.addGroup(last, c - last, si++)\n            last = c\n        }\n\n        return this.groups.length\n    }\n\n    toJSON() {\n        const data = super.toJSON() as any\n        data.path = this.parameters.path.toJSON()\n        data.shape = this.parameters.shape.toJSON()\n        return data\n    }\n}\n","import {EllipseCurve, Vector3} from 'three'\nimport {Serialization} from 'ts-browser-helpers'\n\n/**\n * A 3D version of three.js EllipseCurve that returns Vector3 points.\n * Useful for creating circular/elliptical 3D paths for TubeGeometry and TubeShapeGeometry.\n *\n * Note: EllipseCurve extends Curve<Vector2>, but this override returns Vector3 at runtime.\n * Type casts may be needed when passing to APIs expecting Curve<Vector3>.\n */\nexport class EllipseCurve3D extends EllipseCurve {\n    override readonly type: string | 'EllipseCurve3D'\n    constructor(aX?: number, aY?: number, xRadius?: number, yRadius?: number, aStartAngle?: number, aEndAngle?: number, aClockwise?: boolean, aRotation?: number) {\n        super(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation)\n        this.type = 'EllipseCurve3D'\n    }\n    getPoint(t: number, optionalTarget?: any) {\n        return super.getPoint(t, (optionalTarget || new Vector3()) as any)\n    }\n    static {\n        Serialization.SerializableClasses.set('EllipseCurve3D', EllipseCurve3D)\n    }\n}\n","import {ILight} from '../light/ILight'\nimport {IObjectSetDirtyOptions} from '../IObject'\nimport {iObjectCommons} from './iObjectCommons'\n\nexport const iLightCommons = {\n    setDirty: function(this: ILight, options?: IObjectSetDirtyOptions, ...args: any[]): void {\n        if (typeof options === 'string') { // just incase called by decorators\n            options = {change: options}\n        }\n        // this.dispatchEvent({bubbleToParent: true, ...options, type: 'lightUpdate', light: this, object: this, args}) // this sets sceneUpdate in root scene\n        iObjectCommons.setDirty.call(this, options, ...args)\n    },\n    upgradeLight: upgradeLight,\n    refreshUi: iObjectCommons.refreshUi,\n}\n\n/**\n * Converts three.js Light to ILight setup object events, adds utility methods, and runs objectProcessor.\n * @param parent\n */\nfunction upgradeLight(this: ILight, parent?: ILight|undefined): void {\n    if (!this) return\n\n    iObjectCommons.upgradeObject3D.call(this, parent)\n}\n","import {AmbientLight, Color, ColorRepresentation} from 'three'\nimport {ILight} from './ILight'\nimport {iLightCommons} from '../object/iLightCommons'\nimport {IObject3D} from '../IObject'\nimport {generateUiConfig, uiColor, uiInput, uiNumber, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {onChange3} from 'ts-browser-helpers'\nimport {objectActionsUiConfig} from '../object/IObjectUi'\n\n/**\n * Extension of three.js AmbientLight with additional properties for serialization and UI\n * Ambient light globally illuminates all objects in the scene equally.\n *\n * Note - gltf serialization is handled by {@link GLTFLightExtrasExtension}\n *\n * @category Lights\n */\nexport class AmbientLight2 extends AmbientLight implements ILight<undefined> {\n    assetType = 'light' as const\n    setDirty = iLightCommons.setDirty\n    refreshUi = iLightCommons.refreshUi\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Ambient Light',\n        children: [\n            ...generateUiConfig(this),\n            ...objectActionsUiConfig.call(this),\n        ],\n    }\n    readonly isAmbientLight2 = true\n\n    @uiToggle('Enabled')\n    @onChange3('setDirty')\n    declare visible: boolean\n\n    @uiInput('Name')\n    @onChange3('setDirty')\n    declare name: string\n\n    @uiColor('Color', (that: AmbientLight2)=>({onChange: ()=>that.setDirty()}))\n    declare color: Color\n    @uiNumber('Intensity')\n    @onChange3('setDirty')\n    declare intensity: number\n\n    constructor(color?: ColorRepresentation, intensity?: number) {\n        super(color, intensity)\n        iLightCommons.upgradeLight.call(this)\n    }\n\n    autoScale() {\n        console.warn('AutoScale not supported on Lights')\n    }\n\n    autoCenter() {\n        console.warn('AutoCenter not supported on Lights')\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get lightObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n","import {Color, ColorRepresentation, DirectionalLight, DirectionalLightShadow, Euler, Vector2, Vector3} from 'three'\nimport {ILight} from './ILight'\nimport {iLightCommons} from '../object/iLightCommons'\nimport {IObject3D} from '../IObject'\nimport {generateUiConfig, uiColor, uiInput, uiNumber, UiObjectConfig, uiSlider, uiToggle, uiVector} from 'uiconfig.js'\nimport {onChange2, onChange3} from 'ts-browser-helpers'\nimport {bindToValue} from '../../three'\nimport {objectActionsUiConfig} from '../object/IObjectUi'\n\n/**\n * Extension of three.js DirectionalLight with additional properties for serialization and UI\n * A directional light is a light source that has a position but no dimensions - a single point in space that emits light in a specific direction.\n *\n * Note - gltf serialization is handled by {@link GLTFLightExtrasExtension}\n *\n * @category Lights\n */\nexport class DirectionalLight2 extends DirectionalLight implements ILight<DirectionalLightShadow>, IObject3D {\n    assetType = 'light' as const\n    setDirty = iLightCommons.setDirty\n    refreshUi = iLightCommons.refreshUi\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Directional Light',\n        children: [\n            ...generateUiConfig(this),\n            ...objectActionsUiConfig.call(this),\n        ],\n    }\n    readonly isDirectionalLight2 = true\n\n    @uiToggle('Enabled')\n    @onChange3('setDirty')\n    declare visible: boolean\n\n    @uiInput('Name')\n    @onChange3('setDirty')\n    declare name: string\n\n    @uiColor('Color', (that: DirectionalLight2)=>({onChange: ()=>that.setDirty()}))\n    declare color: Color\n    @uiSlider('Intensity', [0, 100], 0.01)\n    @onChange3('setDirty')\n    declare intensity: number\n    @uiVector('Position', undefined, undefined, (that: DirectionalLight2)=>({onChange: ()=>that.setDirty()}))\n    declare readonly position: Vector3\n    @uiVector('Rotation', undefined, undefined, (that: DirectionalLight2)=>({onChange: ()=>that.setDirty()}))\n    declare readonly rotation: Euler\n    @uiToggle('Cast Shadow')\n    @onChange3('setDirty')\n    declare castShadow: boolean\n\n    @uiVector('Shadow Map Size', undefined, undefined, (that: DirectionalLight2)=>({onChange: ()=>that._mapSizeChanged()}))\n    @bindToValue({obj: 'shadow', key: 'mapSize', onChange: DirectionalLight2.prototype._mapSizeChanged, onChangeParams: false})\n        shadowMapSize: Vector2\n\n    /**\n     * @internal\n     */\n    ['_mapSizeChanged']() {\n        this.shadow.map?.dispose()\n        this.shadow.mapPass?.dispose()\n        this.shadow.map = null as any\n        this.shadow.mapPass = null as any\n        this.setDirty({change: 'shadowMapSize'})\n    }\n\n    @uiSlider('Shadow Bias', [-0.001, 0.001], 0.00001)\n    @bindToValue({obj: 'shadow', key: 'bias', onChange: 'setDirty'})\n        shadowBias: number\n\n    @uiSlider('Shadow Normal Bias', [-0.1, 0.1], 0.005)\n    @bindToValue({obj: 'shadow', key: 'normalBias', onChange: 'setDirty'})\n        shadowNormalBias: number\n\n    @uiSlider('Shadow Radius', [0, 5], 0.01)\n    @bindToValue({obj: 'shadow', key: 'radius', onChange: 'setDirty'})\n        shadowRadius: number\n\n    @uiNumber('Shadow Frustum')\n    @onChange2(DirectionalLight2.prototype._shadowFrustumChanged)\n        shadowFrustum: number\n\n    @uiNumber('Shadow Near')\n    @bindToValue({obj: 'shadow', key: ['camera', 'near'], onChange: DirectionalLight2.prototype._shadowCamUpdate})\n        shadowNear: number\n\n    @uiNumber('Shadow Far')\n    @bindToValue({obj: 'shadow', key: ['camera', 'far'], onChange: DirectionalLight2.prototype._shadowCamUpdate})\n        shadowFar: number\n\n    protected _shadowFrustumChanged() {\n        const v = this.shadowFrustum\n        this.shadow.camera.left = -v / 2\n        this.shadow.camera.right = v / 2\n        this.shadow.camera.top = v / 2\n        this.shadow.camera.bottom = -v / 2\n        this.shadow.camera.updateProjectionMatrix()\n        this.setDirty({change: 'shadowFrustum'})\n    }\n\n    protected _shadowCamUpdate(change?: string) {\n        this.shadow.camera.updateProjectionMatrix()\n        this.setDirty({change})\n    }\n\n    constructor(color?: ColorRepresentation, intensity?: number) {\n        super(color, intensity)\n        this.target.position.set(0, 0, -1) // because of GLTF spec: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_lights_punctual\n        this.add(this.target) // todo: make sure the child isn't exported in gltf\n        iLightCommons.upgradeLight.call(this)\n        this.shadowFrustum = 10\n    }\n\n    autoScale() {\n        console.warn('DirectionalLight2: AutoScale not supported on Lights')\n    }\n\n    autoCenter() {\n        console.warn('DirectionalLight2: AutoCenter not supported on Lights')\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get lightObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n","import {Color, ColorRepresentation, HemisphereLight, Vector3} from 'three'\nimport {ILight} from './ILight'\nimport {iLightCommons} from '../object/iLightCommons'\nimport {IObject3D} from '../IObject'\nimport {generateUiConfig, uiColor, uiNumber, UiObjectConfig, uiToggle, uiVector, uiInput} from 'uiconfig.js'\nimport {onChange3} from 'ts-browser-helpers'\nimport {objectActionsUiConfig} from '../object/IObjectUi'\n\n/**\n * Extension of three.js HemisphereLight with additional properties for serialization and UI\n * A hemisphere light is positioned directly above the scene and emits light that decreases from the sky color to the ground color.\n *\n * Note - gltf serialization is handled by {@link GLTFLightExtrasExtension}\n *\n * @category Lights\n */\nexport class HemisphereLight2 extends HemisphereLight implements ILight<undefined> {\n    assetType = 'light' as const\n    setDirty = iLightCommons.setDirty\n    refreshUi = iLightCommons.refreshUi\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Hemisphere Light',\n        children: [\n            ...generateUiConfig(this),\n            ...objectActionsUiConfig.call(this),\n        ],\n    }\n    readonly isHemisphereLight2 = true\n\n    @uiToggle('Enabled')\n    @onChange3('setDirty')\n    declare visible: boolean\n\n    @uiInput('Name')\n    @onChange3('setDirty')\n    declare name: string\n\n    @uiColor('Sky Color', (that: HemisphereLight2)=>({onChange: ()=>that.setDirty()}))\n    declare color: Color\n    @uiColor('Ground Color', (that: HemisphereLight2)=>({onChange: ()=>that.setDirty()}))\n    declare groundColor: Color\n    @uiNumber('Intensity')\n    @onChange3('setDirty')\n    declare intensity: number\n    @uiVector('Position', undefined, undefined, (that: HemisphereLight2)=>({onChange: ()=>that.setDirty()}))\n    declare readonly position: Vector3\n\n    constructor(skyColor?: ColorRepresentation, groundColor?: ColorRepresentation, intensity?: number) {\n        super(skyColor, groundColor, intensity)\n        iLightCommons.upgradeLight.call(this)\n    }\n\n    autoScale() {\n        console.warn('AutoScale not supported on Lights')\n    }\n\n    autoCenter() {\n        console.warn('AutoCenter not supported on Lights')\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get lightObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n","import {Color, ColorRepresentation, PointLight, PointLightShadow, Vector2, Vector3} from 'three'\nimport {ILight} from './ILight'\nimport {iLightCommons} from '../object/iLightCommons'\nimport {IObject3D} from '../IObject'\nimport {generateUiConfig, uiColor, uiInput, uiNumber, UiObjectConfig, uiSlider, uiToggle, uiVector} from 'uiconfig.js'\nimport {onChange3} from 'ts-browser-helpers'\nimport {bindToValue} from '../../three'\nimport {objectActionsUiConfig} from '../object/IObjectUi'\n\n/**\n * Extension of three.js PointLight with additional properties for serialization and UI\n * A point light emits light in all directions from a single point in space.\n *\n * Note - gltf serialization is handled by {@link GLTFLightExtrasExtension}\n *\n * @category Lights\n */\nexport class PointLight2 extends PointLight implements ILight<PointLightShadow> {\n    assetType = 'light' as const\n    setDirty = iLightCommons.setDirty\n    refreshUi = iLightCommons.refreshUi\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Point Light',\n        children: [\n            ...generateUiConfig(this),\n            ...objectActionsUiConfig.call(this),\n        ],\n    }\n    readonly isPointLight2 = true\n\n    @uiToggle('Enabled')\n    @onChange3('setDirty')\n    declare visible: boolean\n\n    @uiInput('Name')\n    @onChange3('setDirty')\n    declare name: string\n\n    @uiColor('Color', (that: PointLight2)=>({onChange: ()=>that.setDirty()}))\n    declare color: Color\n    @uiNumber('Intensity')\n    @onChange3('setDirty')\n    declare intensity: number\n    @uiNumber('Distance')\n    @onChange3('setDirty')\n    declare distance: number\n    @uiNumber('Decay')\n    @onChange3('setDirty')\n    declare decay: number\n    @uiNumber('Power')\n    @onChange3('setDirty')\n    declare power: number\n\n    @uiVector('Position', undefined, undefined, (that: PointLight2)=>({onChange: ()=>that.setDirty()}))\n    declare readonly position: Vector3\n\n    @uiToggle('Cast Shadow')\n    @onChange3('setDirty')\n    declare castShadow: boolean\n\n    @uiVector('Shadow Map Size', undefined, undefined, (that: PointLight2)=>({onChange: ()=>that._mapSizeChanged()}))\n    @bindToValue({obj: 'shadow', key: 'mapSize', onChange: PointLight2.prototype._mapSizeChanged, onChangeParams: false})\n        shadowMapSize: Vector2\n\n    /**\n     * @internal\n     */\n    ['_mapSizeChanged']() {\n        this.shadow.map?.dispose()\n        this.shadow.mapPass?.dispose()\n        this.shadow.map = null as any\n        this.shadow.mapPass = null as any\n        this.setDirty({change: 'shadowMapSize'})\n    }\n\n    @uiSlider('Shadow Bias', [-0.001, 0.001], 0.00001)\n    @bindToValue({obj: 'shadow', key: 'bias', onChange: 'setDirty'})\n        shadowBias: number\n\n    @uiSlider('Shadow Radius', [0, 5], 0.01)\n    @bindToValue({obj: 'shadow', key: 'radius', onChange: 'setDirty'})\n        shadowRadius: number\n\n    @uiNumber('Shadow Near')\n    @bindToValue({obj: 'shadow', key: ['camera', 'near'], onChange: PointLight2.prototype._shadowCamUpdate})\n        shadowNear: number\n\n    @uiNumber('Shadow Far')\n    @bindToValue({obj: 'shadow', key: ['camera', 'far'], onChange: PointLight2.prototype._shadowCamUpdate})\n        shadowFar: number\n\n    @uiNumber('Shadow Aspect')\n    @bindToValue({obj: 'shadow', key: 'aspect', onChange: PointLight2.prototype._shadowCamUpdate})\n        shadowAspect: number\n\n    @uiSlider('Shadow FOV', [1, 179], 1)\n    @bindToValue({obj: 'shadow', key: 'fov', onChange: PointLight2.prototype._shadowCamUpdate})\n        shadowFov: number\n\n    protected _shadowCamUpdate(change?: string) {\n        this.shadow.camera.updateProjectionMatrix()\n        this.setDirty({change})\n    }\n    constructor(color?: ColorRepresentation, intensity?: number, distance?: number, decay?: number) {\n        super(color, intensity, distance, decay)\n        iLightCommons.upgradeLight.call(this)\n    }\n\n    autoScale() {\n        console.warn('AutoScale not supported on Lights')\n    }\n\n    autoCenter() {\n        console.warn('AutoCenter not supported on Lights')\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get lightObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n","import {Color, ColorRepresentation, RectAreaLight} from 'three'\nimport {ILight} from './ILight'\nimport {iLightCommons} from '../object/iLightCommons'\nimport {IObject3D} from '../IObject'\nimport {generateUiConfig, uiColor, uiInput, uiNumber, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {onChange3} from 'ts-browser-helpers'\nimport {objectActionsUiConfig} from '../object/IObjectUi'\n\n/**\n * Extension of three.js RectAreaLight with additional properties for serialization and UI\n * A rectangular area light emits light from a rectangular plane, commonly used to simulate window lights or panels.\n *\n * Note - gltf serialization is handled by {@link GLTFLightExtrasExtension}\n *\n * @category Lights\n */\nexport class RectAreaLight2 extends RectAreaLight implements ILight<undefined> {\n    assetType = 'light' as const\n    setDirty = iLightCommons.setDirty\n    refreshUi = iLightCommons.refreshUi\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'RectArea Light',\n        children: [\n            ...generateUiConfig(this),\n            ...objectActionsUiConfig.call(this),\n        ],\n    }\n    readonly isRectAreaLight2 = true\n\n    @uiToggle('Enabled')\n    @onChange3('setDirty')\n    declare visible: boolean\n\n    @uiInput('Name')\n    @onChange3('setDirty')\n    declare name: string\n\n    @uiColor('Color', (that: RectAreaLight2)=>({onChange: ()=>that.setDirty()}))\n    declare color: Color\n    @uiNumber('Intensity')\n    @onChange3('setDirty')\n    declare intensity: number\n    @uiNumber('Width')\n    @onChange3('setDirty')\n    declare width: number\n    @uiNumber('Height')\n    @onChange3('setDirty')\n    declare height: number\n    @uiNumber('Power')\n    @onChange3('setDirty')\n    declare power: number\n\n\n    constructor(color?: ColorRepresentation, intensity?: number, width?: number, height?: number) {\n        super(color, intensity, width, height)\n        iLightCommons.upgradeLight.call(this)\n    }\n\n    autoScale() {\n        console.warn('AutoScale not supported on Lights')\n    }\n\n    autoCenter() {\n        console.warn('AutoCenter not supported on Lights')\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get lightObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    // dispatchEvent: (event: ILightEvent) => void\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n","import {Color, ColorRepresentation, Euler, SpotLight, SpotLightShadow, Vector2, Vector3} from 'three'\nimport {ILight} from './ILight'\nimport {iLightCommons} from '../object/iLightCommons'\nimport {IObject3D} from '../IObject'\nimport {generateUiConfig, uiColor, uiInput, uiNumber, UiObjectConfig, uiSlider, uiToggle, uiVector} from 'uiconfig.js'\nimport {onChange3} from 'ts-browser-helpers'\nimport {bindToValue} from '../../three'\nimport {objectActionsUiConfig} from '../object/IObjectUi'\n\n/**\n * Extension of three.js SpotLight with additional properties for serialization and UI\n * A spot light emits light from a single point in one direction, along a cone that increases in size the further from the light it gets.\n *\n * Note - gltf serialization is handled by {@link GLTFLightExtrasExtension}\n *\n * @category Lights\n */\nexport class SpotLight2 extends SpotLight implements ILight<SpotLightShadow> {\n    assetType = 'light' as const\n    setDirty = iLightCommons.setDirty\n    refreshUi = iLightCommons.refreshUi\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Spot Light',\n        children: [\n            ...generateUiConfig(this),\n            ...objectActionsUiConfig.call(this),\n        ],\n    }\n    readonly isSpotLight2 = true\n\n    @uiToggle('Enabled')\n    @onChange3('setDirty')\n    declare visible: boolean\n\n    @uiInput('Name')\n    @onChange3('setDirty')\n    declare name: string\n\n    @uiColor('Color', (that: SpotLight2)=>({onChange: ()=>that.setDirty()}))\n    declare color: Color\n    @uiNumber('Intensity')\n    @onChange3('setDirty')\n    declare intensity: number\n    @uiSlider('Angle', [0, 2], 0.01)\n    @onChange3('setDirty')\n    declare angle: number\n    @uiSlider('Penumbra', [0, 0.9999], 0.01)\n    @onChange3('setDirty')\n    declare penumbra: number\n    @uiInput('Distance')\n    @onChange3('setDirty')\n    declare distance: number\n    @uiInput('Decay')\n    @onChange3('setDirty')\n    declare decay: number\n    @uiVector('Position', undefined, undefined, (that: SpotLight2)=>({onChange: ()=>that.setDirty()}))\n    declare readonly position: Vector3\n    @uiVector('Rotation', undefined, undefined, (that: SpotLight2)=>({onChange: ()=>that.setDirty()}))\n    declare readonly rotation: Euler\n    @uiToggle('Cast Shadow')\n    @onChange3('setDirty')\n    declare castShadow: boolean\n\n    @uiVector('Shadow Map Size', undefined, undefined, (that: SpotLight2)=>({onChange: ()=>that._mapSizeChanged()}))\n    @bindToValue({obj: 'shadow', key: 'mapSize', onChange: SpotLight2.prototype._mapSizeChanged, onChangeParams: false})\n        shadowMapSize: Vector2\n\n    /**\n     * @internal\n     */\n    ['_mapSizeChanged']() {\n        this.shadow.map?.dispose()\n        this.shadow.mapPass?.dispose()\n        this.shadow.map = null as any\n        this.shadow.mapPass = null as any\n        this.setDirty({change: 'shadowMapSize'})\n    }\n\n    @uiSlider('Shadow Bias', [-0.001, 0.001], 0.00001)\n    @bindToValue({obj: 'shadow', key: 'bias', onChange: 'setDirty'})\n        shadowBias: number\n\n    @uiSlider('Shadow Radius', [0, 5], 0.01)\n    @bindToValue({obj: 'shadow', key: 'radius', onChange: 'setDirty'})\n        shadowRadius: number\n\n    @uiSlider('Shadow Focus', [0, 1], 0.001)\n    @bindToValue({obj: 'shadow', key: 'focus', onChange: 'setDirty'})\n        shadowFocus: number\n\n    @uiNumber('Shadow Near')\n    @bindToValue({obj: 'shadow', key: ['camera', 'near'], onChange: SpotLight2.prototype._shadowCamUpdate})\n        shadowNear: number\n\n    @uiNumber('Shadow Far')\n    @bindToValue({obj: 'shadow', key: ['camera', 'far'], onChange: SpotLight2.prototype._shadowCamUpdate})\n        shadowFar: number\n\n    @uiNumber('Shadow Aspect')\n    @bindToValue({obj: 'shadow', key: 'aspect', onChange: SpotLight2.prototype._shadowCamUpdate})\n        shadowAspect: number\n\n    @uiSlider('Shadow FOV', [1, 179], 1)\n    @bindToValue({obj: 'shadow', key: 'fov', onChange: SpotLight2.prototype._shadowCamUpdate})\n        shadowFov: number\n\n    protected _shadowCamUpdate(change?: string) {\n        this.shadow.camera.updateProjectionMatrix()\n        this.setDirty({change})\n    }\n\n    constructor(color?: ColorRepresentation, intensity?: number, distance?: number,\n        angle?: number,\n        penumbra?: number,\n        decay?: number) {\n        super(color, intensity, distance, angle, penumbra, decay)\n        this.target.position.set(0, 0, -1) // because of GLTF spec: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_lights_punctual\n        this.add(this.target) // todo: make sure the child isn't exported in gltf\n        iLightCommons.upgradeLight.call(this)\n    }\n\n    autoScale() {\n        console.warn('AutoScale not supported on Lights')\n    }\n\n    autoCenter() {\n        console.warn('AutoCenter not supported on Lights')\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get lightObject(): this {\n        return this\n    }\n\n    /**\n     * @deprecated use `this` instead\n     */\n    get modelObject(): this {\n        return this\n    }\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n}\n","import {IMaterial} from './IMaterial'\nimport {Source, Texture, TextureEventMap} from 'three'\nimport {IRenderTarget} from '../rendering'\nimport type {ChangeEvent, UiObjectConfig} from 'uiconfig.js'\nimport {IObject3D} from './IObject'\n\nexport interface ITextureUserData{\n    mimeType?: string\n    embedUrlImagePreviews?: boolean\n    /**\n     * Automatically dispose texture when not used by any material that's applied to some object in the scene.\n     * Works only after it's applied to a material once.\n     */\n    disposeOnIdle?: boolean\n\n\n    // for videos etc\n    timeline?: {\n        enabled: boolean\n        delay?: number // in ms\n        scale?: number // scale the timeline to this value\n        start?: number // in ms\n        end?: number // in ms\n    }\n\n    [key: string]: any\n}\n\n// export type ITextureEventTypes = 'dispose' | 'update'\n// export type ITextureEvent<T extends string = ITextureEventTypes> = Event & {\n//     type: T\n//     texture?: ITexture\n//     uiChangeEvent?: ChangeEvent\n// }\n\nexport type ITextureEventMap = TextureEventMap\n\ndeclare module 'three'{\n    export interface TextureEventMap{\n        textureUpdate: {\n            texture: Texture\n            // These are handled in dispatchEvent override in iMaterialCommons\n            bubbleToObject?: boolean\n            bubbleToParent?: boolean\n            uiChangeEvent?: ChangeEvent\n        } /* & ITextureSetDirtyOptions*/\n        // select: { // todo remove?\n        //     ui?: boolean\n        //     // focusCamera?: boolean // todo ?\n        //     bubbleToObject?: boolean\n        //     bubbleToParent?: boolean\n        //     material: IMaterial\n        //     value?: /* IObject3D | */ ITexture | null // todo is this required?\n        //\n        //     source?: string // who is triggering the event. so that recursive events can be prevented\n        // } /* & IObjectSetDirtyOptions*/\n    }\n\n}\n\nexport interface ITexture<TE extends ITextureEventMap = ITextureEventMap> extends Texture<TE> {\n    assetType?: 'texture'\n    userData: ITextureUserData\n    readonly isTexture: true\n    isDataTexture?: boolean\n    isCubeTexture?: boolean\n    isVideoTexture?: boolean\n    isCanvasTexture?: boolean\n    isCompressedTexture?: boolean\n    is3DDataTexture?: boolean\n\n    setDirty?(): void\n\n    source: Source & {\n        _sourceImgBuffer?: ArrayBuffer|Uint8Array // see KTX2LoadPlugin and serializeTextureInExtras\n        _canSerialize?: boolean // see KTX2LoadPlugin and GLTFExporter.js. Disables auto decompress for glTF export\n    }\n\n    // _appliedMaterials?: Set<IMaterial> // for internal use only. refers to the materials that this texture is applied to\n    /**\n     * Objects/Materials in the scene that are using this texture.\n     * This is set in the {@link Object3DManager} when the objects are added/removed from the scene. Do not modify this set directly.\n     */\n    appliedObjects?: Set<IObject3D|IMaterial>\n\n    uiConfig?: UiObjectConfig\n\n    /**\n     * for internal use only. refers to the render target that this texture is attached to\n     * @internal\n     */\n    ['_target']?: IRenderTarget\n\n\n}\n\nexport function upgradeTexture(this: ITexture) {\n    this.assetType = 'texture'\n    if (!this.userData) this.userData = {}\n    if (!this.appliedObjects) this.appliedObjects = new Set()\n    if (!this.setDirty) this.setDirty = ()=>this.needsUpdate = true\n    // todo: uiconfig, dispose, etc\n\n    // if (!this.uiConfig) {\n    //\n    //     if (this.isVideoTexture) {\n    //         this.uiConfig = {\n    //             type: 'folder',\n    //             label: 'Video Texture',\n    //             children: [\n    //                 {\n    //\n    //                 },\n    //             ],\n    //         }\n    //     }\n    //\n    // }\n}\n","import {PartialRecord} from 'ts-browser-helpers'\nimport {Blending, Clock, ShaderMaterial, Texture, Vector2, Vector4, WebGLRenderer, WebGLRenderTarget} from 'three'\nimport {CreateRenderTargetOptions, IRenderTarget, RenderTargetManager} from '../rendering'\nimport {IShaderPropertiesUpdater} from '../materials'\nimport {EffectComposer2, IPassID, IPipelinePass} from '../postprocessing'\nimport {IScene} from './IScene'\nimport {BlobExt} from '../assetmanager'\n\nexport type TThreeRendererMode = 'shadowMapRender' | 'backgroundRender' | 'sceneRender' | 'opaqueRender' | 'transparentRender' | 'transmissionRender' | 'mainRenderPass' | 'screenSpaceRendering'\nexport type TThreeRendererModeUserData = PartialRecord<TThreeRendererMode, boolean>\n\nexport interface IAnimationLoopEvent {\n    renderer: IWebGLRenderer\n    deltaTime: number\n    time: number\n    xrFrame?: XRFrame\n}\nexport interface IRenderManagerUpdateEvent {\n    change?: 'registerPass' | 'unregisterPass' | 'useLegacyLights' | 'passRefresh' | 'size' | 'rebuild' | string\n    data?: any\n    pass?: IPipelinePass\n}\n\nexport interface IRenderManagerEventMap {\n    animationLoop: IAnimationLoopEvent\n    update: IRenderManagerUpdateEvent\n    resize: object\n    contextRestored: object\n    contextLost: {\n        event: WebGLContextEvent\n    }\n    preRender: {\n        scene: IScene\n        renderToScreen: boolean\n    }\n    postRender: {\n        scene: IScene\n        renderToScreen: boolean\n    }\n}\n\nexport interface RendererBlitOptions {\n    source?: Texture,\n    viewport?: Vector4,\n    material?: ShaderMaterial,\n    clear?: boolean,\n    respectColorSpace?: boolean,\n    blending?: Blending,\n    transparent?: boolean,\n    opacity?: number,\n    blendAlpha?: number\n}\n\nexport interface IRenderManager<TE extends IRenderManagerEventMap = IRenderManagerEventMap> extends RenderTargetManager<TE>, IShaderPropertiesUpdater{\n    readonly renderer: IWebGLRenderer\n    readonly needsRender: boolean\n    rebuildPipeline(setDirty?: boolean): void\n    setSize(width: number, height: number): void\n\n    render(scene: IScene): void\n    reset(): void\n    resetShadows(): void\n    refreshPasses(): void\n\n    registerPass(pass: IPipelinePass, replaceId?: boolean): void\n    unregisterPass(pass: IPipelinePass): void\n    readonly frameCount: number\n    readonly totalFrameCount: number\n    pipeline: IPassID[]\n    composer: EffectComposer2\n    readonly passes: IPipelinePass[]\n    readonly isWebGL2: boolean\n    readonly composerTarget: IRenderTarget\n    readonly renderSize: Vector2\n    renderScale: number\n    readonly context: WebGLRenderingContext\n    useLegacyLights: boolean\n    webglRenderer: WebGLRenderer\n    clock: Clock\n\n    blit(destination: IRenderTarget|undefined|null, options?: RendererBlitOptions): void\n    clearColor({r, g, b, a, target, depth, stencil, viewport}:\n                   {r?: number, g?: number, b?: number, a?: number, target?: IRenderTarget, depth?: boolean, stencil?: boolean, viewport?: Vector4}): void\n\n    renderTargetToDataUrl(target: WebGLRenderTarget, mimeType?: string, quality?: number): string\n\n    renderTargetToBuffer(target: WebGLRenderTarget): Uint8Array|Uint16Array|Float32Array\n\n    exportRenderTarget(target: WebGLRenderTarget, mimeType?: 'auto'|string, textureIndex?: number): BlobExt\n}\n\nexport interface IRenderManagerOptions {\n    canvas: HTMLCanvasElement,\n    alpha?: boolean, // default = true\n    targetOptions?: CreateRenderTargetOptions\n    rgbm?: boolean,\n    msaa?: boolean | number,\n    depthBuffer?: boolean,\n    renderScale?: number,\n    powerPreference?: WebGLPowerPreference,\n}\n\nexport interface IWebGLRenderer<TManager extends IRenderManager=IRenderManager> extends WebGLRenderer {\n    renderManager: TManager\n    userData: TThreeRendererModeUserData & {\n        // eslint-disable-next-line @typescript-eslint/naming-convention\n        __isIWebGLRenderer: true\n        [key: string]: any\n    }\n    renderWithModes(ud: TThreeRendererModeUserData, render: ()=>void): void\n\n    // legacy\n\n    /**\n     * @deprecated use {@link renderManager} instead\n     */\n    baseRenderer?: IRenderManager\n}\n\nexport function upgradeWebGLRenderer<TManager extends IRenderManager=IRenderManager>(this: IWebGLRenderer<TManager>, manager: TManager): IWebGLRenderer<TManager> {\n    if (this.userData?.__isIWebGLRenderer) return this\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    if (!this.userData) this.userData = {__isIWebGLRenderer: true}\n    this.userData.__isIWebGLRenderer = true\n    if (!this.renderWithModes) this.renderWithModes = renderWithModes\n    this.renderManager = manager\n\n    // legacy\n    if (!this.baseRenderer) {\n        Object.defineProperty(this, 'baseRenderer', {\n            get: ()=>{\n                console.warn('IWebGLRenderer.baseRenderer is deprecated, use IWebGLRenderer.renderManager instead')\n                return this.renderManager\n            },\n        })\n    }\n    return this\n}\n\n\nfunction renderWithModes(this: IWebGLRenderer, ud: TThreeRendererModeUserData, render: ()=>void) {\n    const rud = this.userData\n    const {backgroundRender, transparentRender, shadowMapRender, mainRenderPass, opaqueRender, transmissionRender, sceneRender, screenSpaceRendering} = rud\n\n    if (ud.backgroundRender !== undefined) rud.backgroundRender = ud.backgroundRender\n    if (ud.transparentRender !== undefined) rud.transparentRender = ud.transparentRender\n    if (ud.shadowMapRender !== undefined) rud.shadowMapRender = ud.shadowMapRender\n    if (ud.mainRenderPass !== undefined) rud.mainRenderPass = ud.mainRenderPass\n    if (ud.opaqueRender !== undefined) rud.opaqueRender = ud.opaqueRender\n    if (ud.sceneRender !== undefined) rud.sceneRender = ud.sceneRender\n    if (ud.transmissionRender !== undefined) rud.transmissionRender = ud.transmissionRender\n    if (ud.screenSpaceRendering !== undefined) rud.screenSpaceRendering = ud.screenSpaceRendering\n\n    render()\n\n    rud.backgroundRender = backgroundRender\n    rud.transparentRender = transparentRender\n    rud.shadowMapRender = shadowMapRender\n    rud.mainRenderPass = mainRenderPass\n    rud.opaqueRender = opaqueRender\n    rud.sceneRender = sceneRender\n    rud.transmissionRender = transmissionRender\n    rud.screenSpaceRendering = screenSpaceRendering\n\n}\n\n/**\n * @deprecated renamed to {@link renderWithModes}, use {@link IWebGLRenderer.renderWithModes}\n */\nexport const setThreeRendererMode = renderWithModes\n","import {\n    BufferGeometry,\n    Color,\n    EquirectangularReflectionMapping,\n    Euler,\n    EventListener,\n    EventListener2,\n    IUniform,\n    Object3D,\n    Scene,\n    UVMapping,\n    Vector3,\n} from 'three'\nimport type {IObject3D, IObject3DEventMap, IObjectProcessor} from '../IObject'\nimport {type ICamera} from '../ICamera'\nimport {autoGPUInstanceMeshes, Box3B} from '../../three'\nimport {AnyOptions, onChange2, onChange3, serialize} from 'ts-browser-helpers'\nimport {PerspectiveCamera2} from '../camera/PerspectiveCamera2'\nimport {addModelProcess, centerAllGeometries, ThreeSerialization} from '../../utils'\nimport {ITexture} from '../ITexture'\nimport {AddObjectOptions, IScene, ISceneEventMap, ISceneSetDirtyOptions, IWidget} from '../IScene'\nimport {iObjectCommons} from './iObjectCommons'\nimport {RootSceneImportResult} from '../../assetmanager'\nimport {\n    uiButton,\n    uiColor,\n    uiConfig,\n    uiFolderContainer,\n    uiImage,\n    UiObjectConfig,\n    uiSlider,\n    uiToggle,\n    uiVector,\n} from 'uiconfig.js'\nimport {getFittingDistance} from '../../three/utils/camera'\nimport {iCameraCommons} from './iCameraCommons'\n\n@uiFolderContainer('Root Scene')\nexport class RootScene<TE extends ISceneEventMap = ISceneEventMap> extends Scene<TE&ISceneEventMap> implements IScene<TE> {\n    readonly isRootScene = true\n\n    assetType = 'model' as const\n    declare uiConfig: UiObjectConfig\n\n    // private _processors = new ObjectProcessorMap<'environment' | 'background'>()\n    // private _sceneObjects: ISceneObject[] = []\n    private _mainCamera: ICamera | null = null\n    /**\n     * The root object where all imported objects are added.\n     */\n    readonly modelRoot: IObject3D\n    // readonly lightsRoot: IObject3D // todo this can be added before modelRoot to add extra lights before the model root.\n\n    @serialize() @onChange2(RootScene.prototype.onBackgroundChange)\n        backgroundColor: Color | null = null // read in three.js WebGLBackground\n\n    @uiColor<RootScene>('Background Color', (s)=>({\n        hidden: ()=>s.backgroundColor === null || s.backgroundColor === undefined || s.background === 'environment',\n    }))\n    protected get _backgroundColorUi() {\n        return '#' + (this.backgroundColor?.getHexString() ?? '000000')\n    }\n\n    protected set _backgroundColorUi(v) {\n        this.setBackgroundColor(v)\n    }\n\n    @onChange3(RootScene.prototype.onBackgroundChange)\n    @serialize() @uiImage<RootScene>('Background Image', (s)=>({\n        hidden: ()=>s.backgroundColor === null || s.backgroundColor === undefined || s.background === 'environment',\n    }))\n        background: null | Color | ITexture | 'environment' = null\n\n    /**\n     * Toggle the background between color and transparent.\n     */\n    @uiButton<RootScene>(undefined, (s)=>({\n        label: ()=>!s.backgroundColor ? 'Set Color Background' : 'Set Transparent BG',\n        tags: ['context-menu'],\n    }))\n    toggleTransparentBackground() {\n        if (!this.backgroundColor) {\n            this.backgroundColor = new Color(0xffffff) // todo save last color and image?\n        } else {\n            this.background = null\n            this.backgroundColor = null\n        }\n        this.refreshUi?.()\n        this.setDirty()\n    }\n\n    /**\n     * Toggle the background between texture and environment map.\n     */\n    @uiButton<RootScene>(undefined, (s)=>({\n        label: ()=>s.background === 'environment' ? 'Remove Env Background' : 'Set Env Background',\n        disabled: ()=>!s.environment, tags: ['context-menu'],\n    }))\n    toggleEnvironmentBackground() {\n        if (this.background === 'environment') {\n            this.background = null\n        } else {\n            this.background = 'environment'\n        }\n    }\n\n\n    /**\n     * The intensity for the background color and map.\n     */\n    @serialize() @onChange3(RootScene.prototype.setDirty)\n    @uiSlider('Background Intensity', [0, 10], 0.01)\n        backgroundIntensity = 1\n\n    /**\n     * Enable/Disable tonemapping selectively for the background.\n     * Note - This requires both TonemapPlugin and GBufferPlugin or DepthBufferPlugin to be in the viewer to work.\n     */\n    @uiToggle('Background Tonemap'/* , (e)=>({e._viewer?.renderManager.gbufferTarget})*/) // todo let scene access the viewer\n    @onChange3(RootScene.prototype.setDirty)\n    @serialize()\n        backgroundTonemap = true\n\n    private _environment: ITexture | null = null\n    /**\n     * The default environment map used when rendering materials in the scene\n     */\n    @uiImage('Environment')\n    @serialize()\n    // Note: getter/setter defined in constructor using Object.defineProperty\n    declare environment: ITexture | null\n\n    /**\n     * The intensity for the environment light.\n     */\n    @uiSlider('Environment Intensity', [0, 10], 0.01)\n    @serialize() @onChange3(RootScene.prototype.setDirty)\n        environmentIntensity = 1\n\n    @serialize()\n    @uiVector<RootScene>('Environment Rotation', undefined, undefined, (t)=>({disabled: ()=>t.fixedEnvMapDirection || !t.environment}))\n    declare environmentRotation: Euler\n    @serialize()\n    @uiVector<RootScene>('Background Rotation', undefined, undefined, (t)=>({hidden: ()=>!t.background || t.background === 'environment' || !(t.background as any).isTexture || (t.background as any).mapping !== EquirectangularReflectionMapping}))\n    declare backgroundRotation: Euler\n\n    // @uiSlider('Environment Rotation', [-Math.PI, Math.PI], 0.01)\n    // @bindToValue({obj: 'environment', key: 'rotation', onChange: RootScene.prototype.setDirty, onChangeParams: false})\n    //     envMapRotation = 0\n\n    /**\n     * Extra textures/envmaps that can be used by objects/materials/plugins and will be serialized.\n     */\n    @serialize()\n    public textureSlots: Record<string, ITexture> = {}\n\n    /**\n     * Fixed direction environment reflections irrespective of camera position.\n     */\n    @uiToggle('Fixed Env Direction')\n    @serialize() @onChange3(RootScene.prototype.setDirty)\n        fixedEnvMapDirection = false\n\n    /**\n     * The default camera in the scene. This camera is always in the scene and used by default if no camera is set as main.\n     * It is also saved along with the scene JSON and shown in the UI. This is added to the scene root, hence not saved in the glTF when a scene glb is exported.\n     */\n    @uiConfig() @serialize() readonly defaultCamera: ICamera\n\n    /**\n     * Calls dispose on current old environment map, background map when it is changed.\n     * Runtime only (not serialized)\n     */\n    autoDisposeSceneMaps = true\n\n    // private _environmentLight?: IEnvironmentLight\n\n    // required just because we don't want activeCamera to be null.\n    private _dummyCam = new PerspectiveCamera2('') as ICamera\n\n    get mainCamera(): ICamera {\n        return this._mainCamera || this._dummyCam\n    }\n    set mainCamera(camera: ICamera | undefined) {\n        const cam = this.mainCamera\n        if (!camera) camera = this.defaultCamera\n        if (cam === camera) return\n        if (cam) {\n            cam.deactivateMain(undefined, true)\n            cam.removeEventListener('cameraUpdate', this._mainCameraUpdate)\n        }\n        if (camera) {\n            this._mainCamera = camera\n            camera.addEventListener('cameraUpdate', this._mainCameraUpdate)\n            camera.activateMain(undefined, true)\n\n            if (!camera._canvas && camera !== this.defaultCamera) {\n                console.warn('RootScene: mainCamera does not have a canvas set, some controls might not work properly.')\n            }\n        } else {\n            this._mainCamera = null\n        }\n        this.dispatchEvent({type: 'activeCameraChange', lastCamera: cam, camera}) // deprecated\n        this.dispatchEvent({type: 'mainCameraChange', lastCamera: cam, camera})\n        this.setDirty()\n    }\n\n    private _renderCamera: ICamera | undefined\n    get renderCamera() {\n        return this._renderCamera ?? this.mainCamera\n    }\n    set renderCamera(camera: ICamera) {\n        const cam = this._renderCamera\n        this._renderCamera = camera\n        this.dispatchEvent({type: 'renderCameraChange', lastCamera: cam, camera})\n    }\n\n    objectProcessor?: IObjectProcessor\n\n    /**\n     * Create a scene instance. This is done automatically in the {@link ThreeViewer} and must not be created separately.\n     * @param camera\n     * @param objectProcessor\n     */\n    constructor(camera: ICamera, objectProcessor?: IObjectProcessor) {\n        super()\n        this.setDirty = this.setDirty.bind(this)\n        this.name = 'RootScene'\n\n        this.objectProcessor = objectProcessor\n        iObjectCommons.upgradeObject3D.call(this)\n        this.objectProcessor?.processObject(this)\n\n        // this is called from parentDispatch since scene is a parent.\n        this.addEventListener('materialUpdate', (e: any)=>this.dispatchEvent({...e, type: 'sceneMaterialUpdate'}))\n        this.addEventListener('objectUpdate', this.refreshScene)\n        this.addEventListener('geometryUpdate', this.refreshScene)\n        this.addEventListener('geometryChanged', this.refreshScene)\n\n        this.environmentRotation?._onChange(()=>{\n            this.setDirty({key: 'environmentRotation', value: this.environmentRotation})\n        })\n        this.backgroundRotation?._onChange(()=>{\n            this.setDirty({key: 'backgroundRotation', value: this.backgroundRotation})\n        })\n\n        this.defaultCamera = camera\n        this.modelRoot = new Object3D() as IObject3D\n        this.modelRoot.userData.rootSceneModelRoot = true\n        this.modelRoot.name = 'Scene' // for the UI\n        // this.modelRoot.addEventListener('update', this.setDirty) // todo: where was this dispatched from/used ?\n\n        // eslint-disable-next-line deprecation/deprecation\n        this.add(this.modelRoot as any)\n        // this.addSceneObject(this.modelRoot as any, {addToRoot: true, autoScale: false})\n\n        // eslint-disable-next-line deprecation/deprecation\n        this.add(this.defaultCamera)\n\n        this.mainCamera = this.defaultCamera\n\n        Object.defineProperty(this, 'environment', {\n            configurable: true,\n            enumerable: true,\n            get: () => {\n                // Return override environment if we're in render step and override is set\n                if (this._isMainRendering && this.overrideRenderEnvironment !== null) {\n                    return this.overrideRenderEnvironment\n                }\n                return this._environment\n            },\n            set: (value: ITexture | null) => {\n                const oldValue = this._environment\n                this._environment = value\n                this._onEnvironmentChange({key: 'environment', value, oldValue, target: this})\n            },\n        })\n    }\n\n    /**\n     * Add any object to the scene.\n     * @param imported\n     * @param options\n     */\n    addObject<T extends IObject3D|Object3D = IObject3D>(imported: T, options?: AddObjectOptions): T&IObject3D {\n        if (options?.clearSceneObjects || options?.disposeSceneObjects) {\n            this.clearSceneModels(options.disposeSceneObjects)\n        }\n        if (!imported) return imported\n        if (!imported.isObject3D) {\n            console.error('Invalid object, cannot add to scene.', imported)\n            return imported as T&IObject3D\n        }\n        this._addObject3D(<IObject3D>imported, options)\n        this.dispatchEvent({type: 'addSceneObject', object: <IObject3D>imported, options})\n        return imported as T&IObject3D\n    }\n\n    /**\n     * Load model root scene exported to GLTF format. Used internally by {@link ThreeViewer.addSceneObject}.\n     * @param obj\n     * @param options\n     */\n    loadModelRoot(obj: RootSceneImportResult, options?: AddObjectOptions) {\n        if (options?.clearSceneObjects || options?.disposeSceneObjects) {\n            this.clearSceneModels(options.disposeSceneObjects)\n        }\n        if (!obj.userData?.rootSceneModelRoot) {\n            console.error('RootScene: Invalid model root scene object. Trying to add anyway.', obj)\n        }\n        if (obj.userData) {\n            // todo deep merge all userdata?\n            if (obj.userData.__importData) // this is with `__` as it is not automatically serialized, but it can be read in gltf exporter extensions and serialized manually\n                this.modelRoot.userData.__importData = {\n                    ...this.modelRoot.userData.__importData,\n                    ...obj.userData.__importData,\n                }\n            if (obj.userData.gltfAsset) {\n                this.modelRoot.userData.gltfAsset = { // todo: why are we merging values?\n                    ...this.modelRoot.userData.gltfAsset,\n                    ...obj.userData.gltfAsset,\n                    extras: {\n                        ...this.modelRoot.userData.gltfAsset?.extras,\n                        ...obj.userData.gltfAsset.extras,\n                    },\n                }\n            }\n            if (obj.userData.gltfExtras)\n                this.modelRoot.userData.gltfExtras = {\n                    ...this.modelRoot.userData.gltfExtras,\n                    ...obj.userData.gltfExtras,\n                }\n        }\n        if (obj.userData?.gltfAsset?.copyright) obj.children.forEach(c => !c.userData.license && (c.userData.license = obj.userData.gltfAsset?.copyright))\n        if (obj.animations) {\n            if (!this.modelRoot.animations) this.modelRoot.animations = []\n            for (const animation of obj.animations) {\n                if (this.modelRoot.animations.includes(animation)) continue\n                this.modelRoot.animations.push(animation)\n            }\n        }\n        if (obj._loadingPromise) {\n            if (this.modelRoot._loadingPromise) {\n                this.modelRoot._loadingPromise = Promise.allSettled([this.modelRoot._loadingPromise, obj._loadingPromise])\n            } else {\n                this.modelRoot._loadingPromise = obj._loadingPromise\n            }\n        }\n        const children = obj._childrenCopy || [...obj.children]\n        return children.map(c=>this.addObject(c, {...options, clearSceneObjects: false, disposeSceneObjects: false}))\n    }\n\n    private _addObject3D(model: IObject3D|null, {addToRoot = false, ...options}: AddObjectOptions = {}): void {\n        const obj = model\n        if (!obj || !obj.isObject3D) {\n            console.error('RootScene: Invalid object, cannot add to scene.')\n            return\n        }\n        const target = addToRoot ? this : this.modelRoot\n        target.add(obj)\n\n        if (options.indexInParent !== undefined) {\n            const newIndex = options.indexInParent\n            const newIndex2 = target.children.indexOf(obj)\n            if (newIndex >= 0 && newIndex2 >= 0 && newIndex !== newIndex2 && newIndex < target.children.length) {\n                target.children.splice(newIndex2, 1)\n                target.children.splice(newIndex, 0, obj) // add at new index\n            }\n        }\n\n        addModelProcess(obj, options)\n        this.setDirty({refreshScene: true})\n    }\n\n    @uiButton('Center All Geometries', {sendArgs: false, tags: ['context-menu']})\n    centerAllGeometries(keepPosition = true, obj?: IObject3D) {\n        return centerAllGeometries(obj ?? this.modelRoot, keepPosition)\n    }\n\n    clearSceneModels(dispose = false, setDirty = true): void {\n        if (dispose) return this.disposeSceneModels(setDirty)\n        this.modelRoot.clear()\n        this.modelRoot.children = []\n        setDirty && this.setDirty({refreshScene: true})\n    }\n\n    disposeSceneModels(setDirty = true, clear = true) {\n        if (clear) {\n            for (const child of [...this.modelRoot.children]) {\n                child.dispose ? child.dispose() : child.removeFromParent()\n            }\n            this.modelRoot.clear()\n            if (setDirty) this.setDirty({refreshScene: true})\n        } else {\n            for (const child of this.modelRoot.children) {\n                child.dispose && child.dispose(false)\n            }\n        }\n    }\n\n    private _onEnvironmentChange(ev?: {value: ITexture|null, oldValue: ITexture|null, key?: string, target?: any}) {\n        if (ev?.oldValue && ev.oldValue !== ev.value) {\n            if (this.autoDisposeSceneMaps && typeof ev.oldValue.dispose === 'function') ev.oldValue.dispose()\n        }\n\n        // console.warn('environment changed')\n        if (this.environment?.mapping === UVMapping) {\n            this.environment.mapping = EquirectangularReflectionMapping // for PMREMGenerator\n            this.environment.needsUpdate = true\n        }\n\n        // todo dispatch texturesChanged also\n        this.dispatchEvent({\n            type: 'environmentChanged',\n            oldTexture: ev?.oldValue?.isTexture ? ev.oldValue : null,\n            texture: this.environment?.isTexture ? this.environment : null,\n            environment: this.environment,\n        })\n        this.setDirty({refreshScene: true, geometryChanged: false})\n        this.refreshUi?.()\n    }\n\n    onBackgroundChange(ev?: {value: ITexture|null, oldValue: ITexture|null}) {\n        if (ev?.oldValue && ev.oldValue !== ev.value) {\n            if (this.autoDisposeSceneMaps && typeof ev.oldValue.dispose === 'function') ev.oldValue.dispose()\n        }\n\n        // todo dispatch texturesChanged also\n        this.dispatchEvent({\n            type: 'backgroundChanged',\n            oldTexture: ev?.oldValue && ev.oldValue.isTexture ? ev.oldValue : null,\n            texture:(this.background as ITexture)?.isTexture ? (this.background as ITexture) : null,\n            background: this.background,\n            backgroundColor: this.backgroundColor,\n        })\n        this.setDirty({refreshScene: true, geometryChanged: false})\n        this.refreshUi?.()\n    }\n\n    /**\n     * @deprecated Use {@link addObject}\n     */\n    add(...object: Object3D[]): this {\n        const filter = object.filter(o=>o.parent !== this)\n        filter.length && super.add(...filter) // to prevent multiple event dispatch\n        // this._onSceneUpdate() // this is not needed, since it will be bubbled up from the object3d and we will get event objectUpdate\n        return this\n    }\n\n    /**\n     * Sets the backgroundColor property from a string, number or Color, and updates the scene.\n     * Note that when setting a `Color` object, it will be cloned.\n     * @param color\n     */\n    setBackgroundColor(color: string | number | Color | null) {\n        const col = color || typeof color === 'number' ? new Color(color) : null\n        if (col && this.backgroundColor && !col.equals(this.backgroundColor) ||\n            (!col || !this.backgroundColor) && col !== this.backgroundColor\n        ) this.backgroundColor = col\n    }\n\n    /**\n     * Mark the scene dirty, and force render in the next frame.\n     * @param options - set `refreshScene` to true to mark that any object transformations have changed. It might trigger effects like frame fade depening on plugins.\n     * @returns {this}\n     */\n    setDirty(options?: ISceneSetDirtyOptions): this {\n        // todo: for onChange calls -> check options.key for specific key that's changed and use it to determine refreshScene\n        if (options?.sceneUpdate) {\n            console.warn('sceneUpdate is deprecated, use refreshScene instead.')\n            options.refreshScene = true\n        }\n        this.dispatchEvent({type: 'update', bubbleToParent: false, object: this}) // todo remove\n        iObjectCommons.setDirty.call(this, {...options, scene: this})\n        return this\n    }\n\n\n    private _mainCameraUpdate: EventListener2<'cameraUpdate', IObject3DEventMap, ICamera> = (e) => {\n        if (!this._mainCamera?.parent) this.setDirty({refreshScene: false})\n        this.dispatchEvent({...e, type: 'mainCameraUpdate'})\n        this.dispatchEvent({...e, type: 'activeCameraUpdate'}) // deprecated\n        if (e.source !== 'RootScene') {\n            if (e.key === 'fov' && this.dollyActiveCameraFov()) return\n            if (this.refreshActiveCameraNearFar(!e.projectionUpdated)) {\n                // it will call mainCameraUpdate twice, that's fine first without projectionUpdated, then with projectionUpdated\n                return\n            }\n        }\n    }\n\n    // cached values\n    private _sceneBounds: Box3B = new Box3B\n    private _sceneBoundingRadius = 0\n\n    refreshScene(event?: Partial<(ISceneEventMap['objectUpdate']|ISceneEventMap['geometryUpdate']|ISceneEventMap['geometryChanged'])> & ISceneSetDirtyOptions & {type?: keyof ISceneEventMap}): this {\n        const fromSelf = event && event.type === 'objectUpdate' && (event.object === this || (event as any).target === this)\n        // todo test the isCamera here. this is for animation object plugin\n        if (event?.sceneUpdate === false || event?.refreshScene === false || event?.object?.isCamera) return fromSelf ? this : this.setDirty(event) // so that it doesn't trigger frame fade, shadow refresh etc\n        // console.warn(event)\n        this.refreshActiveCameraNearFar()\n        // this.dollyActiveCameraFov()\n        this._sceneBounds = this.getBounds(false, true)\n        this._sceneBoundingRadius = this._sceneBounds.getSize(new Vector3()).length() / 2.\n        this.dispatchEvent({...event, type: 'sceneUpdate', hierarchyChanged: ['addedToParent', 'removedFromParent'].includes(event?.change || '')})\n        if (!fromSelf) iObjectCommons.setDirty.call(this, {...event, scene: this})\n        return this\n    }\n\n    refreshUi = iObjectCommons.refreshUi.bind(this)\n    traverseModels = iObjectCommons.traverseModels.bind(this)\n\n    /**\n     * Dispose the scene and clear all resources.\n     */\n    dispose(clear = true): void {\n        this.disposeSceneModels(false, clear)\n\n        if (clear) {\n            [...this.children].forEach(child => child.dispose ? child.dispose() : child.removeFromParent())\n            this.clear()\n        }\n\n        // todo: dispose more stuff?\n        this.disposeTextures(clear)\n        return\n    }\n\n    /**\n     * Dispose and optionally remove all textures set directly on this scene.\n     * @param clear\n     */\n    disposeTextures(clear = true) {\n        this.environment?.dispose()\n        if ((this.background as ITexture)?.isTexture) (this.background as ITexture)?.dispose?.()\n\n        if (clear) {\n            this.environment = null\n            this.background = null\n        }\n    }\n\n    /**\n     * Returns the bounding box of the whole scene (model root and other meta objects).\n     * To get the bounds of just the objects added by the user(not by plugins) use `new Box3B().expandByObject(scene.modelRoot)`\n     * @param precise\n     * @param ignoreInvisible\n     * @param ignoreWidgets\n     * @param ignoreObject\n     * @returns {Box3B}\n     */\n    getBounds(precise = false, ignoreInvisible = true, ignoreWidgets = true, ignoreObject?: (obj: Object3D)=>boolean): Box3B {\n        // See bboxVisible in userdata in Box3B\n        return new Box3B().expandByObject(this, precise, ignoreInvisible, (o: any)=>{\n            if (ignoreWidgets && ((o as IWidget).isWidget || o.assetType === 'widget')) return true\n            return ignoreObject?.(o) ?? false\n        })\n    }\n\n    /**\n     * Similar to {@link getBounds}, but returns the bounding box of just the {@link modelRoot}.\n     * @param precise\n     * @param ignoreInvisible\n     * @param ignoreWidgets\n     * @param ignoreObject\n     * @returns {Box3B}\n     */\n    getModelBounds(precise = false, ignoreInvisible = true, ignoreWidgets = true, ignoreObject?: (obj: Object3D)=>boolean): Box3B {\n        if (this.modelRoot == undefined)\n            return new Box3B()\n        return new Box3B().expandByObject(this.modelRoot, precise, ignoreInvisible, (o: any)=>{\n            if (ignoreWidgets && o.assetType === 'widget') return true\n            return ignoreObject?.(o) ?? false\n        })\n    }\n\n    @uiButton('Auto GPU Instance Meshes', {tags: ['context-menu']})\n    autoGPUInstanceMeshes() {\n        const geoms = new Set<BufferGeometry>()\n        this.modelRoot.traverseModels!((o) => {o.geometry && geoms.add(o.geometry)}, {visible: false, widgets: false})\n        geoms.forEach((g: any) => autoGPUInstanceMeshes(g))\n    }\n\n    private _v1 = new Vector3()\n    private _v2 = new Vector3()\n\n    private _autoNearFarDisabled = new Set<string>()\n\n    /**\n     * For Programmatically toggling autoNearFar. This property is not supposed to be in the UI or serialized.\n     * Use camera.userData.autoNearFar for UI and serialization\n     * This is used in PickingPlugin, editor plugins\n     * autoNearFar will still be disabled if this is true and camera.userData.autoNearFar is false\n     */\n    disableAutoNearFar(id = 'default') {\n        const enabled = this._autoNearFarDisabled.size === 0\n        this._autoNearFarDisabled.add(id)\n        const camera = this.mainCamera as ICamera\n        if (enabled && camera.userData.autoNearFar !== false) {\n            let near = camera.near, far = camera.far\n            near = camera.userData.minNearPlane ?? iCameraCommons.defaultMinNear\n            far = camera.userData.maxFarPlane ?? iCameraCommons.defaultMaxFar\n            iCameraCommons.setNearFar(camera, near, far, true, 'RootScene')\n        }\n    }\n    enableAutoNearFar(id = 'default') {\n        if (!this._autoNearFarDisabled.has(id)) return\n        this._autoNearFarDisabled.delete(id)\n        const camera = this.mainCamera as ICamera\n        if (this._autoNearFarDisabled.size === 0 && camera) {\n            this.setDirty()\n        }\n    }\n\n    /**\n     * Refreshes the scene active camera near far values, based on the scene bounding box.\n     * This is called automatically every time the camera is updated.\n     */\n    refreshActiveCameraNearFar(setDirty = true): boolean {\n        const camera = this.mainCamera as ICamera\n        if (!camera) return false\n\n        let near = camera.near, far = camera.far\n        if (camera.userData.minNearPlane !== undefined) {\n            near = camera.userData.minNearPlane\n        }\n        if (camera.userData.maxFarPlane !== undefined) {\n            far = camera.userData.maxFarPlane\n        }\n\n        // console.log(this.autoNearFarEnabled, camera.userData.autoNearFar, camera.userData.maxFarPlane, camera.far)\n        if (this._autoNearFarDisabled.size !== 0 || camera.userData.autoNearFar === false) {\n            return iCameraCommons.setNearFar(camera, near, far, setDirty, 'RootScene')\n        }\n\n        // todo check if this takes too much time with large scenes(when moving the camera and not animating), but we also need to support animations\n        const bbox = this.getBounds(false) // todo: can we use this._sceneBounds or will it have some issue with animation?\n        const size = bbox.getSize(this._v2).length()\n        if (size < 0.001) {\n            return iCameraCommons.setNearFar(camera, near, far, setDirty, 'RootScene')\n        }\n\n        camera.getWorldPosition(this._v1).sub(bbox.getCenter(this._v2))\n        const radius = 1.5 * Math.max(0.25, size) / 2.\n        const dist = this._v1.length()\n\n        // new way\n        const dist1 = Math.max(0.1, -this._v1.normalize().dot(camera.getWorldDirection(new Vector3())))\n        near = Math.max(Math.max(camera.userData.minNearPlane ?? iCameraCommons.defaultMinNear, 0.001), dist1 * (dist - radius))\n        far = Math.min(Math.max(near + radius, dist1 * (dist + radius)), camera.userData.maxFarPlane ?? iCameraCommons.defaultMaxFar)\n\n        // old way, has issues when panning very far from the camera target\n        // const near = Math.max(camera.userData.minNearPlane ?? 0.2, dist - radius)\n        // const far = Math.min(Math.max(near + 1, dist + radius), camera.userData.maxFarPlane ?? 1000)\n\n        if (far < near || far - near < 0.1) {\n            far = near + 0.1\n        }\n\n        return iCameraCommons.setNearFar(camera, near, far, setDirty, 'RootScene')\n\n        // todo try using minimum of all 6 endpoints of bbox.\n\n        // camera.near = 3\n        // camera.far = 20\n    }\n\n    /**\n     * Refreshes the scene active camera near far values, based on the scene bounding box.\n     * This is called automatically every time the camera fov is updated.\n     */\n    dollyActiveCameraFov(): boolean {\n        const camera = this.mainCamera as ICamera\n        if (!camera) return false\n        if (!camera.userData.dollyFov) {\n            return false\n        }\n\n        const bbox = this.getModelBounds(false, true, true)\n\n        // todo this is not exact because of 1.5, this needs to be calculated based on current position and last fov\n        const cameraZ = getFittingDistance(camera, bbox) * 1.5\n        const direction = new Vector3().subVectors(camera.target, camera.position).normalize()\n        camera.position.copy(direction.multiplyScalar(-cameraZ).add(camera.target))\n        camera.setDirty({change: 'position', source: 'RootScene'})\n        return true\n    }\n\n    updateShaderProperties(material: {defines: Record<string, string|number|undefined>, uniforms: {[name: string]: IUniform}}): this {\n        if (material.uniforms.sceneBoundingRadius) material.uniforms.sceneBoundingRadius.value = this._sceneBoundingRadius\n        else console.warn('RootScene: no uniform: sceneBoundingRadius')\n        return this\n    }\n\n    /**\n     * Serialize the scene properties\n     * @param meta\n     * @returns {any}\n     */\n    toJSON(meta?: any): any {\n        const o = ThreeSerialization.Serialize(this, meta, true)\n        o.envMapIntensity = o.environmentIntensity // for backward compatibility, remove later\n        return o\n    }\n\n    /**\n     * Deserialize the scene properties\n     * @param json - object from {@link toJSON}\n     * @param meta\n     * @returns {this<ICamera>}\n     */\n    fromJSON(json: any, meta?: any): this {\n        const env = json.environment\n        if (env !== undefined) {\n            this.environment = ThreeSerialization.Deserialize(env, this.environment, meta, false)\n            delete json.environment\n            if (meta?._configMetadata && meta._configMetadata.version < 2) {\n                // legacy - files saved pre three.js < r162, threepipe < v0.4.0\n                if (this.environment?.rotation) {\n                    // old files used to save y rotation inside the texture.\n                    this.environmentRotation.y = this.environment.rotation\n                    this.environment.rotation = 0 // for next save\n                }\n            }\n        }\n\n        // some files have both for backwards compatibility, prefer environmentIntensity\n        if (json.environmentIntensity !== undefined && json.envMapIntensity !== undefined) {\n            json = {...json}\n            delete json.envMapIntensity\n        }\n\n        ThreeSerialization.Deserialize(json, this, meta, true)\n        json.environment = env\n        return this\n    }\n\n    addEventListener<T extends keyof ISceneEventMap>(type: T, listener: EventListener<ISceneEventMap[T], T, this>): void {\n        if (type === 'activeCameraChange') console.error('activeCameraChange is deprecated. Use mainCameraChange instead.')\n        if (type === 'activeCameraUpdate') console.error('activeCameraUpdate is deprecated. Use mainCameraUpdate instead.')\n        if (type === 'sceneMaterialUpdate') console.error('sceneMaterialUpdate is deprecated. Use materialUpdate instead.')\n        if (type === 'update') console.error('update is deprecated. Use sceneUpdate instead.')\n        super.addEventListener(type, listener)\n    }\n\n    /**\n     * Override environment map to use during rendering.\n     * When set and _isMainRendering is true, this will be returned instead of the normal environment.\n     */\n    overrideRenderEnvironment: ITexture | null = null;\n\n    /**\n     * Flag to indicate if we're currently in the render step.\n     * Set by ViewerApp during rendering.\n     * @internal\n     */\n    ['_isMainRendering'] = false\n\n\n    // region inherited type fixes\n    // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    // dispatchEvent: (event: ISceneEvent) => void\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n\n\n    // region deprecated\n\n    /**\n     * Find objects by name exact match in the complete hierarchy.\n     * @deprecated Use {@link getObjectByName} instead.\n     * @param name - name\n     * @param parent - optional root node to start search from\n     * @returns Array of found objects\n     */\n    public findObjectsByName(name: string, parent?: IObject3D, upgradedOnly = false): IObject3D[] {\n        const o: IObject3D[] = []\n        const fn = (object: IObject3D) => {\n            if (object.name === name) o.push(object)\n        }\n        const obj: IObject3D = parent ?? this\n        if (upgradedOnly && obj.traverseModels) obj.traverseModels(fn, {visible: false, widgets: true})\n        else obj.traverse(fn)\n        return o\n    }\n\n    /**\n     * @deprecated\n     * Sets the camera pointing towards the object at a specific distance.\n     * @param rootObject - The object to point at.\n     * @param centerOffset - The distance offset from the object to point at.\n     * @param targetOffset - The distance offset for the target from the center of object to point at.\n     */\n    resetCamera(rootObject:Object3D|undefined = undefined, centerOffset = new Vector3(1, 1, 1), targetOffset = new Vector3(0, 0, 0)): void {\n        if (this._mainCamera) {\n            this.matrixWorldNeedsUpdate = true\n            this.updateMatrixWorld(true)\n            const bounds = rootObject ? new Box3B().expandByObject(rootObject, true, true) : this.getBounds(true)\n            const center = bounds.getCenter(new Vector3())\n            const radius = bounds.getSize(new Vector3()).length() * 0.5\n\n            center.add(targetOffset.clone().multiplyScalar(radius))\n\n            this._mainCamera.position = new Vector3( // todo: for nested cameras?\n                center.x + centerOffset.x * radius,\n                center.y + centerOffset.y * radius,\n                center.z + centerOffset.z * radius,\n            )\n            this._mainCamera.target = center\n            // this.scene.mainCamera.controls?.targetOffset.set(0, 0, 0)\n            this.setDirty()\n        }\n\n    }\n\n\n    /**\n     * Minimum Camera near plane\n     * @deprecated - use camera.minNearPlane instead\n     */\n    get minNearDistance(): number {\n        console.error('minNearDistance is deprecated. Use camera.userData.minNearPlane instead')\n        return this.mainCamera.userData.minNearPlane ?? 0.02\n    }\n    /**\n     * @deprecated - use camera.minNearPlane instead\n     */\n    set minNearDistance(value: number) {\n        console.error('minNearDistance is deprecated. Use camera.userData.minNearPlane instead')\n        if (this.mainCamera)\n            this.mainCamera.userData.minNearPlane = value\n    }\n\n\n    /**\n     * @deprecated\n     */\n    get activeCamera(): ICamera {\n        console.error('activeCamera is deprecated. Use mainCamera instead.')\n        return this.mainCamera\n    }\n\n    /**\n     * @deprecated\n     */\n    set activeCamera(camera: ICamera | undefined) {\n        console.error('activeCamera is deprecated. Use mainCamera instead.')\n        this.mainCamera = camera\n    }\n\n    /**\n     * Get the threejs scene object\n     * @deprecated\n     */\n    get modelObject(): this {\n        return this as any\n    }\n\n    /**\n     * Add any processed scene object to the scene.\n     * @deprecated renamed to {@link addObject}\n     * @param imported\n     * @param options\n     */\n    addSceneObject<T extends IObject3D|Object3D = IObject3D>(imported: T, options?: AddObjectOptions): T {\n        return this.addObject(imported, options)\n    }\n\n    /**\n     * Equivalent to setDirty({refreshScene: true}), dispatches 'sceneUpdate' event with the specified options.\n     * @deprecated use refreshScene\n     * @param options\n     */\n    updateScene(options?: AnyOptions): this {\n        console.warn('updateScene is deprecated. Use refreshScene instead')\n        return this.refreshScene(options || {})\n    }\n\n    /**\n     * @deprecated renamed to {@link clearSceneModels}\n     */\n    removeSceneModels() {\n        this.clearSceneModels()\n    }\n\n    /**\n     * @deprecated use {@link enableAutoNearFar} and {@link disableAutoNearFar} instead.\n     */\n    get autoNearFarEnabled() {\n        return this._autoNearFarDisabled.size === 0\n    }\n    /**\n     * @deprecated use {@link enableAutoNearFar} and {@link disableAutoNearFar} instead.\n     */\n    set autoNearFarEnabled(v) {\n        if (v) this.enableAutoNearFar('default')\n        else this.disableAutoNearFar('default')\n    }\n\n    /**\n     * @deprecated Use environmentIntensity instead.\n     */\n    get envMapIntensity() {\n        console.warn('RootScene.envMapIntensity is deprecated, use environmentIntensity instead.')\n        return this.environmentIntensity\n    }\n    set envMapIntensity(value: number) {\n        console.warn('RootScene.envMapIntensity is deprecated, use environmentIntensity instead.')\n        this.environmentIntensity = value\n    }\n\n    // endregion\n}\n\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\nclass RenderPass extends Pass {\n\n\tconstructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.overrideMaterial = overrideMaterial;\n\n\t\tthis.clearColor = clearColor;\n\t\tthis.clearAlpha = clearAlpha;\n\n\t\tthis.clear = true;\n\t\tthis.clearDepth = false;\n\t\tthis.needsSwap = false;\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive, depthRenderBuffer ) {\n\n\t\tif ( ! this.scene || ! this.camera ) return;\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tlet oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\trenderer.setClearColor( this.clearColor );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\t\t\trenderer.setClearAlpha( this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth == true ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\tif ( depthRenderBuffer ) {\n\n\t\t\tconst _gl = renderer.getContext();\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, depthRenderBuffer );\n\t\t\t// todo: stencil and depth stencil similar to ogl\n\n\t\t}\n\n\t\tif ( this.clear === true ) {\n\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera );\n\n\t\tif ( depthRenderBuffer ) {\n\n\t\t\tconst _gl = renderer.getContext();\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// restore\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\trenderer.setClearAlpha( oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n}\n\nexport { RenderPass };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t\tthis.useExistingRenderTarget = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] && readBuffer ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\tif ( ! this.useExistingRenderTarget )\n\t\t\t\trenderer.setRenderTarget( writeBuffer || null ); // use null if undefined\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import {IPass} from './Pass'\nimport {ShaderPass} from 'three/examples/jsm/postprocessing/ShaderPass.js'\nimport {ExtendedShaderMaterial, IWebGLRenderer, ShaderMaterial2} from '../core'\nimport {ShaderLibShader, ShaderMaterialParameters, WebGLRenderTarget} from 'three'\nimport {uiToggle} from 'uiconfig.js'\nimport {onChange2, serialize} from 'ts-browser-helpers'\nimport {IShaderPropertiesUpdater} from '../materials'\n\nexport class ExtendedShaderPass extends ShaderPass implements IPass {\n    public static readonly DEFAULT_TEX_ID = 'tDiffuse'\n\n    declare material: ShaderMaterial2\n    overrideReadBuffer: {texture?: WebGLRenderTarget['texture']}|null = null\n\n    readonly isExtendedShaderPass = true\n    // private _textureIDs: string[]\n\n    @uiToggle('Enabled') @serialize()\n    @onChange2(ExtendedShaderPass.prototype.setDirty)\n        enabled = true\n\n    constructor(shader: ShaderMaterial2|ShaderMaterialParameters, ...textureID: string[]) {\n        super(\n            (<ShaderMaterial2>shader).isMaterial ? <ShaderMaterial2>shader : new ExtendedShaderMaterial(<ShaderMaterialParameters>shader, textureID),\n            textureID.length < 1 ? ExtendedShaderPass.DEFAULT_TEX_ID : textureID[0])\n        this.setDirty = this.setDirty.bind(this)\n    }\n\n    // writes to writeBuffer\n    render(renderer: IWebGLRenderer, writeBuffer?: WebGLRenderTarget|null, readBuffer?: WebGLRenderTarget, deltaTime?: number, maskActive?: boolean) {\n        if (!this.enabled) return\n        renderer.renderWithModes({\n            backgroundRender: false,\n        }, ()=>{\n            super.render(renderer, writeBuffer || null, (this.overrideReadBuffer as WebGLRenderTarget) || readBuffer, deltaTime, maskActive)\n        })\n    }\n\n    /**\n     * to be called from beforeRender or onObjectRender or similar.\n     * @param updater\n     */\n    updateShaderProperties(updater?: (IShaderPropertiesUpdater|undefined) | (IShaderPropertiesUpdater|undefined)[]) {\n        if (!updater) return\n        if (!Array.isArray(updater)) updater = [updater]\n        updater.forEach(value => value?.updateShaderProperties(this.material))\n    }\n\n    public onDirty: (()=>void)[] = []\n    dispose() {\n        this.material?.dispose?.()\n        this.fsQuad?.dispose?.()\n        this.onDirty = []\n    }\n\n    setDirty() {\n        if (this.material) this.material.needsUpdate = true // do this when material defines etc are changed\n        this.onDirty?.forEach(v=>v())\n    }\n\n\n    // legacy\n\n    /**\n     * @deprecated renamed to {@link isExtendedShaderPass}\n     */\n    get isShaderPass2() {\n        console.error('isShaderPass2 is deprecated, use isExtendedShaderPass instead')\n        return true\n    }\n\n}\n\n/**\n * @deprecated renamed to {@link ExtendedShaderPass}\n */\nexport class ShaderPass2 extends ExtendedShaderPass {\n    constructor(shader: ShaderLibShader|ShaderMaterial2, ...textureID: string[]) {\n        console.error('ShaderPass2 is renamed to ExtendedShaderPass')\n        super(shader, ...textureID)\n    }\n}\n\n","import {IUniform, Texture} from 'three'\nimport {CopyShader} from 'three/examples/jsm/shaders/CopyShader.js'\nimport {ExtendedShaderPass} from './ExtendedShaderPass'\nimport {IPass} from './Pass'\n\nexport class GenericBlendTexturePass extends ExtendedShaderPass implements IPass {\n    constructor(uniforms: {[uniform: string]: IUniform}, blendFunc = 'c = a + b;', extraFrag = '', texture?: Texture, maxIntensity = 120) {\n        super({\n            vertexShader: CopyShader.vertexShader,\n            fragmentShader: `\n                varying vec2 vUv;\n                ${extraFrag}\n                void main() {\n                    vec4 a = tDiffuseTexelToLinear ( texture2D( tDiffuse, vUv ) );\n                    vec4 b = tDiffuse2TexelToLinear ( texture2D( tDiffuse2, vUv ) );\n                    vec4 c = vec4(0);\n                    ${blendFunc}\n                    c = clamp(c, vec4(0), vec4(MAX_INTENSITY));\n                    gl_FragColor = c;\n                    #include <colorspace_fragment>\n                }\n            `,\n            uniforms: {\n                'tDiffuse': {value: null},\n                'tDiffuse2': {value: texture},\n                ...uniforms,\n            },\n            defines: {\n                ['MAX_INTENSITY']: maxIntensity,\n            },\n        }, 'tDiffuse', 'tDiffuse2')\n        this.clear = false\n        this.needsSwap = true\n    }\n\n}\n","import {IPipelinePass} from './Pass'\nimport {RenderPass} from 'three/examples/jsm/postprocessing/RenderPass.js'\nimport {\n    Color,\n    HalfFloatType,\n    LinearFilter,\n    Material,\n    NoColorSpace,\n    RGBAFormat,\n    UnsignedByteType,\n    WebGLRenderTarget,\n} from 'three'\nimport {generateUiConfig, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {serialize} from 'ts-browser-helpers'\nimport {GenericBlendTexturePass} from './GenericBlendTexturePass'\nimport {IRenderTarget} from '../rendering'\nimport {ICamera, IRenderManager, IScene, IWebGLRenderer} from '../core'\nimport {ViewerRenderManager} from '../viewer'\n\nexport class ExtendedRenderPass extends RenderPass implements IPipelinePass<'render'> {\n    readonly isExtendedRenderPass = true\n\n    @uiToggle('Enabled') @serialize() enabled = true\n    readonly passId = 'render'\n\n    private _blendPass: GenericBlendTexturePass\n    readonly renderManager: ViewerRenderManager\n    private _doTransmissionFix = true\n    blurTransmissionTarget = true\n    preserveTransparentTarget = false\n    private _transparentTarget?: IRenderTarget\n\n    /**\n     * A render target to render transparent, transmissive objects to.\n     * Note that it is only used when {@link renderManager.rgbm} is true\n     */\n    get transparentTarget(): IRenderTarget {\n        if (!this._transparentTarget) {\n            const msaa = this.renderManager.msaa\n            this._transparentTarget = this.renderManager.getTempTarget({\n                sizeMultiplier: 1,\n                samples: msaa ? typeof msaa !== 'number' ? ViewerRenderManager.DEFAULT_MSAA_SAMPLES : msaa : 0,\n                stencilBuffer: this.renderManager.composerTarget.stencilBuffer,\n                colorSpace: NoColorSpace,\n                type: this.renderManager.renderer.extensions.has('EXT_color_buffer_half_float') ? HalfFloatType : UnsignedByteType,\n                format: RGBAFormat,\n                minFilter: LinearFilter,\n                magFilter: LinearFilter,\n                depthBuffer: false,\n            })\n        }\n        return this._transparentTarget\n    }\n\n    private _releaseTransparentTarget() {\n        if (this._transparentTarget)\n            this.renderManager.releaseTempTarget(this._transparentTarget)\n        this._transparentTarget = undefined\n    }\n\n    /**\n     * Preserve the {@link opaqueTarget} after rendering.\n     */\n    /* readonly */ preserveOpaqueTarget = false\n    private _opaqueTarget?: WebGLRenderTarget\n\n    /**\n     * Whether to render the scene background in this pass.\n     * Not serialized\n     */\n    renderBackground = true\n\n    /**\n     * A render target to render opaque objects to.\n     * Note that it is only used when {@link renderManager.msaa} is true\n     */\n    get opaqueTarget(): WebGLRenderTarget {\n        if (!this._opaqueTarget) {\n            const composerTarget = this.renderManager.composerTarget as WebGLRenderTarget\n            const msaa = this.renderManager.msaa\n            this._opaqueTarget = this.renderManager.getTempTarget({\n                sizeMultiplier: 1,\n                samples: msaa ? typeof msaa !== 'number' ? ViewerRenderManager.DEFAULT_MSAA_SAMPLES : msaa : 0,\n                stencilBuffer: this.renderManager.composerTarget.stencilBuffer,\n                colorSpace: composerTarget.texture.colorSpace,\n                type: this.renderManager.rgbm ? UnsignedByteType : HalfFloatType,\n                format: composerTarget.texture.format,\n                minFilter: composerTarget.texture.minFilter,\n                magFilter: composerTarget.texture.magFilter,\n                depthBuffer: composerTarget.depthBuffer,\n                generateMipmaps: composerTarget.texture.generateMipmaps,\n            })\n            // console.log(this._opaqueTarget.samples)\n        }\n        return this._opaqueTarget\n    }\n    private _releaseOpaqueTarget() {\n        if (this._opaqueTarget)\n            this.renderManager.releaseTempTarget(this._opaqueTarget)\n        this._opaqueTarget = undefined\n    }\n\n    constructor(renderManager: ViewerRenderManager, overrideMaterial?: Material, clearColor = new Color(0, 0, 0), clearAlpha = 0) {\n        super(undefined, undefined, overrideMaterial, clearColor, clearAlpha)\n        this.renderManager = renderManager\n        this._blendPass = new GenericBlendTexturePass({}, 'c = vec4(a.rgb * (1. - b.a) + b.rgb * b.a, 1.);', '', undefined, renderManager.maxHDRIntensity)\n        this.setDirty = this.setDirty.bind(this)\n    }\n\n    // names are incorrect. We read from `writeBuffer` and write to `readBuffer`. same in super class\n    render(renderer: IWebGLRenderer, writeBuffer?: WebGLRenderTarget|null, readBuffer?: WebGLRenderTarget, deltaTime?: number, maskActive?: boolean) {\n        if (!this.enabled) return\n        let needsSwap = false\n\n        renderer.userData.mainRenderPass = true\n        if (!this._doTransmissionFix && !this.renderManager.rgbm) {\n            super.render(renderer, writeBuffer || null, readBuffer, deltaTime, maskActive)\n            this.needsSwap = needsSwap\n            renderer.userData.mainRenderPass = undefined\n            return\n        }\n\n        const ud = renderer.userData\n        if (!ud) console.error('threejs is not patched. Use the @repalash/three.js-modded to this functionality.')\n\n        const useGBufferDepth = (this.renderManager.zPrepass || !this.renderManager.depthBuffer) && this.renderManager.gbufferTarget\n        let depthRenderBuffer: WebGLRenderbuffer | undefined = undefined\n\n        if (useGBufferDepth) {\n\n            const gbuffer = this.renderManager.gbufferTarget\n            if (gbuffer) {\n                const renderBufferProps = renderer.properties.get(gbuffer)\n                depthRenderBuffer = renderBufferProps.__webglDepthRenderbuffer || renderBufferProps.__webglDepthbuffer\n            }\n            if (!depthRenderBuffer) {\n                console.warn('No depth/gbuffer present for zPrepass.')\n            }\n\n        }\n\n        const lastReadBuffer = readBuffer\n\n        // if msaa we need to create a new multi sampled target to render to\n\n        // todo\n        readBuffer = this.renderManager.msaa ? this.opaqueTarget : readBuffer\n        // readBuffer = this.opaqueTarget\n        // if(readBuffer?.samples !== gbuffer?.samples)\n        //     console.error('ExtendedRenderPass - readBuffer and gbuffer samples are not same', readBuffer?.samples, gbuffer?.samples)\n\n        let renderFn = ()=> {\n            super.render(renderer, null, readBuffer, deltaTime, maskActive, depthRenderBuffer) // read is write in super.render (RenderPass)\n        }\n\n        if (!this.renderManager.rgbm) {\n\n            // Opaque + Transparent\n            {\n\n                const curClear = this.clear\n                const curClearDepth = renderer.autoClearDepth\n                renderer.autoClearDepth = !useGBufferDepth\n                this.clear = true\n\n                renderer.renderWithModes({\n                    shadowMapRender: true,\n                    backgroundRender: this.renderBackground,\n                    opaqueRender: true,\n                    transparentRender: true,\n                    transmissionRender: false,\n                }, renderFn)\n\n                this.clear = curClear\n                renderer.autoClearDepth = curClearDepth\n\n            }\n\n            // Transmissive\n            {\n                const source = !readBuffer ? undefined : readBuffer.texture\n                // todo: first check if any transmissive object is there to use this buffer\n                this.renderManager.blit(writeBuffer, {clear: true, source})\n                // viewer.renderer.blit(writeBuffer.texture as any, readBuffer as any, {})\n                // super.render(renderer, undefined as any, writeBuffer, deltaTime, maskActive); // copy read to write buffer\n\n                const curClear = this.clear\n                this.clear = false\n\n                // don't need this clear is already false\n                // const curClearDepth = renderer.autoClearDepth\n                // renderer.autoClearDepth = false\n\n                ud.transmissionRenderTarget = writeBuffer\n                ud.blurTransmissionTarget = this.blurTransmissionTarget && ud.transmissionRenderTarget.samples === 0 // todo: not working with msaa target. its fine now because writeBuffer is never multi sampled\n\n                renderer.renderWithModes({\n                    shadowMapRender: false,\n                    backgroundRender: false,\n                    opaqueRender: false,\n                    transparentRender: false,\n                    transmissionRender: true,\n                }, renderFn)\n\n                ud.blurTransmissionTarget = undefined\n                ud.transmissionRenderTarget = undefined\n\n                // renderer.autoClearDepth = curClearDepth\n\n                this.clear = curClear\n            }\n\n            needsSwap = false\n\n        } else if (this.renderManager.rgbm) {\n\n            needsSwap = false\n\n            const renderToScreen = this.renderToScreen\n            if (renderToScreen && !writeBuffer) {\n                console.error('ExtendedRenderPass: renderToScreen is true but writeBuffer is not set, which is required for rgbm')\n            }\n            this.renderToScreen = false // for super RenderPass.render\n\n            if (renderer.info && !renderer.info.autoReset)\n                throw 'renderer.info.autoReset must be true' // it is required to check if any object is rendered in the scene, also frame count is maintained separately in the render manager, use that.\n\n\n            // Opaque\n            {\n                const curClearDepth = renderer.autoClearDepth\n                renderer.autoClearDepth = !useGBufferDepth\n\n                renderer.renderWithModes({\n                    shadowMapRender: true,\n                    backgroundRender: this.renderBackground,\n                    opaqueRender: true,\n                    transparentRender: false,\n                    transmissionRender: false,\n                }, renderFn) // render to readBuffer\n\n                renderer.autoClearDepth = curClearDepth\n\n            }\n\n            if (!useGBufferDepth && readBuffer) {\n                const renderBufferProps2 = renderer.properties.get(readBuffer)\n                depthRenderBuffer = renderBufferProps2.__webglDepthRenderbuffer || renderBufferProps2.__webglDepthbuffer\n            }\n\n            // readBuffer has data\n\n            renderFn = ()=> {\n                super.render(renderer, null, this.transparentTarget as any, deltaTime, maskActive, depthRenderBuffer)\n            }\n\n            // Transparent\n            {\n                const curClear = this.clear\n                const curClearDepth = renderer.autoClearDepth\n                renderer.autoClearDepth = false\n                this.clear = true\n\n                renderer.renderWithModes({\n                    shadowMapRender: false,\n                    backgroundRender: false,\n                    opaqueRender: false,\n                    transparentRender: true,\n                    transmissionRender: false,\n                }, renderFn) // render to transparentTarget\n\n                this.clear = curClear\n                renderer.autoClearDepth = curClearDepth\n            }\n\n            if (!renderer.info || renderer.info.render.calls > 0) {\n\n                // writeBuffer = transparentTarget + readBuffer\n                this._blendPass.uniforms.tDiffuse2.value = this.transparentTarget.texture\n                this._blendPass.render(renderer, writeBuffer, readBuffer, deltaTime, maskActive)\n                needsSwap = true // writeBuffer has the data now.\n\n            }\n\n            // if needsSwap, writeBuffer has data, else readBuffer\n\n            // Transmission\n            {\n                const curClear = this.clear\n                this.clear = false // it is cleared in transparent pass above even if no object is rendered\n\n                // const curClearDepth = renderer.autoClearDepth\n                // renderer.autoClearDepth = false\n\n                // if needsSwap, writeBuffer has current data, else readBuffer\n                ud.transmissionRenderTarget = needsSwap ? writeBuffer : readBuffer\n                ud.blurTransmissionTarget = this.blurTransmissionTarget && ud.transmissionRenderTarget.samples === 0 // todo: not working with msaa\n\n                renderer.renderWithModes({\n                    shadowMapRender: false,\n                    backgroundRender: false,\n                    opaqueRender: false,\n                    transparentRender: false,\n                    transmissionRender: true,\n                }, renderFn) // render to transparentTarget\n\n                ud.blurTransmissionTarget = undefined\n                ud.transmissionRenderTarget = undefined\n\n                // renderer.autoClearDepth = curClearDepth\n\n                this.clear = curClear\n            }\n\n            // console.log(renderer.info.render.calls)\n            if (!renderer.info || renderer.info.render.calls > 0) {\n\n                // console.log('missive blit', renderer.info.render.frame)\n\n                // writeBuffer = transparentTarget + readBuffer. opaque will overwrite opaque pixels again\n                this._blendPass.uniforms.tDiffuse2.value = this.transparentTarget.texture\n                this._blendPass.render(renderer, writeBuffer, readBuffer, deltaTime, maskActive)\n                needsSwap = true // writeBuffer has the data now.\n\n            }\n\n            // if needsSwap, writeBuffer has data, else readBuffer\n\n            if (renderToScreen) {\n                this.renderToScreen = true\n                const tex = needsSwap ? writeBuffer?.texture : readBuffer?.texture\n                const source = Array.isArray(tex) ? tex[0] : tex\n                source && this.renderManager.blit(undefined, {\n                    source, respectColorSpace: true,\n                })\n                // needsSwap = false\n            }\n\n        }\n\n        // todo no need to do this if renderToScreen is true\n        // resolve msaa\n        if (!needsSwap && lastReadBuffer !== readBuffer && readBuffer) {\n            // copy from readBuffer to lastReadBuffer\n            const source = Array.isArray(readBuffer.texture) ? readBuffer.texture[0] : readBuffer.texture\n            source && this.renderManager.blit(lastReadBuffer, {\n                source: source, clear: true,\n            })\n            readBuffer = lastReadBuffer\n        }\n\n        if (!this.preserveTransparentTarget)\n            this._releaseTransparentTarget()\n        if (!this.preserveOpaqueTarget)\n            this._releaseOpaqueTarget()\n\n        this.needsSwap = needsSwap\n        renderer.userData.mainRenderPass = undefined\n    }\n\n\n    public onDirty: (()=>void)[] = []\n    dispose() {\n        this._releaseTransparentTarget()\n        this.onDirty = []\n        this.scene = undefined\n        this.camera = undefined\n        super.dispose?.()\n    }\n\n    setDirty() {\n        this.onDirty.forEach(v=>v())\n    }\n\n    beforeRender(scene: IScene, camera: ICamera, _: IRenderManager): void {\n        this.scene = scene\n        this.camera = camera\n    }\n\n    uiConfig: UiObjectConfig = {\n        label: 'Render Pass',\n        type: 'folder',\n        children: generateUiConfig(this),\n    }\n\n\n    // legacy\n\n    /**\n     * @deprecated renamed to {@link isExtendedRenderPass}\n     */\n    get isRenderPass2() {\n        console.error('isRenderPass2 is deprecated, use isExtendedRenderPass instead')\n        return true\n    }\n\n}\n\n/**\n * @deprecated renamed to {@link ExtendedRenderPass}\n */\nexport class RenderPass2 extends ExtendedRenderPass {\n    constructor(...args: ConstructorParameters<typeof ExtendedRenderPass>) {\n        console.error('RenderPass2 is deprecated, use ExtendedRenderPass instead')\n        super(...args)\n    }\n}\n\n","import {UniformsUtils} from 'three'\nimport {CopyShader} from 'three/examples/jsm/shaders/CopyShader.js'\nimport {getOrCall, glsl, ValOrFunc} from 'ts-browser-helpers'\nimport {ExtendedShaderPass} from './ExtendedShaderPass'\n\nexport class ExtendedCopyPass extends ExtendedShaderPass {\n    constructor(snippet?: ValOrFunc<string, [string]>, respectColorSpace = true) {\n        super({\n            uniforms: UniformsUtils.clone(CopyShader.uniforms),\n            vertexShader: CopyShader.vertexShader,\n            fragmentShader: glsl`\n                uniform float opacity;\n                #include <alphatest_pars_fragment>\n                varying vec2 vUv;\n                void main() {\n                    ${respectColorSpace ?\n        'vec4 diffuseColor = tDiffuseTexelToLinear(texture2D(tDiffuse, vUv)) * opacity;' :\n        'vec4 diffuseColor = texture2D(tDiffuse, vUv) * opacity;'}\n                    #include <alphatest_fragment>\n                    ${snippet ? getOrCall(snippet, 'diffuseColor') : ''}\n                    #ifdef OPAQUE\n                    diffuseColor.a = 1.0;\n                    #endif\n                    gl_FragColor = diffuseColor;\n                    ${respectColorSpace ? '#include <colorspace_fragment>' : ''}\n                }\n            `,\n        }, 'tDiffuse')\n    }\n}\n","import {Color, Material, WebGLRenderTarget} from 'three'\nimport {RenderPass} from 'three/examples/jsm/postprocessing/RenderPass.js'\nimport {IPassID, IPipelinePass} from './Pass'\nimport {ICamera, IMaterial, IObject3D, IRenderManager, IScene, IWebGLRenderer, PhysicalMaterial} from '../core'\nimport {uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {getOrCall, ValOrFunc} from 'ts-browser-helpers'\n\n@uiFolderContainer<GBufferRenderPass>((c)=>c.passId + ' Render Pass')\nexport class GBufferRenderPass<TP extends IPassID=IPassID, T extends WebGLRenderTarget|undefined=WebGLRenderTarget> extends RenderPass implements IPipelinePass<TP> { // todo: extend from jittered?\n    readonly isGBufferRenderPass = true\n    uiConfig: UiObjectConfig\n\n    @uiToggle('Enabled') enabled = true\n\n    declare scene?: IScene\n    before?: IPassID[]\n    after?: IPassID[]\n    required?: IPassID[]\n\n    constructor(public readonly passId: TP, public target: ValOrFunc<T>, material: Material, clearColor: Color = new Color(1, 1, 1), clearAlpha = 1) {\n        super(undefined, undefined, material, clearColor, clearAlpha)\n    }\n\n    private _transparentMats = new Set<IMaterial>()\n    private _transmissiveMats = new Set<[IMaterial, number]>()\n\n    // todo make a global parameter in the viewer to be able to render all transparent and transmissive materials to gbuffer by default\n    preprocessMaterial = (material: IMaterial, renderToGBuffer?: boolean) => {\n        renderToGBuffer = renderToGBuffer ?? material.userData.renderToGBuffer\n        if (material.userData.pluginsDisabled) renderToGBuffer = false\n        if (\n            material.transparent && (renderToGBuffer || material.opacity > 0.99 && !material.map && !material.alphaMap) || // transparent and render to gbuffer\n            !material.transparent && !material.transmission && renderToGBuffer === false // opaque and dont render to gbuffer\n        ) {\n            this._transparentMats.add(material)\n            material.transparent = !material.transparent\n            // material.needsUpdate = true\n        }\n        if (\n            material.transmission &&\n            Math.abs(material.transmission || 0) > 0 && renderToGBuffer // transmission and render to gbuffer\n        ) {\n            this._transmissiveMats.add([material, material.transmission])\n            material.transmission = 0\n            // material.needsUpdate = true\n        }\n    }\n\n    preprocessObject = (object: IObject3D) => {\n        if (object.customDepthMaterial) {\n            const mat = object.customDepthMaterial\n            mat.allowOverride = false\n            // todo save the current forcedOverrideMaterial to restore it later?\n            const current = object.material\n            object.forcedOverrideMaterial = mat\n            const current0 = Array.isArray(current) ? current[0] : current\n            if (current0) {\n                mat.userData.renderToGBuffer = current0.userData.renderToGBuffer\n                mat.userData.renderToDepth = current0.userData.renderToDepth\n                mat.userData.pluginsDisabled = current0.userData.pluginsDisabled\n                // todo other plugin userData\n                mat.side = current0.side\n            }\n            return mat as IMaterial\n        }\n        return object.material\n    }\n\n    postprocessObject = (object: IObject3D) => {\n        if (object.customDepthMaterial) {\n            delete object.forcedOverrideMaterial\n        }\n    }\n\n    /**\n     * Renders to {@link target}\n     * @param renderer\n     * @param _ - this is ignored\n     * @param _1 - this is ignored\n     * @param deltaTime\n     * @param maskActive\n     */\n    render(renderer: IWebGLRenderer, _?: WebGLRenderTarget|null, _1?: WebGLRenderTarget, deltaTime?: number, maskActive?: boolean) {\n        if (!this.scene || !this.camera) return\n\n        const t = renderer.getRenderTarget()\n        const activeCubeFace = renderer.getActiveCubeFace()\n        const activeMipLevel = renderer.getActiveMipmapLevel()\n\n        const objects = new Set<IObject3D>()\n        this.scene.traverse((object) => {\n            if (!object.visible) return\n            objects.add(object)\n            const material = this.preprocessObject(object)\n            if (!material) return\n            if (Array.isArray(material)) material.forEach((m)=>this.preprocessMaterial(m))\n            else this.preprocessMaterial(material)\n        })\n\n        // todo; copy double sided, check with post processing\n\n        renderer.renderWithModes({\n            shadowMapRender: false,\n            backgroundRender: false,\n            opaqueRender: true,\n            transparentRender: false,\n            transmissionRender: false,\n            mainRenderPass: false,\n        }, ()=> super.render(renderer, null, getOrCall(this.target), deltaTime as any, maskActive as any)) // here this.target is the write-buffer, variable writeBuffer is ignored\n\n        this._transparentMats.forEach(m => m.transparent = !m.transparent)\n        this._transparentMats.clear()\n\n        this._transmissiveMats.forEach(([m, tr]: [PhysicalMaterial, number]) => m.transmission = tr)\n        this._transmissiveMats.clear()\n\n        renderer.setRenderTarget(t, activeCubeFace, activeMipLevel)\n\n        objects.forEach(o => this.postprocessObject(o))\n    }\n\n    beforeRender(scene: IScene, camera: ICamera, _: IRenderManager): void {\n        this.scene = scene\n        this.camera = camera\n    }\n\n}\n","#include <packing>\n\nvarying vec2 vUv;\n\n#include <alphatest_pars_fragment>\n\nvoid main() {\n\n    vec4 diffuseColor = tDiffuseTexelToLinear (texture2D(tDiffuse, vUv));\n\n    #ifdef HAS_TRANSPARENT_TARGET\n    vec4 transparentColor = tTransparentTexelToLinear (texture2D(tTransparent, vUv));\n    #else\n    vec4 transparentColor = vec4(0.0);\n    #endif\n\n    #ifdef HAS_GBUFFER\n    float depth = getDepth(vUv);\n    bool isBackground = depth>0.99 && transparentColor.a < 0.001;\n    #endif\n\n    #glMarker\n\n    #ifdef HAS_GBUFFER\n\n        #if (defined(CLIP_BACKGROUND) && CLIP_BACKGROUND > 0) || defined(CLIP_BACKGROUND_FORCE)\n            if(isBackground) diffuseColor.a = 0.0;\n            if(depth>0.99 && transparentColor.a >= 0.001) diffuseColor.a = transparentColor.a;\n        #endif\n\n        if(depth < 0.00001) diffuseColor.a = 0.0;\n\n    #endif\n\n    #include <alphatest_fragment>\n    #ifdef OPAQUE\n    diffuseColor.a = 1.0;\n    #endif\n    gl_FragColor = diffuseColor;\n    //gl_FragColor = isBackground ? vec4(0, 0, 0, 1) : gl_FragColor;\n//    gl_FragColor = vec4(depth, 0, 0, 1);\n    #include <colorspace_fragment>\n}\n","import {ExtendedShaderPass} from './ExtendedShaderPass'\nimport {ColorSpace, FrontSide, NoBlending, ShaderMaterialParameters, SRGBColorSpace, WebGLRenderTarget} from 'three'\nimport {ICamera, IRenderManager, IScene, IWebGLRenderer, ShaderMaterial2} from '../core'\nimport {CopyShader} from 'three/examples/jsm/shaders/CopyShader.js'\nimport {IPassID, IPipelinePass} from './Pass'\nimport {uiDropdown, uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {ViewerRenderManager} from '../viewer'\nimport {matDefineBool, threeConstMappings} from '../three'\nimport ScreenPassShader from './ScreenPass.glsl'\nimport {shaderReplaceString} from '../utils'\n\nexport type TViewerScreenShaderFrag = string | [string, string] | {pars?: string, main: string}\nexport type TViewerScreenShader = TViewerScreenShaderFrag | ShaderMaterialParameters | ShaderMaterial2\n\n/**\n * Screen Pass\n *\n * This pass renders the final scene to the screen.\n * It can be extended by Screen Pass Extensions to apply post-processing effects, such as tonemapping, color grading, etc.\n *\n * It is used by default in {@link ViewerRenderManager} to render the final scene.\n * A custom material/shader can be passed to the constructor to use a custom base fragment shader.\n */\n@uiFolderContainer('Screen Pass')\nexport class ScreenPass extends ExtendedShaderPass implements IPipelinePass<'screen'> {\n    declare uiConfig: UiObjectConfig\n    readonly passId = 'screen'\n    after: IPassID[] = ['render']\n    required: IPassID[] = ['render']\n\n    constructor(shader: TViewerScreenShader = '', ...textureID: string[]) {\n        super(\n            (<any>shader)?.fragmentShader || (<ShaderMaterial2>shader)?.isShaderMaterial ? <ShaderMaterialParameters|ShaderMaterial2>shader :\n                makeScreenShader(shader),\n            ...textureID.length ? textureID : ['tDiffuse', 'tTransparent'])\n        this.material.addEventListener('materialUpdate', this.setDirty)\n    }\n\n    /**\n     * Output Color Space\n     * Note: this is ignored when renderToScreen is false (it will take the color space of the render target)\n     */\n    @uiDropdown('Output Color Space', threeConstMappings.ColorSpace.uiConfig, (t: ScreenPass)=>({onChange: t.setDirty}))\n        outputColorSpace: ColorSpace = SRGBColorSpace\n\n    private _lastReadBuffer?: WebGLRenderTarget\n\n    render(renderer: IWebGLRenderer, writeBuffer?: WebGLRenderTarget | null, readBuffer?: WebGLRenderTarget, deltaTime?: number, maskActive?: boolean) {\n        const colorSpace = renderer.outputColorSpace\n        if (!writeBuffer || this.renderToScreen) renderer.outputColorSpace = this.outputColorSpace\n        // else console.warn('ScreenPass: outputColorSpace is ignored when renderToScreen is false')\n        super.render(renderer, writeBuffer, readBuffer, deltaTime, maskActive)\n        this._lastReadBuffer = readBuffer\n        renderer.outputColorSpace = colorSpace\n        this._needsReRender = false\n    }\n\n    reRender(renderer: IWebGLRenderer, writeBuffer?: WebGLRenderTarget | null, deltaTime?: number, maskActive?: boolean) {\n        if (this._lastReadBuffer) this.render(renderer, writeBuffer, this._lastReadBuffer, deltaTime, maskActive)\n    }\n    private _needsReRender = false\n    onPostFrame(renderManager: IRenderManager) {\n        if (!this._needsReRender) return\n        this._needsReRender = false\n        this.reRender(renderManager.renderer)\n        if (this.clipBackground && !(renderManager as ViewerRenderManager).gbufferTarget) {\n            // todo warn only when rgbm\n            console.warn('ScreenPass: clipBackground set to true but no gbufferTarget set. Try adding GBufferPlugin.')\n        }\n    }\n\n    dispose() {\n        this._lastReadBuffer = undefined\n        super.dispose()\n    }\n\n    /**\n     * Force clip background. If this is `true` {@link clipBackground} is overridden.\n     * This happens when scene.background and scene.backgroundColor are both null.\n     * This is set in {@link ViewerRenderManager.render}.\n     */\n    @matDefineBool('CLIP_BACKGROUND_FORCE', undefined, undefined, ScreenPass.prototype.setDirty, true)\n        clipBackgroundForce = false\n\n    // This is not serialized as it is set automatically when scene background and background color are null, which are serialized in RootScene\n    @matDefineBool('CLIP_BACKGROUND', undefined, undefined, ScreenPass.prototype.setDirty)\n    @uiToggle() clipBackground = false\n\n    beforeRender(_: IScene, _1: ICamera, renderManager: ViewerRenderManager) {\n        if (this.material.uniforms.tTransparent) {\n            this.material.uniforms.tTransparent.value = renderManager.renderPass.preserveTransparentTarget ? renderManager.renderPass.transparentTarget?.texture || null : null\n            this.material.defines.HAS_TRANSPARENT_TARGET = this.material.uniforms.tTransparent.value ? 1 : undefined\n            if (!this.material.defines.HAS_TRANSPARENT_TARGET) delete this.material.defines.HAS_TRANSPARENT_TARGET\n        }\n    }\n\n    setDirty() {\n        super.setDirty()\n        this._needsReRender = true\n    }\n}\n\nfunction makeScreenShader(shader: string | [string, string] | {pars?: string; main: string} | ShaderMaterialParameters | ShaderMaterial2) {\n    const baseShader = shaderReplaceString(\n        ScreenPassShader,\n        'void main()',\n        (Array.isArray(shader) ? shader[0] : (<any>shader)?.pars || '') + '\\n',\n        {prepend: true}\n    )\n    const finalShader = baseShader.includes('#glMarker') ? shaderReplaceString(\n        baseShader,\n        '#glMarker',\n        (Array.isArray(shader) ? shader[1] : typeof shader === 'string' ? shader : (shader as any)?.main || '') + '\\n',\n        {prepend: true}\n    ) : baseShader\n    return {\n        ...CopyShader,\n        fragmentShader: finalShader,\n        uniforms: {\n            tDiffuse: {value: null},\n            tTransparent: {value: null},\n        },\n        transparent: true,\n        blending: NoBlending,\n        side: FrontSide,\n    } as ShaderMaterialParameters\n}\n","import {IPassID, IPipelinePass} from './Pass'\nimport {includesAll} from 'ts-browser-helpers'\n\nexport function sortPasses(ps: IPipelinePass<IPassID>[]) {\n    const pipeline: IPassID[] = []\n\n    const dict: Record<IPassID, {after: IPassID[], before: IPassID[], dependencies: Set<IPassID>}> = {}\n    for (const pass of ps) {\n        if (!pass.passId) continue\n        dict[pass.passId] = {\n            after: pass.after ?? [],\n            before: pass.before ?? [],\n            dependencies: new Set(pass.required ?? []),\n        }\n    }\n    for (const [passId, pass] of Object.entries(dict)) {\n        const optional = new Set([...pass.after, ...pass.before])\n        pass.dependencies.forEach(v => optional.has(v) && optional.delete(v))\n        optional.forEach(value => {\n            const dPass = dict[value]\n            if (!dPass) return\n            if (dPass.dependencies.has(passId)) {\n                console.error('cyclic', passId, value)\n                throw 'Encountered cyclic dependency when sorting passes' // todo better error\n            }\n            pass.dependencies.add(value)\n        })\n    }\n\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n        let updated = false\n        const entries = [...Object.entries(dict)]\n        for (const [passId, pass] of entries) {\n            if (pipeline.includes(passId)) continue\n            if (includesAll(pipeline, pass.dependencies.values())) {\n                const afterIndex = Math.max(-1, ...pass.after.map(v => pipeline.indexOf(v)))\n                const beforeIndex = Math.min(pipeline.length, ...pass.before.map(v => {\n                    const k = pipeline.indexOf(v)\n                    return k < 0 ? pipeline.length : k\n                }))\n                if (afterIndex >= beforeIndex) {\n                    console.error(pass, ps, pipeline, afterIndex, beforeIndex)\n                    // throw 'Not possible' // todo better error\n                    throw 'Unknown error when sorting passes' // todo better error\n                }\n                pipeline.splice(pass.after.length > 0 ? afterIndex + 1 : beforeIndex, 0, passId)\n                // console.log(pipeline, passId, afterIndex, beforeIndex)\n                updated = true\n                delete dict[passId]\n            }\n        }\n        if (Object.keys(dict).length < 1) break\n        if (!updated) {\n            console.error(entries, dict, pipeline)\n            throw 'Required pass dependency removed unexpectedly' // when some dependency(required) doesnt exist. todo: show better error.\n            break\n        }\n    }\n    // console.log('Refreshed Pipeline:', pipeline)\n    return pipeline\n}\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer and make them writable for subsequent rendering/clearing\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\tstate.buffers.color.setMask( true );\n\t\tstate.buffers.depth.setMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tClock,\n\tHalfFloatType,\n\tNoBlending,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tthis._pixelRatio = renderer.getPixelRatio();\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType } );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\t\tthis.copyPass.material.blending = NoBlending;\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\n\t\tthis.copyPass.dispose();\n\n\t}\n\n}\n\nexport { EffectComposer };\n","import {EffectComposer} from 'three/examples/jsm/postprocessing/EffectComposer.js'\nimport {WebGLRenderer, WebGLRenderTarget} from 'three'\nimport {ExtendedCopyPass} from './ExtendedCopyPass'\n\nexport class EffectComposer2 extends EffectComposer {\n\n    copyPass2 = new ExtendedCopyPass()\n    constructor(renderer: WebGLRenderer, renderTarget: WebGLRenderTarget) {\n        super(renderer, renderTarget)\n    }\n\n    setPixelRatio(pixelRatio: number, updateSize = true): void {\n        const t = this.setSize\n        if (!updateSize) this.setSize = ()=>{return}\n        super.setPixelRatio(pixelRatio)\n        if (!updateSize) this.setSize = t\n    }\n\n}\n","import {\n    ColorSpace,\n    DepthFormat,\n    DepthStencilFormat,\n    DepthTexture,\n    FloatType,\n    MagnificationTextureFilter,\n    MinificationTextureFilter,\n    RenderTarget,\n    Texture,\n    TextureDataType,\n    UnsignedInt248Type,\n    UnsignedIntType,\n    UnsignedShortType,\n    Vector4,\n    Wrapping,\n} from 'three'\nimport type {IRenderManager, IWebGLRenderer} from '../core'\n\nexport interface IRenderTarget extends RenderTarget<Texture> {\n    isWebGLRenderTarget?: true\n    width: number\n    height: number\n    depth: number\n    assetType?: 'renderTarget'\n    name?: string\n\n    // texture: ValOrArr<Texture&{_target?: IRenderTarget}>\n    uuid?: string\n    sizeMultiplier?: number\n    isTemporary?: boolean\n    targetKey?: string // for caching.\n    clone(trackTarget?: boolean): this\n    setSize(width: number, height: number, depth?: number): void;\n    copy(source: IRenderTarget|RenderTarget): this;\n    dispose(): void;\n\n    scissor: Vector4;\n    /**\n     * @default false\n     */\n    scissorTest: boolean;\n    viewport: Vector4;\n\n    /**\n     * @default true\n     */\n    depthBuffer: boolean;\n\n    /**\n     * @default true\n     */\n    stencilBuffer: boolean;\n\n    /**\n     * @default null\n     */\n    depthTexture: DepthTexture;\n    /**\n     * Defines the count of MSAA samples. Can only be used with WebGL 2. Default is **0**.\n     * @default 0\n     */\n    samples: number;\n\n    isWebGLCubeRenderTarget?: boolean\n    // isWebGLMultipleRenderTargets?: boolean\n    clear?(renderer: IWebGLRenderer, color: boolean, depth: boolean, stencil: boolean): void\n\n    readonly renderManager?: IRenderManager\n}\n\nexport interface CreateRenderTargetOptions {\n    sizeMultiplier?: number,\n    size?: {width: number, height: number},\n    generateMipmaps?: boolean,\n    samples?: number,\n    minFilter?: MinificationTextureFilter\n    magFilter?: MagnificationTextureFilter\n    colorSpace?: ColorSpace\n    type?: TextureDataType\n    format?: number\n    /**\n     * @default true\n     */\n    depthBuffer?: boolean\n    /**\n     * @default false\n     */\n    stencilBuffer?: boolean\n    depthTexture?: boolean\n    depthTextureType?: typeof UnsignedShortType | typeof UnsignedInt248Type | typeof UnsignedIntType | typeof FloatType\n    depthTextureFormat?: typeof DepthFormat | typeof DepthStencilFormat\n    textureCount?: number\n    wrapS?: Wrapping\n    wrapT?: Wrapping\n}\n\nexport function createRenderTargetKey(op: CreateRenderTargetOptions = {}): string {\n    // colorSpace is in key because of ext_sRGB\n    return [op.sizeMultiplier, op.samples, op.colorSpace, op.type, op.format, op.depthBuffer, op.depthTexture, op.textureCount, op.size?.width, op.size?.height].join(';')\n}\n","import {Class} from 'ts-browser-helpers'\nimport {createRenderTargetKey, CreateRenderTargetOptions, IRenderTarget} from './RenderTarget'\nimport {\n    ClampToEdgeWrapping,\n    DepthFormat,\n    DepthTexture,\n    EventDispatcher,\n    LinearFilter,\n    LinearMipMapLinearFilter,\n    NoColorSpace,\n    RGBAFormat,\n    Texture,\n    UnsignedByteType,\n    UnsignedIntType,\n    Vector2,\n    WebGLCubeRenderTarget,\n    WebGLRenderTarget,\n    RenderTargetOptions,\n} from 'three'\n\nexport abstract class RenderTargetManager<TE extends object = object> extends EventDispatcher<TE> {\n    abstract isWebGL2: boolean\n    abstract readonly renderSize: Vector2\n    abstract renderScale: number\n\n    private _trackedTargets: IRenderTarget[] = []\n    private _trackedTempTargets: IRenderTarget[] = []\n    private _releasedTempTargets: Record<string, IRenderTarget[]> = {}\n\n    readonly maxTempPerKey = 5\n\n    protected constructor() {\n        super()\n        this._processNewTarget = this._processNewTarget.bind(this)\n        this._processNewTempTarget = this._processNewTempTarget.bind(this)\n        this.trackTarget = this.trackTarget.bind(this)\n        this.disposeTarget = this.disposeTarget.bind(this)\n        this.createTarget = this.createTarget.bind(this)\n        this.createTargetCustom = this.createTargetCustom.bind(this)\n\n    }\n\n    trackTarget(target: IRenderTarget) {\n        this._trackedTargets.push(target)\n    }\n\n    removeTrackedTarget(target: IRenderTarget) {\n        const ind = this._trackedTargets.indexOf(target)\n        if (ind >= 0)\n            this._trackedTargets.splice(ind, 1)\n    }\n\n    createTarget<T extends IRenderTarget = IRenderTarget>({\n        sizeMultiplier = undefined,\n        samples = 0,\n        colorSpace = NoColorSpace,\n        type = UnsignedByteType,\n        format = RGBAFormat,\n        stencilBuffer = false,\n        depthBuffer = true,\n        depthTexture = false,\n        depthTextureType = UnsignedIntType,\n        depthTextureFormat = DepthFormat,\n        size = undefined,\n        textureCount = 1,\n        ...op\n    }: CreateRenderTargetOptions = {}, trackTarget = true): T {\n        if (!this.isWebGL2) samples = 0\n        if (sizeMultiplier !== undefined && size !== undefined)\n            console.error('Both sizeMultiplier and size are defined. sizeMultiplier will be ignored.')\n        size = size || this.renderSize.clone().multiplyScalar(this.renderScale * (sizeMultiplier = sizeMultiplier || 1))\n        size.width = Math.floor(size.width)\n        size.height = Math.floor(size.height)\n        const depthTex = depthTexture ? new DepthTexture(size.width, size.height, depthTextureType) : null\n        if (depthTex) depthTex.format = depthTextureFormat\n        const target = this.createTargetCustom<T>(size, {\n            samples, colorSpace, type, format, depthBuffer,\n            count: textureCount,\n            depthTexture: depthTex, stencilBuffer,\n        })\n        this._processNewTarget(target, sizeMultiplier, trackTarget)\n        this._setTargetOptions(target, op)\n        return target\n    }\n\n    /**\n     * Dispose and remove tracked target. Release target in-case of temporary target.\n     * To just dispose from the GPU memory and keep reference, call `target.dispose()` or `target.dispose(false)`\n     * @param target\n     * @param remove\n     */\n    disposeTarget(target: IRenderTarget, remove = true): void {\n        if (!target) return\n        if (target.isTemporary) return this.releaseTempTarget(target)\n        if (remove) this.removeTrackedTarget(target)\n        // @ts-expect-error internal, not in types\n        target.dispose(false) // false is not required but still passing so that it doesnt cause infinite loop in future.\n    }\n\n    getTempTarget<T extends IRenderTarget = IRenderTarget>(op: CreateRenderTargetOptions = {}): T {\n        const key = createRenderTargetKey(op)\n        let target: T | undefined\n        if (this._releasedTempTargets[key]?.length) target = this._releasedTempTargets[key].pop() as T\n        if (!target) {\n            target = this.createTarget<T>(op)\n            this._processNewTempTarget(target, key)\n        } else {\n            this._setTargetOptions(target, op)\n        }\n        return target\n    }\n\n    releaseTempTarget(target: IRenderTarget): void {\n        const key = target.targetKey\n        if (!key || !target.isTemporary) {\n            throw 'Not a temp target'\n        }\n        if (this._releasedTempTargets[key].length > this.maxTempPerKey) {\n            this.removeTrackedTarget(target)\n            target.dispose()\n        } else this._releasedTempTargets[key].push(target)\n    }\n\n    createTargetCustom<T extends IRenderTarget>(\n        {width, height}: {width: number, height: number},\n        options: RenderTargetOptions = {},\n        clazz?: Class<T>\n    ): T {\n        let size = [width, height]\n\n        if (clazz?.prototype === WebGLCubeRenderTarget.prototype) { // todo: check for subclass also of WebGLCubeRenderTarget\n            if (width !== height) throw 'Width and height of cube render target must be equal'\n            size = [width]\n        }\n        return this._createTargetClass((clazz as any) ?? WebGLRenderTarget, size, {\n            format: RGBAFormat,\n            minFilter: LinearFilter,\n            magFilter: LinearFilter,\n            generateMipmaps: false,\n            type: UnsignedByteType,\n            colorSpace: NoColorSpace,\n            ...options,\n        }) as T\n    }\n\n    protected abstract _createTargetClass(clazz: Class<WebGLRenderTarget>, size: number[], options: RenderTargetOptions): IRenderTarget\n\n    dispose(clear = true) {\n        this._trackedTargets.forEach(t=>t.dispose())\n        Object.values(this._trackedTempTargets).forEach(t=>t.dispose())\n        if (clear) {\n            this._trackedTargets = []\n            this._releasedTempTargets = {}\n            this._trackedTempTargets = []\n        }\n    }\n\n    /**\n     * Resizes all tracked targets with a sizeMultiplier based on the current renderSize and renderScale.\n     * This must be automatically called by the renderer on resize, and manually when sizeMultiplier of a target changes.\n     */\n    resizeTrackedTargets() {\n        for (const v of this._trackedTargets) this.resizeTrackedTarget(v)\n    }\n    resizeTrackedTarget(target: IRenderTarget): void {\n        const multiplier = target.sizeMultiplier\n        if (multiplier) {\n            const s = this.renderSize.clone().multiplyScalar(this.renderScale * multiplier)\n            target.setSize(Math.floor(s.width), Math.floor(s.height))\n        }\n    }\n\n    private _processNewTempTarget(target: IRenderTarget, key: string): IRenderTarget {\n        target.isTemporary = true\n        target.targetKey = key\n        if (this._releasedTempTargets[key] === undefined) this._releasedTempTargets[key] = []\n        this._trackedTempTargets.push(target)\n        return target\n    }\n\n    private _setTargetOptions(target: IRenderTarget, op: CreateRenderTargetOptions) {\n        const tex = target.texture\n        for (const t of Array.isArray(tex) ? tex : [tex])\n            this._setTargetTextureOptions(t, op)\n    }\n\n    private _setTargetTextureOptions(texture: Texture, op: CreateRenderTargetOptions) {\n        texture.minFilter = op.minFilter ?? LinearFilter\n        texture.magFilter = op.magFilter ?? LinearFilter\n        texture.wrapS = op.wrapS ?? ClampToEdgeWrapping\n        texture.wrapT = op.wrapT ?? ClampToEdgeWrapping\n        texture.generateMipmaps = op.generateMipmaps ?? false\n        if (texture.generateMipmaps && texture.minFilter === LinearFilter)\n            texture.minFilter = LinearMipMapLinearFilter\n        if (!texture.generateMipmaps && texture.minFilter === LinearMipMapLinearFilter)\n            texture.minFilter = LinearFilter\n    }\n\n    protected _processNewTarget(target: IRenderTarget, sizeMultiplier: number | undefined, trackTarget: boolean): IRenderTarget {\n        if (sizeMultiplier !== undefined) target.sizeMultiplier = sizeMultiplier\n        if (trackTarget) this.trackTarget(target)\n        return target\n    }\n\n}\n","import {IAssetImporter} from './IAssetImporter'\nimport {IImporter, ILoader} from './IImporter'\nimport {Class, ValOrFunc} from 'ts-browser-helpers'\n\n/**\n * Importer for loading files through AssetImporter. By default, it's a wrapper for threejs loaders.\n */\nexport class Importer<T extends ILoader = ILoader> implements IImporter {\n    cls?: Class<T>\n\n    onCtor?: (l: T|undefined, ai: IAssetImporter, i: IImporter) => T|undefined\n\n    ctor(assetImporter: IAssetImporter): ILoader | undefined { // attach all created loaders to this instance and create dispose method to dispose all.\n        const loader = this.cls && new this.cls(assetImporter.loadingManager)\n        return typeof this.onCtor === 'function' ? this.onCtor(loader, assetImporter, this) : loader\n    }\n\n    /**\n     * Supported ext, must be in lower case.\n     */\n    ext: ValOrFunc<string[]> // ['json', 'png', 'jpg', 'data:image/png'...]\n    /**\n     * Supported mime types, must be in lower case.\n     */\n    mime: string[]\n    root: boolean\n\n    extensions: any[] = []\n\n    constructor(cls: Class<T>, ext: ValOrFunc<string[]>, mime: string[], root: boolean, onCtor?: (l: T|undefined, ai: IAssetImporter, i: Importer) => T|undefined) {\n        this.cls = cls\n        this.ext = ext// .filter(Boolean).map(e => e.toLowerCase())\n        this.mime = mime.filter(Boolean).map(e => e.toLowerCase())\n        this.root = root\n        this.onCtor = onCtor\n    }\n}\n","import {\n    BufferGeometry,\n    Cache as threeCache,\n    EventDispatcher,\n    EventListener,\n    FileLoader,\n    LoaderUtils,\n    LoadingManager,\n} from 'three'\nimport {\n    IAssetImporter,\n    IImportResultUserData,\n    ImportAssetOptions,\n    ImportFilesOptions,\n    ImportResult,\n    LoadFileOptions,\n    ProcessRawOptions,\n    RootSceneImportResult,\n} from './IAssetImporter'\nimport {IAsset, IFile} from './IAsset'\nimport {IImporter, ILoader} from './IImporter'\nimport {Importer} from './Importer'\nimport {escapeRegExp, getOrCall, parseFileExtension} from 'ts-browser-helpers'\nimport {AssetManagerOptions, ImportAddOptions} from './AssetManager'\nimport {overrideThreeCache} from '../three'\nimport {IGeometry, LineMaterial2, UnlitLineMaterial, UnlitMaterial} from '../core'\n\n// export type IAssetImporterEvent = Event&{\n//     type: IAssetImporterEventTypes,\n//     data?: ImportResult, options?: ProcessRawOptions,\n//     path?: string, progress?: number, state?: string, error?: any\n//     files?: Map<string, IFile>\n//     url?: string, loaded?: number, total?: number\n//     loader?: ILoader,\n// }\n\n// export type IAssetImporterEventTypes = 'onLoad' | 'onProgress' | 'onStop' | 'onError' | 'onStart' | 'loaderCreate' | 'importFile' | 'importFiles' | 'processRaw' | 'processRawStart'\nexport interface IAssetImporterEventMap {\n    loaderCreate: {type: 'loaderCreate', loader: ILoader}\n    importFile: {type: 'importFile', path: string, state: 'downloading'|'done'|'error'|'adding', progress?: number, loadedBytes?: number, totalBytes?: number, error?: any}\n    importFiles: {type: 'importFiles', files: Map<string, IFile>, state: 'start'|'end'}\n    processRaw: {type: 'processRaw', data: ImportResult, options: ProcessRawOptions, path?: string}\n    processRawStart: {type: 'processRawStart', data: ImportResult, options: ProcessRawOptions, path?: string}\n\n    /**\n     * @deprecated use the {@link importFile} event instead\n     */\n    onLoad: {type: 'onLoad'}\n    /**\n     * @deprecated use the {@link importFile} event instead\n     */\n    onProgress: {type: 'onProgress', url: string, loaded: number, total: number}\n    /**\n     * @deprecated use the {@link importFile} event instead\n     */\n    onError: {type: 'onError', url: string}\n    /**\n     * @deprecated use the {@link importFile} event instead\n     */\n    onStart: {type: 'onStart', url: string, loaded: number, total: number}\n}\n\n/**\n * Asset Importer\n *\n * Utility class to import assets from local files, blobs, urls, etc.\n * Used in {@link AssetManager} to import assets.\n * Acts as a wrapper over three.js LoadingManager and adds support for dynamically loading loaders, caching assets, better event dispatching and file tracking.\n * @category Asset Manager\n */\nexport class AssetImporter extends EventDispatcher<IAssetImporterEventMap> implements IAssetImporter {\n    private _loadingManager: LoadingManager\n\n    private _storage?: Cache | Storage\n    get storage() {\n        return this._storage\n    }\n\n    private _logger = console.log\n    // Used when loading multiple files at once.\n    protected _rootContext?: {path: string, rootUrl: string, /* baseUrl: string;*/}\n    private _loaderCache: {loader: ILoader, ext: string[], mime: string[]}[] = []\n    private _fileDatabase: Map<string, IFile> = new Map<string, IFile>()\n    private _cachedAssets: IAsset[] = []\n\n    /**\n     * If true, imported assets are cached in memory(as js/three.js objects) and can be reused later. They will be cleared when dispose event is fired on the object or {@link clearCache} is called.\n     */\n    cacheImportedAssets = true\n\n    // moved to constants whiteImageData and whiteTexture\n    // static WHITE_IMAGE_DATA = new ImageData(new Uint8ClampedArray([255, 255, 255, 255]), 1, 1)\n    // static WHITE_TEXTURE = new Texture(AssetImporter.WHITE_IMAGE_DATA)\n\n    // todo these are only used in export, use in import as well\n    static DummyMaterial = /* @__PURE__ */ new UnlitMaterial({color: '#ff00ff', name: 'NoneMaterial', userData: {isPlaceholder: true, runtimeMaterial: true}})\n    static DummyLineBasicMaterial = /* @__PURE__ */ new UnlitLineMaterial({color: '#ff00ff', name: 'NoneMaterial', userData: {isPlaceholder: true, runtimeMaterial: true}})\n    static DummyLineMaterial = /* @__PURE__ */ new LineMaterial2({color: '#ff00ff', name: 'NoneMaterial', userData: {isPlaceholder: true, runtimeMaterial: true}})\n    static DummyGeometry: IGeometry = /* @__PURE__ */ new BufferGeometry() as IGeometry\n\n    static {\n        AssetImporter.DummyMaterial.uiConfig = {}\n        AssetImporter.DummyLineBasicMaterial.uiConfig = {}\n        AssetImporter.DummyLineMaterial.uiConfig = {}\n        AssetImporter.DummyGeometry.uiConfig = {}\n        // AssetImporter.DummyGeometry.setAttribute('position', new BufferAttribute(new Float32Array([0, 0, 0]), 3))\n        // AssetImporter.DummyGeometry.setAttribute('normal', new BufferAttribute(new Float32Array([0, 1, 0]), 3))\n        // AssetImporter.DummyGeometry.setAttribute('uv', new BufferAttribute(new Float32Array([0, 0]), 2))\n    }\n\n    readonly importers: IImporter[] = [\n        new Importer(FileLoader, ['txt'], ['text/plain'], false),\n        // new Importer(RGBEPNGLoader, ['rgbe.png', 'hdr.png', 'hdrpng'], ['image/png+rgbe'], false), // todo: not working on windows?\n        // new Importer(LUTCubeLoader2, ['cube'], false),\n    ]\n\n    constructor(logging = false, {simpleCache = false, storage}: AssetManagerOptions = {}) {\n        super()\n        if (!logging) this._logger = () => {return}\n        // this._viewer = viewer\n        this._onLoad = this._onLoad.bind(this)\n        this._onProgress = this._onProgress.bind(this)\n        this._onError = this._onError.bind(this)\n        this._onStart = this._onStart.bind(this)\n        this._urlModifier = this._urlModifier.bind(this)\n        this._loadingManager = new LoadingManager(this._onLoad, this._onProgress, this._onError)\n        this._loadingManager.onStart = this._onStart\n        const itemStart = this._loadingManager.itemStart\n        this._loadingManager.itemStart = (url)=>{\n            this.dispatchEvent({type: 'importFile', path: url, state: 'downloading', progress: 0})\n            itemStart.call(this._loadingManager, url)\n        }\n        let errorItems: string[] = [] // not using Set here as it can have duplicates\n        const itemEnd = this._loadingManager.itemEnd\n        this._loadingManager.itemEnd = (url)=>{\n            if (errorItems.includes(url)) {\n                errorItems = errorItems.filter(u => u !== url)\n                itemEnd.call(this._loadingManager, url)\n                return\n            }\n            this.dispatchEvent({type: 'importFile', path: url, state: 'downloading', progress: 1})\n            itemEnd.call(this._loadingManager, url)\n            this.dispatchEvent({type: 'importFile', path: url, state: 'done'}) // todo: do this after processing?\n        }\n        const itemError = this._loadingManager.itemError\n        this._loadingManager.itemError = (url)=>{\n            errorItems.push(url)\n            this.dispatchEvent({type: 'importFile', path: url, state: 'error'})\n            itemError.call(this._loadingManager, url)\n        }\n\n        this._loadingManager.setURLModifier(this._urlModifier)\n        this._initCacheStorage(simpleCache, storage ?? true)\n    }\n\n    get loadingManager(): LoadingManager {\n        return this._loadingManager\n    }\n    get cachedAssets(): IAsset[] {\n        return this._cachedAssets\n    }\n\n    addImporter(...importers: IImporter[]) {\n        for (const importer of importers) {\n            if (this.importers.includes(importer)) {\n                console.warn('AssetImporter: Importer already added', importer)\n                return\n            }\n            this.importers.push(importer)\n        }\n    }\n    removeImporter(...importers: IImporter[]) {\n        for (const importer of importers) {\n            const index = this.importers.indexOf(importer)\n            if (index >= 0) this.importers.splice(index, 1)\n        }\n    }\n\n    // region import functions\n\n    async import<T extends ImportResult|undefined = ImportResult>(\n        assetOrPath?: string | IAsset | IAsset[] | File | File[],\n        options?: ImportAssetOptions,\n        onDownloadProgress?: (e:ProgressEvent)=>void,\n        isInternal?: boolean, // if its being loaded from a File/Blob and not from a url/reference\n    ): Promise<(T|undefined)[]> {\n        if (!assetOrPath) return []\n        if (Array.isArray(assetOrPath)) return (await Promise.all(assetOrPath.map(async a => this.import<T>(a, options, onDownloadProgress, isInternal)))).flat(1)\n        if (assetOrPath instanceof File) return await this.importFile<T>(assetOrPath, options, onDownloadProgress)\n        if (typeof assetOrPath === 'object') return await this.importAsset<T>(assetOrPath, options, onDownloadProgress, isInternal)\n        if (typeof assetOrPath === 'string') return await this.importPath<T>(assetOrPath, options, onDownloadProgress)\n        console.error('AssetImporter: Invalid asset or path', assetOrPath)\n        return []\n    }\n    async importSingle<T extends ImportResult|undefined = ImportResult>(\n        asset?: string | IAsset | File,\n        options?: ImportAssetOptions,\n        onDownloadProgress?: (e:ProgressEvent)=>void,\n        isInternal?: boolean, // if its being loaded from a File/Blob and not from a url/reference\n    ): Promise<T|undefined> {\n        return (await this.import<T>(asset, options, onDownloadProgress, isInternal))?.[0]\n    }\n\n    async importPath<T extends ImportResult|undefined = ImportResult|undefined>(path: string, options: ImportAssetOptions = {}, onDownloadProgress?: (e:ProgressEvent)=>void): Promise<T[]> {\n        const opts = this._serializeOptions(options)\n        const cached = this._cachedAssets.find(a => a.path === path && a._options === opts)\n        let asset: IAsset\n        if (cached) asset = cached\n        else asset = {path}\n        asset._options = opts\n        if (options.importedFile) asset.file = options.importedFile\n        return await this.importAsset(asset, options, onDownloadProgress, false) // note that we are not setting internal even if importedFile is present, this is intentional\n    }\n\n    private _serializeOptions(options: ImportAddOptions) {\n        const {\n            pathOverride,\n            forceImport,\n            reimportDisposed,\n            fileHandler,\n            importedFile,\n            ...op} = options\n        return JSON.stringify(op)\n    }\n\n    // import and process an IAsset\n    async importAsset<T extends ImportResult|undefined = ImportResult|undefined>(\n        asset?: IAsset,\n        options: ImportAssetOptions = {},\n        onDownloadProgress?: (e:ProgressEvent)=>void,\n        isInternal?: boolean, // if its being loaded from a File/Blob and not from a url/reference\n    ): Promise<T[]> {\n        if (!asset) return []\n        if (!asset.path && !asset.file && !options.pathOverride) {\n            return [asset as any] // maybe already imported asset\n        }\n\n        // Cache the asset reference if it is not already cached\n        if (options.cacheAsset !== false && this.cacheImportedAssets && !this._cachedAssets.includes(asset)) {\n            if (Object.entries(asset).length === 1 && asset.path) {\n                const ca = this._cachedAssets.find(value => value.path === asset.path)\n                if (ca) Object.assign(asset, ca)\n            }\n            const ca = this._cachedAssets.findIndex(value => value.path === asset.path)\n            if (ca >= 0) this._cachedAssets.splice(ca, 1)\n            this._cachedAssets.push(asset)\n        }\n\n        let result: ImportResult | ImportResult[] | undefined = asset?.preImported\n        if (!result && asset?.preImportedRaw) {\n            result = await asset.preImportedRaw\n        }\n\n        const path = options.pathOverride || asset.path\n        if (!options.forceImport && result) {\n            const results = await this.processRaw<T>(result as any, options, path) // just in case its not processed. Internal check is done to ensure it's not processed twice\n            return results\n        }\n\n        if (isInternal === undefined) {\n            isInternal = typeof asset.file?.arrayBuffer === 'function'\n        }\n\n        // todo: add support to get cloned asset? if we want to import multiple times and everytime return a cloned asset\n        asset.preImportedRaw = this._loadFile(path, typeof asset.file?.arrayBuffer === 'function' ? asset.file : undefined, options, onDownloadProgress, isInternal)\n        result = await asset.preImportedRaw\n\n        if (!this.cacheImportedAssets) asset.preImportedRaw = undefined\n\n        if (result) result = await this.processRaw(result, options, path)\n        if (result) {\n            if (options.processRaw !== false && this.cacheImportedAssets) asset.preImported = result\n\n            const arrs: any[] = []\n            const push = (r: typeof result[number])=>{\n                if (r.userData?.rootSceneModelRoot) arrs.push(...r.children)\n                else arrs.push(r)\n            }\n            if (Array.isArray(result)) result.map(push)\n            else push(result)\n\n            // remove preImportedRaw when any one of the assets is disposed. todo maybe do when ALL are disposed?\n            arrs.forEach(r=>r?.addEventListener && r.addEventListener('dispose', () => { // todo: recheck after dispose logic change\n                if (asset?.preImportedRaw) asset.preImportedRaw = undefined\n                if (asset?.preImported) asset.preImported = undefined\n            }))\n        }\n\n        return result as any\n    }\n\n    async importFile<T extends ImportResult|undefined = ImportResult|undefined>(\n        file?: File,\n        options: ImportAssetOptions = {},\n        onDownloadProgress?: (e:ProgressEvent)=>void\n    ): Promise<T[]> {\n        if (!file) return []\n        if (!(file instanceof File)) {\n            console.error('AssetImporter: Invalid file', file)\n            return []\n        }\n        return this.importAsset(this._cachedAssets.find(a=>a.file === file) ?? {\n            path: options.pathOverride || file.name || file.webkitRelativePath,\n            file,\n        }, options, onDownloadProgress, true)\n    }\n\n    /**\n     * Import multiple local files/blobs from a map of files, like when a local folder is loaded, or when multiple files are dropped.\n     * @param files\n     * @param options\n     */\n    async importFiles<T extends ImportResult|undefined=ImportResult|undefined>(files: Map<string, IFile>, options: ImportFilesOptions = {}): Promise<Map<string, T[]>> {\n        const loaded = new Map<string, any>()\n\n        let {allowedExtensions} = options\n        if (allowedExtensions && allowedExtensions.length < 1) allowedExtensions = undefined\n        if (files.size === 0) return loaded\n        this.dispatchEvent({type: 'importFiles', files: files, state: 'start'})\n\n        const baseFiles: string[] = []\n        const altFiles: string[] = []\n\n        // Note: mostly path === file.name\n        files.forEach((file, path) => { // todo: handle only one file at the top\n\n            this.registerFile(path, file)\n            const ext = file.ext\n            const mime = file.mime\n            if ((ext || mime) && // todo: files with no extensions are not supported right now. This also includes __MacOSX\n                (allowedExtensions?.includes((ext || mime || '').toLowerCase()) ?? true)) {\n                if (this._isRootFile(ext)) baseFiles.push(path)\n                else altFiles.push(path)\n            }\n\n        })\n        if (baseFiles.length > 0) {\n            for (const value of baseFiles) {\n                let res = await this._loadFile(value, undefined, options, undefined, true)\n                if (res) res = await this.processRaw(res, options, value)\n                loaded.set(value, res)\n            }\n        } else {\n            for (const value of altFiles) {\n                let res = await this._loadFile(value, undefined, options, undefined, true)\n                if (res) res = await this.processRaw(res, options, value)\n                loaded.set(value, res)\n            }\n\n            // todo: handle no baseFiles\n        }\n\n        this.dispatchEvent({type: 'importFiles', files: files, state: 'end'})\n\n        files.forEach((_, path) => this.unregisterFile(path))\n\n        return loaded\n    }\n\n    // load a single file\n    private async _loadFile(\n        path: string,\n        file?: IFile,\n        options: LoadFileOptions = {},\n        onDownloadProgress?: (e: ProgressEvent)=>void,\n        isInternal = false, // if its being loaded from a File/Blob and not from a url/reference\n    ): Promise<ImportResult | ImportResult[] | undefined> {\n        // if (file?.__loadedAsset) return file.__loadedAsset\n        if (this._cacheStoreInitPromise) await this._cacheStoreInitPromise\n\n        this.dispatchEvent({type: 'importFile', path, state:'downloading', progress: 0})// todo state 'starting' here? as downloading also in itemStart\n        let res: ImportResult | ImportResult[] | undefined\n        try {\n            const loader = this.registerFile(path, file, options.fileExtension, options.fileHandler)\n\n            // const url = this.resolveURL(path) // todo: why is this required? maybe for query string?\n            // const path2 = path.replace(/\\?.*$/, '') // remove query string to find the handler properly\n            // const loader = (options.fileHandler as ILoader) ?? this._getLoader(path2) ??\n            //     (file ? this._getLoader(file.name, file.ext, file.mime) : undefined)\n\n            if (!loader) {\n                throw new Error('AssetImporter: Unable to find loader for ' + path) // caught below\n            }\n            this._rootContext = {\n                path,\n                rootUrl: LoaderUtils.extractUrlBase(path),\n                // baseUrl: LoaderUtils.extractUrlBase(url),\n            }\n\n            loader.importOptions = options\n            res = await loader.loadAsync(path + (options.queryString ? (path.includes('?') ? '&' : '?') + options.queryString : ''), (e)=>{\n                if (onDownloadProgress) onDownloadProgress(e)\n                const total = e.lengthComputable ? e.total : undefined\n                this.dispatchEvent({\n                    type: 'importFile', path,\n                    state:'downloading',\n                    loadedBytes: e.loaded || undefined,\n                    totalBytes: total && total < e.loaded ? e.loaded : e.total || undefined, // sometimes total is more than e.loaded\n                    progress: total && total > 0 && total > e.loaded ? e.loaded / total : 1,\n                })\n            })\n            if (loader.transform) res = await loader.transform(res, options)\n            delete loader.importOptions\n\n            this._rootContext = undefined\n\n            // this.dispatchEvent({type: 'importFile', path, state:'downloading', progress: 1})\n            // this.dispatchEvent({type: 'importFile', path, state:'adding'})\n\n            if (file)\n                this._logger('AssetImporter: loaded', path)\n            else\n                this._logger('AssetImporter: downloaded', path)\n\n            if (file)\n                this.unregisterFile(path)\n\n        } catch (e: any) {\n            console.error('AssetImporter: Unable to import file', path, file)\n            console.error(e)\n            console.error(e?.stack)\n            // throw e\n            this.dispatchEvent({type: 'importFile', path, state: 'error', error: e})\n            if (file)\n                this.unregisterFile(path)\n            return []\n        }\n        // done in itemEnd of loading manager\n        // this.dispatchEvent({type: 'importFile', path, state: 'done'}) // todo: do this after processing?\n        // if (file) {\n        //     file.__loadedAsset = res\n        //\n        //\n        //     // todo: recheck below code after dispose logic change\n        //\n        //     // Clear the reference __loadedAsset when any one asset is disposed.\n        //     // it's a bit hacky to do this here, but it works for now. todo: move to a better place\n        //     let ress: any[] = []\n        //     if (Array.isArray(res)) ress = res.flat(2)\n        //     else if ((<RootSceneImportResult>res)?.userData?.rootSceneModelRoot) ress.push(...(<IObject3D>res).children)\n        //     else ress.push(res)\n        //     for (const r of ress) r?.addEventListener?.('dispose', () => file.__loadedAsset = undefined)\n        //\n        // }\n        if (res && typeof res === 'object' && !Array.isArray(res)) {\n            if (options.fileHandler && !options.fileExtension) {\n                console.warn('AssetImporter - Pass fileExtension to options when using fileHandler to be able to use `rootPath`', options.fileHandler, path)\n            }\n            if (!isInternal && !path.startsWith('blob:') && !path.startsWith('data:')) {\n                res.__rootPath = path\n                if (options) {\n                    const ser = this._serializeOptions(options)\n                    if (ser) res.__rootPathOptions = JSON.parse(ser)\n                }\n            }\n            const f = file || this._fileDatabase.get(path)\n            if (f) res.__rootBlob = f\n        }\n        return res\n    }\n\n    // endregion\n\n    // region file database\n\n    /**\n     * Register a file in the database and return a loader for it. If the loader does not exist, it will be created.\n     * @param path\n     * @param file\n     * @param extension\n     * @param loader\n     */\n    registerFile(path: string, file?: IFile, extension?: string, loader?: ILoader): ILoader | undefined {\n        const isData = path.startsWith('data:') || false\n        if (!isData) path = path.replace(/\\?.*$/, '') // remove query string\n\n        const ext = extension || (isData ? undefined : file?.ext ?? parseFileExtension(file?.name ?? path.trim())?.toLowerCase())\n        const mime = file?.mime ?? isData ? path.slice(0, path.indexOf(';')).split(':')[1] || undefined : undefined\n\n        if (file) {\n            if (file.name === undefined) (file as any).name = path\n            if (!file.ext) file.ext = ext\n            if (!file.mime) file.mime = mime\n            if (this._fileDatabase.has(path)) {\n                console.warn('AssetImporter: File already registered, replacing', path)\n                this.unregisterFile(path)\n            }\n            this._fileDatabase.set(path, file)\n        }\n\n        return loader || this._getLoader(path, ext, mime) || this._createLoader(path, ext, mime)\n    }\n\n    /**\n     * Remove a file from the database and revoke the object url if it exists.\n     * @param path\n     */\n    unregisterFile(path: string) {\n        path = path.replace(/\\?.*$/, '') // remove query string\n        const file = this._fileDatabase.get(path)\n        if (file?.objectUrl) {\n            URL.revokeObjectURL(file.objectUrl)\n            file.objectUrl = undefined\n        }\n        if (file) this._fileDatabase.delete(path)\n    }\n\n    // endregion\n\n    // region processRaw\n\n    /**\n     * Automatically set name of the asset if not set already, based on the file name.\n     */\n    autoSetName = true\n\n    public async processRaw<T extends (ImportResult|undefined) = ImportResult>(res: T|T[], options: ProcessRawOptions, path?: string): Promise<T[]> {\n        if (!res) return []\n\n        // legacy\n        if (options.processImported !== undefined) {\n            console.error('AssetImporter: processImported is deprecated, use processRaw instead')\n            options.processRaw = options.processImported\n        }\n\n        if (Array.isArray(res)) {\n            const r: any[] = []\n            for (const re of res) { // todo: should we parallelize?\n                r.push(...await this.processRaw(re, options, path))\n            }\n            return r\n        }\n\n        if (options.processRaw === false) return [res]\n\n        if (res.assetImporterProcessed && !options.forceImporterReprocess) return [res]\n\n        const rootPath = res.__rootPath\n        const rootPathOptions = res.__rootPathOptions\n        const rootBlob = res.__rootBlob\n\n        if (res.userData) {\n            const userData: IImportResultUserData = res.userData\n            // todo when loading zip files it shouldn't set the rootPath for all assets\n            if (!userData.rootPath && rootPath && !rootPath.startsWith('blob:') /* && !rootPath.startsWith('/')*/) {\n                userData.rootPath = rootPath\n                if (rootPathOptions) userData.rootPathOptions = rootPathOptions\n            }\n            if (rootBlob) {\n                userData.__sourceBlob = rootBlob\n                if (userData.__needsSourceBuffer) { // set __sourceBuffer here if required during serialize later on, __needsSourceBuffer can be set in asset loaders\n                    userData.__sourceBuffer = await rootBlob.arrayBuffer()\n                    delete userData.__needsSourceBuffer\n                }\n            }\n        }\n\n        if (!path && res.userData?.rootPath) path = res.userData.rootPath\n\n        this.dispatchEvent({type: 'processRawStart', data: res, options, path})\n\n        // for testing only\n        if (res.isTexture && options._testDataTextureComplete) {\n            // if some data textures are not loading correctly, should not ideally be required\n            if (res.isDataTexture && res.image?.data) res.image.complete = true\n            if (res.image?.complete) res.needsUpdate = true\n        }\n\n        if ((res as RootSceneImportResult)?.userData && (res as RootSceneImportResult).userData.rootSceneModelRoot) {\n            res._childrenCopy = [...res.children]\n        }\n\n        if (this.autoSetName && res.name === '') res.name = (rootBlob?.filePath || rootBlob?.name || rootPath || '')\n            .replace(/^\\/|\\/$/, '')\n            .split('/').pop()!\n\n        res.assetImporterProcessed = true // this should not be put in userData\n\n        this.dispatchEvent({type: 'processRaw', data: res, options, path})\n\n        // special for zip files. ZipLoader gives this\n        if ((<any>res) instanceof Map && options.autoImportZipContents !== false) {\n            // todo: should we pass in onProgress from outside?\n            return [...(await this.importFiles<T>(<any>res, options)).values()].flat()\n        }\n\n        return [res]\n\n    }\n\n    public async processRawSingle<T extends (ImportResult|undefined) = ImportResult>(res: T, options: ProcessRawOptions, path?: string): Promise<T> {\n        return (await this.processRaw(res, options, path))[0]\n    }\n\n    // endregion\n\n    // region disposal\n\n    dispose(): void {\n        this.clearCache()\n        // this._processors?.dispose()\n        // this._loadingManager.dispose // todo\n    }\n\n    /**\n     * Clear memory asset and loader cache. Browser cache and custom cache storage is not cleared with this.\n     */\n    clearCache(): void {\n        this._cachedAssets = []\n        this.unregisterAllFiles() // todo should this be done here?\n        this.clearLoaderCache()\n    }\n\n    unregisterAllFiles(): void {\n        const keys = [...this._fileDatabase.keys()]\n        for (const key of keys) {\n            this.unregisterFile(key)\n        }\n    }\n\n    clearLoaderCache(): void {\n        for (const lc of this._loaderCache) {\n            lc.loader?.dispose && lc.loader?.dispose()\n        }\n        this._loaderCache = []\n    }\n\n    // endregion\n\n    // region utils\n\n    resolveURL(url: string): string {\n        return this._loadingManager.resolveURL(url)\n    }\n\n    protected _urlModifiers: ((url: string) => string)[] = []\n    addURLModifier(modifier: (url: string) => string) {\n        this._urlModifiers.push(modifier)\n    }\n    removeURLModifier(modifier: (url: string) => string) {\n        const index = this._urlModifiers.indexOf(modifier)\n        if (index >= 0) this._urlModifiers.splice(index, 1)\n    }\n\n    protected _urlModifier(url: string) {\n        url = this._urlModifiers.reduce((acc, modifier) => modifier(acc), url)\n        let normalizedURL = decodeURI(url)\n        const rootUrl = this._rootContext?.rootUrl\n        if (!normalizedURL.includes('://') && rootUrl && !normalizedURL.startsWith(rootUrl))\n            normalizedURL = rootUrl + normalizedURL\n        normalizedURL = normalizedURL.replace('./', '') // remove ./\n        normalizedURL = normalizedURL.replace(/^(\\/\\/)/, '/') // fix for start with //\n        // remove query string\n        normalizedURL = normalizedURL.replace(/\\?.*$/, '')\n\n        const file = this._fileDatabase.get(normalizedURL)\n        if (!file) return url\n        const ext = file.ext\n        if (!ext) {\n            console.error('Unable to determine file extension', file)\n            return url\n        }\n        if (!file.objectUrl) file.objectUrl = URL.createObjectURL(file) + '#' + normalizedURL\n        return file.objectUrl\n    }\n\n    private _isRootFile(ext?: string, mime?: string) {\n        mime = mime?.toLowerCase()\n        ext = ext?.toLowerCase()\n        return this.importers.find(value => value.root && (\n            ext && getOrCall(value.ext)?.includes(ext.toLowerCase()) ||\n            mime && value.mime.includes(mime.toLowerCase())\n        )) != null\n    }\n\n    // get an importer that can create a loader\n    private _getImporter(name:string, ext?:string, mime?: string, isRoot = false): IImporter | undefined {\n        mime = mime?.toLowerCase()\n        ext = ext?.toLowerCase()\n        return this.importers.find(importer => {\n            if (isRoot && !importer.root) return false\n            if (mime && importer.mime?.find(m => mime === m)) return true\n            if (getOrCall(importer.ext)?.find(iext =>\n                ext ? iext === ext : name?.toLowerCase()?.endsWith('.' + iext)\n                || iext?.startsWith('data:') && name?.startsWith(iext))) return true\n            return false\n        })\n    }\n\n    // get a loader that can load a file.\n    private _getLoader(name?:string, ext?:string, mime?: string): ILoader | undefined {\n        if (!ext && !mime && name) ext = parseFileExtension(name).toLowerCase()\n        mime = mime?.toLowerCase().trim()\n        ext = ext?.toLowerCase().trim()\n        return (name ? this._loadingManager.getHandler(name.trim()) as ILoader : undefined)\n            || this._loaderCache.find((lc)=> ext && lc.ext.includes(ext) || mime && lc.mime.includes(mime))?.loader\n    }\n\n    private _createLoader(name:string, ext?:string, mime?: string): ILoader | undefined { // todo: remove/destroy loader.\n        const importer = this._getImporter(name, ext, mime)\n        if (!importer) return undefined\n        const loader = importer.ctor(this)\n        if (!loader) return undefined\n        getOrCall(importer.ext)?.forEach(iext => {\n            const regex = new RegExp(iext.startsWith('data:') ? '^' + escapeRegExp(iext) + '[\\\\/\\\\+\\\\:\\\\,\\\\;]' : '\\\\.' + iext + '$', 'i')\n            this._loadingManager.addHandler(regex, loader)\n        })\n        importer.mime?.forEach(imime => {\n            const regex = new RegExp('^data:' + escapeRegExp(imime) + '[\\\\/\\\\+\\\\:\\\\,\\\\;]', 'i')\n            this._loadingManager.addHandler(regex, loader)\n        })\n        this._loaderCache.push({loader, ext: getOrCall(importer.ext) || [], mime: importer.mime})\n        this.dispatchEvent({type: 'loaderCreate', loader})\n        return loader\n    }\n\n    private _cacheStoreInitPromise?: Promise<void>\n    private _initCacheStorage(simpleCache?: boolean, storage?: Cache | Storage | boolean) {\n        if (storage === true && window?.caches) {\n            this._cacheStoreInitPromise = window.caches.open?.('threepipe-assetmanager').then(c => {\n                this._initCacheStorage(simpleCache, c)\n                this._storage = c\n                this._cacheStoreInitPromise = undefined\n            })\n            return\n        }\n        if (simpleCache || storage) {\n            // three.js built-in simple memory cache. used in FileLoader.js todo: use local storage somehow\n            if (simpleCache) threeCache.enabled = true\n\n            const stro = storage && window.Cache && typeof window.Cache === 'function' && storage instanceof window.Cache ? storage : undefined\n            overrideThreeCache(stro)\n        }\n        this._storage = typeof storage === 'boolean' ? undefined : storage\n    }\n\n    addEventListener<T extends keyof IAssetImporterEventMap>(type: T, listener: EventListener<IAssetImporterEventMap[T], T, this>): void {\n        super.addEventListener(type, listener)\n        if (type === 'loaderCreate') {\n            for (const loaderCacheElement of this._loaderCache) {\n                this.dispatchEvent({type: 'loaderCreate', loader: loaderCacheElement.loader})\n            }\n        }\n    }\n\n    // endregion\n\n    // region Loader Event Dispatchers\n    protected _onLoad() {\n        this.dispatchEvent({type: 'onLoad'})\n    }\n\n    protected _onProgress(url: string, loaded: number, total: number) {\n        this.dispatchEvent({type: 'onProgress', url, loaded, total})\n    }\n\n    protected _onError(url: string) {\n        this.dispatchEvent({type: 'onError', url})\n    }\n\n    protected _onStart(url: string, loaded: number, total: number) {\n        this.dispatchEvent({type: 'onStart', url, loaded, total})\n    }\n    // endregion\n\n    // region deprecated\n\n    /**\n     * @deprecated use {@link processRaw} instead\n     * @param res\n     * @param options\n     */\n    public async processImported(res: any, options: ProcessRawOptions, path?: string): Promise<any[]> {\n        console.error('processImported is deprecated. Use processRaw instead.')\n        return await this.processRaw(res, options, path)\n    }\n\n    // endregion\n\n\n}\n\n// function escapeReplacement(str: string) {\n//     return str.replace(/\\$/g, '$$$$')\n// }\n","import {\n\tPlaneGeometry,\n\tShaderMaterial,\n\tUniform,\n\tMesh,\n\tPerspectiveCamera,\n\tScene,\n\tWebGLRenderer,\n\tCanvasTexture,\n\tSRGBColorSpace\n} from 'three';\n\nlet _renderer;\nlet fullscreenQuadGeometry;\nlet fullscreenQuadMaterial;\nlet fullscreenQuad;\n\nexport function decompress( texture, maxTextureSize = Infinity, renderer = null ) {\n\n\tif ( ! fullscreenQuadGeometry ) fullscreenQuadGeometry = new PlaneGeometry( 2, 2, 1, 1 );\n\tif ( ! fullscreenQuadMaterial ) fullscreenQuadMaterial = new ShaderMaterial( {\n\t\tuniforms: { blitTexture: new Uniform( texture ) },\n\t\tvertexShader: `\n\t\t\tvarying vec2 vUv;\n\t\t\tvoid main(){\n\t\t\t\tvUv = uv;\n\t\t\t\tgl_Position = vec4(position.xy * 1.0,0.,.999999);\n\t\t\t}`,\n\t\tfragmentShader: `\n\t\t\tuniform sampler2D blitTexture; \n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main(){ \n\t\t\t\tgl_FragColor = vec4(vUv.xy, 0, 1);\n\t\t\t\t\n\t\t\t\t#ifdef IS_SRGB\n\t\t\t\tgl_FragColor = LinearTosRGB( texture2D( blitTexture, vUv) );\n\t\t\t\t#else\n\t\t\t\tgl_FragColor = texture2D( blitTexture, vUv);\n\t\t\t\t#endif\n\t\t\t}`\n\t} );\n\n\tfullscreenQuadMaterial.uniforms.blitTexture.value = texture;\n\tfullscreenQuadMaterial.defines.IS_SRGB = texture.colorSpace == SRGBColorSpace;\n\tfullscreenQuadMaterial.needsUpdate = true;\n\n\tif ( ! fullscreenQuad ) {\n\n\t\tfullscreenQuad = new Mesh( fullscreenQuadGeometry, fullscreenQuadMaterial );\n\t\tfullscreenQuad.frustumCulled = false;\n\n\t}\n\n\tconst _camera = new PerspectiveCamera();\n\tconst _scene = new Scene();\n\t_scene.add( fullscreenQuad );\n\n\tif ( renderer === null ) {\n\n\t\trenderer = _renderer = new WebGLRenderer( { antialias: false } );\n\n\t}\n\n\tconst width = Math.min( texture.image.width, maxTextureSize );\n\tconst height = Math.min( texture.image.height, maxTextureSize );\n\n\trenderer.setSize( width, height );\n\trenderer.clear();\n\trenderer.render( _scene, _camera );\n\n\tconst canvas = document.createElement( 'canvas' );\n\tconst context = canvas.getContext( '2d' );\n\n\tcanvas.width = width;\n\tcanvas.height = height;\n\n\tcontext.drawImage( renderer.domElement, 0, 0, width, height );\n\n\tconst readableTexture = new CanvasTexture( canvas );\n\n\treadableTexture.minFilter = texture.minFilter;\n\treadableTexture.magFilter = texture.magFilter;\n\treadableTexture.wrapS = texture.wrapS;\n\treadableTexture.wrapT = texture.wrapT;\n\treadableTexture.name = texture.name;\n\n\tif ( _renderer ) {\n\n\t\t_renderer.forceContextLoss();\n\t\t_renderer.dispose();\n\t\t_renderer = null;\n\n\t}\n\n\treturn readableTexture;\n\n}\n","import {\n\tBufferAttribute,\n\tClampToEdgeWrapping,\n\tColor,\n\tDoubleSide,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tMathUtils,\n\tMatrix4,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tPropertyBinding,\n\tRGBAFormat,\n\tRepeatWrapping,\n\tScene,\n\tSource,\n\tSRGBColorSpace,\n\tCompressedTexture,\n\tVector3,\n\tQuaternion,\n} from 'three';\nimport { decompress } from './../utils/TextureUtils.js';\n\n\n/**\n * The KHR_mesh_quantization extension allows these extra attribute component types\n *\n * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes\n */\nconst KHR_mesh_quantization_ExtraAttrTypes = {\n\tPOSITION: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'unsigned byte normalized',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t\t'unsigned short normalized',\n\t],\n\tNORMAL: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTANGENT: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTEXCOORD: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t],\n};\n\n\nclass GLTFExporter {\n\n\tconstructor() {\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFLightExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsUnlitExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( writer );\n\n\t\t} );\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param  {Scene or [THREE.Scenes]} input   Scene or Array of THREE.Scenes\n\t * @param  {Function} onDone  Callback on completed\n\t * @param  {Function} onError  Callback on errors\n\t * @param  {Object} options options\n\t */\n\tparse( input, onDone, onError, options, gltfWriter ) {\n\n\t\tconst writer = gltfWriter || new GLTFWriter();\n\t\tconst plugins = [];\n\n\t\tfor ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {\n\n\t\t\tplugins.push( this.pluginCallbacks[ i ]( writer ) );\n\n\t\t}\n\n\t\twriter.setPlugins( plugins );\n\t\twriter.write( input, onDone, options ).catch( onError );\n\n\t}\n\n\tparseAsync( input, options ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( input, resolve, reject, options );\n\n\t\t} );\n\n\t}\n\n}\n\n//------------------------------------------------------------------------------\n// Constants\n//------------------------------------------------------------------------------\n\nconst WEBGL_CONSTANTS = {\n\tPOINTS: 0x0000,\n\tLINES: 0x0001,\n\tLINE_LOOP: 0x0002,\n\tLINE_STRIP: 0x0003,\n\tTRIANGLES: 0x0004,\n\tTRIANGLE_STRIP: 0x0005,\n\tTRIANGLE_FAN: 0x0006,\n\n\tBYTE: 0x1400,\n\tUNSIGNED_BYTE: 0x1401,\n\tSHORT: 0x1402,\n\tUNSIGNED_SHORT: 0x1403,\n\tINT: 0x1404,\n\tUNSIGNED_INT: 0x1405,\n\tFLOAT: 0x1406,\n\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization';\n\nconst THREE_TO_WEBGL = {};\n\nTHREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nTHREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR;\nTHREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nTHREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;\nTHREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;\nTHREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\nconst DEFAULT_SPECULAR_COLOR = new Color();\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n//------------------------------------------------------------------------------\n// Utility functions\n//------------------------------------------------------------------------------\n\n/**\n * Compare two arrays\n * @param  {Array} array1 Array 1 to compare\n * @param  {Array} array2 Array 2 to compare\n * @return {Boolean}        Returns true if both arrays are equal\n */\nfunction equalArray( array1, array2 ) {\n\n\treturn ( array1.length === array2.length ) && array1.every( function ( element, index ) {\n\n\t\treturn element === array2[ index ];\n\n\t} );\n\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n * @param  {string} text\n * @return {ArrayBuffer}\n */\nfunction stringToArrayBuffer( text ) {\n\n\treturn new TextEncoder().encode( text ).buffer;\n\n}\n\n/**\n * Is identity matrix\n *\n * @param {Matrix4} matrix\n * @returns {Boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix( matrix ) {\n\n\treturn equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );\n\n}\n\n/**\n * Get the min and max vectors from the given attribute\n * @param  {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count\n * @param  {Integer} start\n * @param  {Integer} count\n * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)\n */\nfunction getMinMax( attribute, start, count ) {\n\n\tconst output = {\n\n\t\tmin: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),\n\t\tmax: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )\n\n\t};\n\n\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\tlet value;\n\n\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t} else {\n\n\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toutput.min[ a ] = Math.min( output.min[ a ], value );\n\t\t\toutput.max[ a ] = Math.max( output.max[ a ], value );\n\n\t\t}\n\n\t}\n\n\treturn output;\n\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @param {Integer} bufferSize The size the original buffer.\n * @returns {Integer} new buffer size with required padding.\n *\n */\nfunction getPaddedBufferSize( bufferSize ) {\n\n\treturn Math.ceil( bufferSize / 4 ) * 4;\n\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n *\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {Integer} paddingByte (Optional)\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {\n\n\tconst paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );\n\n\tif ( paddedLength !== arrayBuffer.byteLength ) {\n\n\t\tconst array = new Uint8Array( paddedLength );\n\t\tarray.set( new Uint8Array( arrayBuffer ) );\n\n\t\tif ( paddingByte !== 0 ) {\n\n\t\t\tfor ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {\n\n\t\t\t\tarray[ i ] = paddingByte;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn array.buffer;\n\n\t}\n\n\treturn arrayBuffer;\n\n}\n\nfunction getCanvas() {\n\n\tif ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) {\n\n\t\treturn new OffscreenCanvas( 1, 1 );\n\n\t}\n\n\treturn document.createElement( 'canvas' );\n\n}\n\nfunction getToBlobPromise( canvas, mimeType ) {\n\n\tif ( canvas.toBlob !== undefined ) {\n\n\t\treturn new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) );\n\n\t}\n\n\tlet quality;\n\n\t// Blink's implementation of convertToBlob seems to default to a quality level of 100%\n\t// Use the Blink default quality levels of toBlob instead so that file sizes are comparable.\n\tif ( mimeType === 'image/jpeg' ) {\n\n\t\tquality = 0.92;\n\n\t} else if ( mimeType === 'image/webp' ) {\n\n\t\tquality = 0.8;\n\n\t}\n\n\treturn canvas.convertToBlob( {\n\n\t\ttype: mimeType,\n\t\tquality: quality\n\n\t} );\n\n}\n\n/**\n * Writer\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\n\t\tthis.extensionsUsed = {};\n\t\tthis.extensionsRequired = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'THREE.GLTFExporter'\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tattributesNormalized: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param  {Scene or [THREE.Scenes]} input   Scene or Array of THREE.Scenes\n\t * @param  {Function} onDone  Callback on completed\n\t * @param  {Object} options options\n\t */\n\tasync write( input, onDone, options = {} ) {\n\n\t\tthis.options = Object.assign( {\n\t\t\t// default options\n\t\t\tbinary: false,\n\t\t\ttrs: false,\n\t\t\tonlyVisible: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\tanimations: [],\n\t\t\tincludeCustomExtensions: false,\n\t\t\tignoreInvalidMorphTargetTracks: false,\n\t\t\tignoreEmptyTextures: false,\n\t\t}, options );\n\n\t\tif ( this.options.animations.length > 0 ) {\n\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\n\t\t}\n\n\t\tthis.processInput( input );\n\n\t\tawait Promise.all( this.pending );\n\n\t\tconst writer = this;\n\t\tconst buffers = writer.buffers;\n\t\tconst json = writer.json;\n\t\toptions = writer.options;\n\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\t\tconst extensionsRequired = writer.extensionsRequired;\n\n\t\t// Merge buffers.\n\t\tconst blob = new Blob( buffers, { type: 'application/octet-stream' } );\n\n\t\t// Declare extensions.\n\t\tconst extensionsUsedList = Object.keys( extensionsUsed );\n\t\tconst extensionsRequiredList = Object.keys( extensionsRequired );\n\n\t\tif ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;\n\t\tif ( extensionsRequiredList.length > 0 ) json.extensionsRequired = extensionsRequiredList;\n\n\t\t// Update bytelength of the single buffer.\n\t\tif ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;\n\n\t\tif ( options.binary === true ) {\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\t// Binary chunk.\n\t\t\t\tconst binaryChunk = getPaddedArrayBuffer( reader.result );\n\t\t\t\tconst binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tbinaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );\n\t\t\t\tbinaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );\n\n\t\t\t\t// JSON chunk.\n\t\t\t\tconst jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );\n\t\t\t\tconst jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tjsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );\n\t\t\t\tjsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );\n\n\t\t\t\t// GLB header.\n\t\t\t\tconst header = new ArrayBuffer( GLB_HEADER_BYTES );\n\t\t\t\tconst headerView = new DataView( header );\n\t\t\t\theaderView.setUint32( 0, GLB_HEADER_MAGIC, true );\n\t\t\t\theaderView.setUint32( 4, GLB_VERSION, true );\n\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\theaderView.setUint32( 8, totalByteLength, true );\n\n\t\t\t\tconst glbBlob = new Blob( [\n\t\t\t\t\theader,\n\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\tjsonChunk,\n\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\tbinaryChunk\n\t\t\t\t], { type: 'application/octet-stream' } );\n\n\t\t\t\tconst glbReader = new FileReader();\n\t\t\t\tglbReader.readAsArrayBuffer( glbBlob );\n\t\t\t\tglbReader.onloadend = function () {\n\n\t\t\t\t\tonDone( glbReader.result );\n\n\t\t\t\t};\n\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tif ( json.buffers && json.buffers.length > 0 ) {\n\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.readAsDataURL( blob );\n\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\tjson.buffers[ 0 ].uri = base64data;\n\t\t\t\t\tonDone( json );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tonDone( json );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t *\n\t * @param {THREE.Object3D|THREE.Material|THREE.BufferGeometry|THREE.AnimationClip} object\n\t * @param {Object} objectDef\n\t */\n\tserializeUserData( object, objectDef ) {\n\n\t\tif ( Object.keys( object.userData ).length === 0 ) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\ttry {\n\n\t\t\tconst json = JSON.parse( JSON.stringify( object.userData ) );\n\n\t\t\tif ( options.includeCustomExtensions && json.gltfExtensions ) {\n\n\t\t\t\tif ( objectDef.extensions === undefined ) objectDef.extensions = {};\n\n\t\t\t\tfor ( const extensionName in json.gltfExtensions ) {\n\n\t\t\t\t\tobjectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];\n\t\t\t\t\textensionsUsed[ extensionName ] = true;\n\n\t\t\t\t}\n\n\t\t\t\tdelete json.gltfExtensions;\n\n\t\t\t}\n\n\t\t\tif ( Object.keys( json ).length > 0 ) objectDef.extras = json;\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: userData of \\'' + object.name + '\\' ' +\n\t\t\t\t'won\\'t be serialized because of JSON.stringify error - ' + error.message );\n\t\t\tconsole.warn( { ...object.userData } );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns ids for buffer attributes.\n\t * @param  {Object} object\n\t * @return {Integer}\n\t */\n\tgetUID( attribute, isRelativeCopy = false ) {\n\n\t\tif ( this.uids.has( attribute ) === false ) {\n\n\t\t\tconst uids = new Map();\n\n\t\t\tuids.set( true, this.uid ++ );\n\t\t\tuids.set( false, this.uid ++ );\n\n\t\t\tthis.uids.set( attribute, uids );\n\n\t\t}\n\n\t\tconst uids = this.uids.get( attribute );\n\n\t\treturn uids.get( isRelativeCopy );\n\n\t}\n\n\t/**\n\t * Checks if normal attribute values are normalized.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {Boolean}\n\t */\n\tisNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) ) return false;\n\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = normal.count; i < il; i ++ ) {\n\n\t\t\t// 0.0005 is from glTF-validator\n\t\t\tif ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Creates normalized normal buffer attribute.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {BufferAttribute}\n\t *\n\t */\n\tcreateNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) )\treturn cache.attributesNormalized.get( normal );\n\n\t\tconst attribute = normal.clone();\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tv.fromBufferAttribute( attribute, i );\n\n\t\t\tif ( v.x === 0 && v.y === 0 && v.z === 0 ) {\n\n\t\t\t\t// if values can't be normalized set (1, 0, 0)\n\t\t\t\tv.setX( 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.normalize();\n\n\t\t\t}\n\n\t\t\tattribute.setXYZ( i, v.x, v.y, v.z );\n\n\t\t}\n\n\t\tcache.attributesNormalized.set( normal, attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Applies a texture transform, if present, to the map definition. Requires\n\t * the KHR_texture_transform extension.\n\t *\n\t * @param {Object} mapDef\n\t * @param {THREE.Texture} texture\n\t */\n\tapplyTextureTransform( mapDef, texture ) {\n\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tif ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {\n\n\t\t\ttransformDef.offset = texture.offset.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.rotation !== 0 ) {\n\n\t\t\ttransformDef.rotation = texture.rotation;\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {\n\n\t\t\ttransformDef.scale = texture.repeat.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( didTransform ) {\n\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions[ 'KHR_texture_transform' ] = transformDef;\n\t\t\tthis.extensionsUsed[ 'KHR_texture_transform' ] = true;\n\n\t\t}\n\n\t}\n\n\tbuildMetalRoughTexture( metalnessMap, roughnessMap ) {\n\n\t\tif ( metalnessMap === roughnessMap ) return metalnessMap;\n\n\t\tfunction getEncodingConversion( map ) {\n\n\t\t\tif ( map.colorSpace === SRGBColorSpace ) {\n\n\t\t\t\treturn function SRGBToLinear( c ) {\n\n\t\t\t\t\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn function LinearToLinear( c ) {\n\n\t\t\t\treturn c;\n\n\t\t\t};\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' );\n\n\t\tif ( metalnessMap instanceof CompressedTexture /*&& ! metalnessMap.source._canSerialize*/ ) {\n\n\t\t\tmetalnessMap = decompress( metalnessMap );\n\n\t\t}\n\n\t\tif ( roughnessMap instanceof CompressedTexture /*&& ! roughnessMap.source._canSerialize*/ ) {\n\n\t\t\troughnessMap = decompress( roughnessMap );\n\n\t\t}\n\n\t\tconst metalness = metalnessMap ? metalnessMap.image : null;\n\t\tconst roughness = roughnessMap ? roughnessMap.image : null;\n\n\t\tconst width = Math.max( metalness ? metalness.width : 0, roughness ? roughness.width : 0 );\n\t\tconst height = Math.max( metalness ? metalness.height : 0, roughness ? roughness.height : 0 );\n\n\t\tconst canvas = getCanvas();\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d' );\n\t\tcontext.fillStyle = '#00ffff';\n\t\tcontext.fillRect( 0, 0, width, height );\n\n\t\tconst composite = context.getImageData( 0, 0, width, height );\n\n\t\tif ( metalness ) {\n\n\t\t\tcontext.drawImage( metalness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( metalnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 2; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( roughness ) {\n\n\t\t\tcontext.drawImage( roughness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( roughnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 1; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcontext.putImageData( composite, 0, 0 );\n\n\t\t//\n\n\t\tconst reference = metalnessMap || roughnessMap;\n\n\t\tconst texture = reference.clone();\n\n\t\ttexture.source = new Source( canvas );\n\t\ttexture.colorSpace = NoColorSpace;\n\t\ttexture.channel = ( metalnessMap || roughnessMap ).channel;\n\n\t\tif ( metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.' );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param  {ArrayBuffer} buffer\n\t * @return {Integer}\n\t */\n\tprocessBuffer( buffer ) {\n\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push( buffer );\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param  {BufferAttribute} attribute\n\t * @param  {number} componentType\n\t * @param  {number} start\n\t * @param  {number} count\n\t * @param  {number} target (Optional) Target usage of the BufferView\n\t * @return {Object}\n\t */\n\tprocessBufferView( attribute, componentType, start, count, target ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tswitch ( componentType ) {\n\n\t\t\tcase WEBGL_CONSTANTS.BYTE:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_BYTE:\n\n\t\t\t\tcomponentSize = 1;\n\n\t\t\t\tbreak;\n\n\t\t\tcase WEBGL_CONSTANTS.SHORT:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_SHORT:\n\n\t\t\t\tcomponentSize = 2;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tcomponentSize = 4;\n\n\t\t}\n\n\t\tlet byteStride = attribute.itemSize * componentSize;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Each element of a vertex attribute MUST be aligned to 4-byte boundaries\n\t\t\t// inside a bufferView\n\t\t\tbyteStride = Math.ceil( byteStride / 4 ) * 4;\n\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize( count * byteStride );\n\t\tconst dataView = new DataView( new ArrayBuffer( byteLength ) );\n\t\tlet offset = 0;\n\n\t\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( componentType === WEBGL_CONSTANTS.FLOAT ) {\n\n\t\t\t\t\tdataView.setFloat32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.INT ) {\n\n\t\t\t\t\tdataView.setInt32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {\n\n\t\t\t\t\tdataView.setUint32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.SHORT ) {\n\n\t\t\t\t\tdataView.setInt16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\t\t\tdataView.setUint16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.BYTE ) {\n\n\t\t\t\t\tdataView.setInt8( offset, value );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\t\t\tdataView.setUint8( offset, value );\n\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\n\t\t\t}\n\n\t\t\tif ( ( offset % byteStride ) !== 0 ) {\n\n\t\t\t\toffset += byteStride - ( offset % byteStride );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bufferViewDef = {\n\n\t\t\tbuffer: this.processBuffer( dataView.buffer ),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\n\t\t};\n\n\t\tif ( target !== undefined ) bufferViewDef.target = target;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = byteStride;\n\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tjson.bufferViews.push( bufferViewDef );\n\n\t\t// @TODO Merge bufferViews where possible.\n\t\tconst output = {\n\n\t\t\tid: json.bufferViews.length - 1,\n\t\t\tbyteLength: 0\n\n\t\t};\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @return {Promise<Integer>}\n\t */\n\tprocessBufferViewImage( blob ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\treturn new Promise( function ( resolve ) {\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\tconst buffer = getPaddedArrayBuffer( reader.result );\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve( json.bufferViews.push( bufferViewDef ) - 1 );\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\tprocessBufferViewImageBuffer( buffer ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\tbuffer = getPaddedArrayBuffer( buffer );\n\n\t\tconst bufferViewDef = {\n\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\tbyteOffset: writer.byteOffset,\n\t\t\tbyteLength: buffer.byteLength\n\t\t};\n\n\t\twriter.byteOffset += buffer.byteLength;\n\t\treturn json.bufferViews.push( bufferViewDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param  {BufferAttribute} attribute Attribute to process\n\t * @param  {THREE.BufferGeometry} geometry (Optional) Geometry used for truncated draw range\n\t * @param  {Integer} start (Optional)\n\t * @param  {Integer} count (Optional)\n\t * @return {Integer|null} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor( attribute, geometry, start, count ) {\n\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t9: 'MAT3',\n\t\t\t16: 'MAT4'\n\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array\n\t\tif ( attribute.array.constructor === Float32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.FLOAT;\n\n\t\t} else if ( attribute.array.constructor === Int32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.INT;\n\n\t\t} else if ( attribute.array.constructor === Uint32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_INT;\n\n\t\t} else if ( attribute.array.constructor === Int16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.SHORT;\n\n\t\t} else if ( attribute.array.constructor === Uint16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;\n\n\t\t} else if ( attribute.array.constructor === Int8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.BYTE;\n\n\t\t} else if ( attribute.array.constructor === Uint8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.array.constructor.name );\n\n\t\t}\n\n\t\tif ( start === undefined ) start = 0;\n\t\tif ( count === undefined || count === Infinity ) count = attribute.count;\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif ( count === 0 ) return null;\n\n\t\tconst minMax = getMinMax( attribute, start, count );\n\t\tlet bufferViewTarget;\n\n\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t// animation samplers, target must not be set.\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tbufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;\n\n\t\t}\n\n\t\tconst bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );\n\n\t\tconst accessorDef = {\n\n\t\t\tbufferView: bufferView.id,\n\t\t\tbyteOffset: bufferView.byteOffset,\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[ attribute.itemSize ]\n\n\t\t};\n\n\t\tif ( attribute.normalized === true ) accessorDef.normalized = true;\n\t\tif ( ! json.accessors ) json.accessors = [];\n\n\t\treturn json.accessors.push( accessorDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process image\n\t * @param  {Image} image to process\n\t * @param  {Integer} format of the image (RGBAFormat)\n\t * @param  {Boolean} flipY before writing out the image\n\t * @param  {String} mimeType export format\n\t * @param  {Integer} width override image width\n\t * @param  {Integer} height override image height\n\t * @return {Integer}     Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage( image, format, flipY, mimeType = 'image/png', width = undefined, height = undefined ) {\n\n\t\tif ( image !== null ) {\n\n\t\t\tconst writer = this;\n\t\t\tconst cache = writer.cache;\n\t\t\tconst json = writer.json;\n\t\t\tconst options = writer.options;\n\t\t\tconst pending = writer.pending;\n\n\t\t\tif ( ! cache.images.has( image ) ) cache.images.set( image, {} );\n\n\t\t\tconst cachedImages = cache.images.get( image );\n\n\t\t\tconst key = mimeType + ':flipY/' + flipY.toString() + ( width || height ? ';' + width + ';' + height : '' );\n\n\t\t\tif ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];\n\n\t\t\tif ( ! json.images ) json.images = [];\n\n\t\t\tconst imageDef = { mimeType: mimeType };\n\n\t\t\tconst canvas = getCanvas();\n\n\t\t\tcanvas.width = Math.min( width || image.width, options.maxTextureSize );\n\t\t\tcanvas.height = Math.min( height || image.height, options.maxTextureSize );\n\n\t\t\tconst ctx = canvas.getContext( '2d' );\n\n\t\t\tif ( flipY === true ) {\n\n\t\t\t\tctx.translate( 0, canvas.height );\n\t\t\t\tctx.scale( 1, - 1 );\n\n\t\t\t}\n\n\t\t\tif ( image.data !== undefined ) { // THREE.DataTexture\n\n\t\t\t\tif ( format !== RGBAFormat ) {\n\n\t\t\t\t\tconsole.error( 'GLTFExporter: Only RGBAFormat is supported.', format );\n\n\t\t\t\t}\n\n\t\t\t\tif ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {\n\n\t\t\t\t\tconsole.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );\n\n\t\t\t\t}\n\n\t\t\t\tconst data = new Uint8ClampedArray( image.height * image.width * 4 );\n\n\t\t\t\tfor ( let i = 0; i < data.length; i += 4 ) {\n\n\t\t\t\t\tdata[ i + 0 ] = image.data[ i + 0 ];\n\t\t\t\t\tdata[ i + 1 ] = image.data[ i + 1 ];\n\t\t\t\t\tdata[ i + 2 ] = image.data[ i + 2 ];\n\t\t\t\t\tdata[ i + 3 ] = image.data[ i + 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ) {\n\n\t\t\t\t\tctx.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\tpending.push(\n\n\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t.then( blob => writer.processBufferViewImage( blob ) )\n\t\t\t\t\t\t.then( bufferViewIndex => {\n\n\t\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\n\t\t\t\t\t\t} )\n\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tif ( canvas.toDataURL !== undefined ) {\n\n\t\t\t\t\timageDef.uri = canvas.toDataURL( mimeType );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpending.push(\n\n\t\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t\t.then( blob => new FileReader().readAsDataURL( blob ) )\n\t\t\t\t\t\t\t.then( dataURL => {\n\n\t\t\t\t\t\t\t\timageDef.uri = dataURL;\n\n\t\t\t\t\t\t\t} )\n\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst index = json.images.push( imageDef ) - 1;\n\t\t\tcachedImages[ key ] = index;\n\t\t\treturn index;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: No valid image data found. Unable to process texture.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param  {Texture} map Texture to process\n\t * @return {Integer}     Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler( map ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.samplers ) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: THREE_TO_WEBGL[ map.magFilter ],\n\t\t\tminFilter: THREE_TO_WEBGL[ map.minFilter ],\n\t\t\twrapS: THREE_TO_WEBGL[ map.wrapS ],\n\t\t\twrapT: THREE_TO_WEBGL[ map.wrapT ]\n\t\t};\n\n\t\treturn json.samplers.push( samplerDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process texture\n\t * @param  {Texture} map Map to process\n\t * @return {Integer} Index of the processed texture in the \"textures\" array\n\t */\n\tprocessTexture( map ) {\n\n\t\tconst writer = this;\n\t\tconst options = writer.options;\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.textures.has( map ) ) return cache.textures.get( map );\n\n\t\tif ( ! json.textures ) json.textures = [];\n\n\t\t// make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture\n\t\tif ( map instanceof CompressedTexture && ! map.source._canSerialize ) {\n\n\t\t\tmap = decompress( map, options.maxTextureSize );\n\n\t\t}\n\n\t\tlet mimeType = map.userData.mimeType;\n\n\t\tif ( mimeType === 'image/webp' ) mimeType = 'image/png';\n\t\tif ( mimeType === 'image/jpg' ) mimeType = 'image/jpeg';\n\n\t\tconst implTypes = [ 'image/jpeg', 'image/png' ];\n\n\t\t// if ( mimeType && ! implTypes.includes( mimeType ) ) {\n\t\t//\n\t\t// \tconsole.error( 'GLTFExporter: Unsupported mime type: ' + mimeType + '. Cannot export texture.', map );\n\t\t//\n\t\t// }\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler( map ),\n\t\t\tsource: ( ! mimeType || implTypes.includes( mimeType ) ) ? this.processImage( map.image, map.format, map.flipY, mimeType ) : null\n\t\t};\n\n\t\tif ( map.name ) textureDef.name = map.name;\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeTexture && ext.writeTexture( map, textureDef );\n\n\t\t} );\n\n\t\tif ( textureDef.source === null ) {\n\n\t\t\tconsole.error( 'GLTFExporter: Unsupported mime type: ' + mimeType + '. Cannot export texture.', map );\n\n\t\t}\n\n\n\t\tconst index = json.textures.push( textureDef ) - 1;\n\t\tcache.textures.set( map, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process material\n\t * @param  {THREE.Material} material Material to process\n\t * @return {Integer|null} Index of the processed material in the \"materials\" array\n\t */\n\tprocessMaterial( material ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.materials.has( material ) ) return cache.materials.get( material );\n\n\t\tif ( material.isShaderMaterial ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( ! json.materials ) json.materials = [];\n\n\t\t// @QUESTION Should we avoid including any attribute that has the default value?\n\t\tconst materialDef = {\tpbrMetallicRoughness: {} };\n\n\t\tif ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.color.toArray().concat( [ material.opacity ] );\n\n\t\tif ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\n\t\t}\n\n\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;\n\n\t\t} else {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.5;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.5;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif ( this.checkEmptyMap( material.metalnessMap ) || this.checkEmptyMap( material.roughnessMap ) ) {\n\n\t\t\tconst metalRoughTexture = this.buildMetalRoughTexture( material.metalnessMap, material.roughnessMap );\n\n\t\t\tconst metalRoughMapDef = {\n\t\t\t\tindex: this.processTexture( metalRoughTexture ),\n\t\t\t\tchannel: metalRoughTexture.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( metalRoughMapDef, metalRoughTexture );\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture\n\t\tif ( this.checkEmptyMap( material.map ) ) {\n\n\t\t\tconst baseColorMapDef = {\n\t\t\t\tindex: this.processTexture( material.map ),\n\t\t\t\ttexCoord: material.map.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( baseColorMapDef, material.map );\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tconst emissive = material.emissive;\n\t\t\tconst maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );\n\n\t\t\tif ( maxEmissiveComponent > 0 ) {\n\n\t\t\t\tmaterialDef.emissiveFactor = material.emissive.toArray();\n\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif ( this.checkEmptyMap( material.emissiveMap ) ) {\n\n\t\t\t\tconst emissiveMapDef = {\n\t\t\t\t\tindex: this.processTexture( material.emissiveMap ),\n\t\t\t\t\ttexCoord: material.emissiveMap.channel\n\t\t\t\t};\n\t\t\t\tthis.applyTextureTransform( emissiveMapDef, material.emissiveMap );\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalTexture\n\t\tif ( this.checkEmptyMap( material.normalMap ) ) {\n\n\t\t\tconst normalMapDef = {\n\t\t\t\tindex: this.processTexture( material.normalMap ),\n\t\t\t\ttexCoord: material.normalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.normalScale && material.normalScale.x !== 1 ) {\n\n\t\t\t\t// glTF normal scale is univariate. Ignore `y`, which may be flipped.\n\t\t\t\t// Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( normalMapDef, material.normalMap );\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif ( this.checkEmptyMap( material.aoMap ) ) {\n\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: this.processTexture( material.aoMap ),\n\t\t\t\ttexCoord: material.aoMap.channel\n\t\t\t};\n\n\t\t\tif ( material.aoMapIntensity !== 1.0 ) {\n\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( occlusionMapDef, material.aoMap );\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\n\t\t}\n\n\t\t// alphaMode\n\t\tif ( material.transparent ) {\n\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\n\t\t} else {\n\n\t\t\tif ( material.alphaTest > 0.0 ) {\n\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// doubleSided\n\t\tif ( material.side === DoubleSide ) materialDef.doubleSided = true;\n\t\tif ( material.name !== '' ) materialDef.name = material.name;\n\n\t\tthis.serializeUserData( material, materialDef );\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMaterial && ext.writeMaterial( material, materialDef );\n\n\t\t} );\n\n\t\tconst index = json.materials.push( materialDef ) - 1;\n\t\tcache.materials.set( material, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param  {THREE.Mesh} mesh Mesh to process\n\t * @return {Integer|null} Index of the processed mesh in the \"meshes\" array\n\t */\n\tprocessMesh( mesh ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [ mesh.geometry.uuid ];\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tfor ( let i = 0, l = mesh.material.length; i < l; i ++ ) {\n\n\t\t\t\tmeshCacheKeyParts.push( mesh.material[ i ].uuid\t);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmeshCacheKeyParts.push( mesh.material.uuid );\n\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join( ':' );\n\n\t\tif ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );\n\n\t\tconst geometry = mesh.geometry;\n\n\t\tlet mode;\n\n\t\t// Use the correct mode\n\t\tif ( mesh.isLineSegments ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINES;\n\n\t\t} else if ( mesh.isLineLoop ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_LOOP;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_STRIP;\n\n\t\t} else if ( mesh.isPoints ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.POINTS;\n\n\t\t} else {\n\n\t\t\tmode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;\n\n\t\t}\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\t// Conversion between attributes names in threejs and gltf spec\n\t\tconst nameConversion = {\n\t\t\tuv: 'TEXCOORD_0',\n\t\t\tuv1: 'TEXCOORD_1',\n\t\t\tuv2: 'TEXCOORD_2',\n\t\t\tuv3: 'TEXCOORD_3',\n\t\t\tcolor: 'COLOR_0',\n\t\t\tskinWeight: 'WEIGHTS_0',\n\t\t\tskinIndex: 'JOINTS_0'\n\t\t};\n\n\t\tconst originalNormal = geometry.getAttribute( 'normal' );\n\n\t\tif ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );\n\n\t\t\tgeometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );\n\n\t\t}\n\n\t\t// @QUESTION Detect if .vertexColors = true?\n\t\t// For every attribute create an accessor\n\t\tlet modifiedAttribute = null;\n\n\t\tfor ( let attributeName in geometry.attributes ) {\n\n\t\t\t// Ignore morph target attributes, which are exported later.\n\t\t\tif ( attributeName.slice( 0, 5 ) === 'morph' ) continue;\n\n\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\tattributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();\n\n\t\t\t// Prefix all geometry attributes except the ones specifically\n\t\t\t// listed in the spec; non-spec attributes are considered custom.\n\t\t\tconst validVertexAttributes =\n\t\t\t\t\t/^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\n\t\t\tif ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;\n\n\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\tattributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT.\n\t\t\tmodifiedAttribute = null;\n\t\t\tconst array = attribute.array;\n\n\t\t\tif ( attributeName === 'JOINTS_0' &&\n\t\t\t\t! ( array instanceof Uint16Array ) &&\n\t\t\t\t! ( array instanceof Uint8Array ) ) {\n\n\t\t\t\tconsole.warn( 'GLTFExporter: Attribute \"skinIndex\" converted to type UNSIGNED_SHORT.' );\n\t\t\t\tmodifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tconst accessor = this.processAccessor( modifiedAttribute || attribute, geometry );\n\n\t\t\tif ( accessor !== null ) {\n\n\t\t\t\tif ( ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\t\tthis.detectMeshQuantization( attributeName, attribute );\n\n\t\t\t\t}\n\n\t\t\t\tattributes[ attributeName ] = accessor;\n\t\t\t\tcache.attributes.set( this.getUID( attribute ), accessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal );\n\n\t\t// Skip if no exportable attributes found\n\t\tif ( Object.keys( attributes ).length === 0 ) return null;\n\n\t\t// Morph targets\n\t\tif ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {\n\n\t\t\tconst weights = [];\n\t\t\tconst targetNames = [];\n\t\t\tconst reverseDictionary = {};\n\n\t\t\tif ( mesh.morphTargetDictionary !== undefined ) {\n\n\t\t\t\tfor ( const key in mesh.morphTargetDictionary ) {\n\n\t\t\t\t\treverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {\n\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor ( const attributeName in geometry.morphAttributes ) {\n\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// Three.js doesn't support TANGENT yet.\n\n\t\t\t\t\tif ( attributeName !== 'position' && attributeName !== 'normal' ) {\n\n\t\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );\n\t\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[ attributeName ][ i ];\n\t\t\t\t\tconst gltfAttributeName = attributeName.toUpperCase();\n\n\t\t\t\t\t// Three.js morph attribute has absolute values while the one of glTF has relative values.\n\t\t\t\t\t//\n\t\t\t\t\t// glTF 2.0 Specification:\n\t\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\t\t\tconst baseAttribute = geometry.attributes[ attributeName ];\n\n\t\t\t\t\tif ( cache.attributes.has( this.getUID( attribute, true ) ) ) {\n\n\t\t\t\t\t\ttarget[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clones attribute not to override\n\t\t\t\t\tconst relativeAttribute = attribute.clone();\n\n\t\t\t\t\tif ( ! geometry.morphTargetsRelative ) {\n\n\t\t\t\t\t\tfor ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\t\t\t\t\tif ( a === 0 ) relativeAttribute.setX( j, attribute.getX( j ) - baseAttribute.getX( j ) );\n\t\t\t\t\t\t\t\tif ( a === 1 ) relativeAttribute.setY( j, attribute.getY( j ) - baseAttribute.getY( j ) );\n\t\t\t\t\t\t\t\tif ( a === 2 ) relativeAttribute.setZ( j, attribute.getZ( j ) - baseAttribute.getZ( j ) );\n\t\t\t\t\t\t\t\tif ( a === 3 ) relativeAttribute.setW( j, attribute.getW( j ) - baseAttribute.getW( j ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );\n\t\t\t\t\tcache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] );\n\n\t\t\t\t}\n\n\t\t\t\ttargets.push( target );\n\n\t\t\t\tweights.push( mesh.morphTargetInfluences[ i ] );\n\n\t\t\t\tif ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );\n\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\n\t\t\tif ( targetNames.length > 0 ) {\n\n\t\t\t\tmeshDef.extras = {};\n\t\t\t\tmeshDef.extras.targetNames = targetNames;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray( mesh.material );\n\n\t\tif ( isMultiMaterial && geometry.groups.length === 0 ) return null;\n\n\t\tlet didForceIndices = false;\n\n\t\tif ( isMultiMaterial && geometry.index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tfor ( let i = 0, il = geometry.attributes.position.count; i < il; i ++ ) {\n\n\t\t\t\tindices[ i ] = i;\n\n\t\t\t}\n\n\t\t\tgeometry.setIndex( indices );\n\n\t\t\tdidForceIndices = true;\n\n\t\t}\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [ mesh.material ];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ];\n\n\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes,\n\t\t\t};\n\n\t\t\tthis.serializeUserData( geometry, primitive );\n\n\t\t\tif ( targets.length > 0 ) primitive.targets = targets;\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tlet cacheKey = this.getUID( geometry.index );\n\n\t\t\t\tif ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {\n\n\t\t\t\t\tcacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cache.attributes.has( cacheKey ) ) {\n\n\t\t\t\t\tprimitive.indices = cache.attributes.get( cacheKey );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprimitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );\n\t\t\t\t\tcache.attributes.set( cacheKey, primitive.indices );\n\n\t\t\t\t}\n\n\t\t\t\tif ( primitive.indices === null ) delete primitive.indices;\n\n\t\t\t}\n\n\t\t\tconst material = this.processMaterial( materials[ groups[ i ].materialIndex ] );\n\n\t\t\tif ( material !== null ) primitive.material = material;\n\n\t\t\tprimitives.push( primitive );\n\n\t\t}\n\n\t\tif ( didForceIndices === true ) {\n\n\t\t\tgeometry.setIndex( null );\n\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif ( ! json.meshes ) json.meshes = [];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMesh && ext.writeMesh( mesh, meshDef );\n\n\t\t} );\n\n\t\tconst index = json.meshes.push( meshDef ) - 1;\n\t\tcache.meshes.set( meshCacheKey, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * If a vertex attribute with a\n\t * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview)\n\t * is used, it is checked whether it is a valid data type according to the\n\t * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)\n\t * extension.\n\t * In this case the extension is automatically added to the list of used extensions.\n\t *\n\t * @param {string} attributeName\n\t * @param {THREE.BufferAttribute} attribute\n\t */\n\tdetectMeshQuantization( attributeName, attribute ) {\n\n\t\tif ( this.extensionsUsed[ KHR_MESH_QUANTIZATION ] ) return;\n\n\t\tlet attrType = undefined;\n\n\t\tswitch ( attribute.array.constructor ) {\n\n\t\t\tcase Int8Array:\n\n\t\t\t\tattrType = 'byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint8Array:\n\n\t\t\t\tattrType = 'unsigned byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Int16Array:\n\n\t\t\t\tattrType = 'short';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint16Array:\n\n\t\t\t\tattrType = 'unsigned short';\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.normalized ) attrType += ' normalized';\n\n\t\tconst attrNamePrefix = attributeName.split( '_', 1 )[ 0 ];\n\n\t\tif ( KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ] && KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ].includes( attrType ) ) {\n\n\t\t\tthis.extensionsUsed[ KHR_MESH_QUANTIZATION ] = true;\n\t\t\tthis.extensionsRequired[ KHR_MESH_QUANTIZATION ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process camera\n\t * @param  {THREE.Camera} camera Camera to process\n\t * @return {Integer}      Index of the processed mesh in the \"camera\" array\n\t */\n\tprocessCamera( camera ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.cameras ) json.cameras = [];\n\n\t\tconst isOrtho = camera.isOrthographicCamera;\n\n\t\tconst cameraDef = {\n\t\t\ttype: isOrtho ? 'orthographic' : 'perspective'\n\t\t};\n\n\t\tif ( isOrtho ) {\n\n\t\t\tcameraDef.orthographic = {\n\t\t\t\txmag: camera.right * 2,\n\t\t\t\tymag: camera.top * 2,\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tcameraDef.perspective = {\n\t\t\t\taspectRatio: camera.aspect,\n\t\t\t\tyfov: MathUtils.degToRad( camera.fov ),\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t}\n\n\t\t// Question: Is saving \"type\" as name intentional?\n\t\tif ( camera.name !== '' ) cameraDef.name = camera.type;\n\n\t\treturn json.cameras.push( cameraDef ) - 1;\n\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t *\n\t * @param {THREE.AnimationClip} clip\n\t * @param {THREE.Object3D} root\n\t * @return {number|null}\n\t */\n\tprocessAnimation( clip, root ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.animations ) json.animations = [];\n\n\t\ttry {\n\n\t\t\tclip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );\n\n\t\t} catch ( e ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation clip \"%s\".', clip.name );\n\n\t\t\tif ( ! this.options.ignoreInvalidMorphTargetTracks ) throw e;\n\n\t\t\tconsole.error( e );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor ( let i = 0; i < tracks.length; ++ i ) {\n\n\t\t\tconst track = tracks[ i ];\n\t\t\tconst trackBinding = PropertyBinding.parseTrackName( track.name );\n\t\t\tlet trackNode = PropertyBinding.findNode( root, trackBinding.nodeName );\n\t\t\tconst trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];\n\n\t\t\tif ( trackBinding.objectName === 'bones' ) {\n\n\t\t\t\tif ( trackNode.isSkinnedMesh === true ) {\n\n\t\t\t\t\ttrackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttrackNode = undefined;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! trackNode || ! trackProperty ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation track \"%s\".', track.name );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.values.length / track.times.length;\n\n\t\t\tif ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {\n\n\t\t\t\toutputItemSize /= trackNode.morphTargetInfluences.length;\n\n\t\t\t}\n\n\t\t\tlet interpolation;\n\n\t\t\t// @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE\n\n\t\t\t// Detecting glTF cubic spline interpolant by checking factory method's special property\n\t\t\t// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return\n\t\t\t// valid value from .getInterpolation().\n\t\t\tif ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {\n\n\t\t\t\tinterpolation = 'CUBICSPLINE';\n\n\t\t\t\t// itemSize of CUBICSPLINE keyframe is 9\n\t\t\t\t// (VEC3 * 3: inTangent, splineVertex, and outTangent)\n\t\t\t\t// but needs to be stored as VEC3 so dividing by 3 here.\n\t\t\t\toutputItemSize /= 3;\n\n\t\t\t} else if ( track.getInterpolation() === InterpolateDiscrete ) {\n\n\t\t\t\tinterpolation = 'STEP';\n\n\t\t\t} else {\n\n\t\t\t\tinterpolation = 'LINEAR';\n\n\t\t\t}\n\n\t\t\tsamplers.push( {\n\t\t\t\tinput: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ),\n\t\t\t\toutput: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ),\n\t\t\t\tinterpolation: interpolation\n\t\t\t} );\n\n\t\t\tchannels.push( {\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get( trackNode ),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tconst animationDef = {\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t};\n\n\t\tthis.serializeUserData( clip, animationDef );\n\n\t\tjson.animations.push( animationDef );\n\n\t\treturn json.animations.length - 1;\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D} object\n\t * @return {number|null}\n\t */\n\t processSkin( object ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[ nodeMap.get( object ) ];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif ( skeleton === undefined ) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[ 0 ];\n\n\t\tif ( rootJoint === undefined ) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor ( let i = 0; i < skeleton.bones.length; ++ i ) {\n\n\t\t\tjoints.push( nodeMap.get( skeleton.bones[ i ] ) );\n\t\t\ttemporaryBoneInverse.copy( skeleton.boneInverses[ i ] );\n\t\t\ttemporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( json.skins === undefined ) json.skins = [];\n\n\t\tjson.skins.push( {\n\t\t\tinverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get( rootJoint )\n\t\t} );\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param  {THREE.Object3D} node Object3D to processNode\n\t * @return {Integer} Index of the node in the nodes list\n\t */\n\tprocessNode( object ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.nodes ) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif ( options.trs ) {\n\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {\n\n\t\t\t\tnodeDef.rotation = rotation;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( position, [ 0, 0, 0 ] ) ) {\n\n\t\t\t\tnodeDef.translation = position;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {\n\n\t\t\t\tnodeDef.scale = scale;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( object.matrixAutoUpdate ) {\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t}\n\n\t\t\tif ( isIdentityMatrix( object.matrix ) === false ) {\n\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// We don't export empty strings name because it represents no-name in Three.js.\n\t\tif ( object.name !== '' ) nodeDef.name = String( object.name );\n\n\t\tthis.serializeUserData( object, nodeDef );\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tconst meshIndex = this.processMesh( object );\n\n\t\t\tif ( meshIndex !== null ) nodeDef.mesh = meshIndex;\n\n\t\t} else if ( object.isCamera ) {\n\n\t\t\tnodeDef.camera = this.processCamera( object );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) this.skins.push( object );\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tconst children = [];\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = object.children[ i ];\n\n\t\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\t\tif ( nodeIndex !== null ) children.push( nodeIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( children.length > 0 ) nodeDef.children = children;\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeNode && ext.writeNode( object, nodeDef );\n\n\t\t} );\n\n\t\tconst nodeIndex = json.nodes.push( nodeDef ) - 1;\n\t\tnodeMap.set( object, nodeIndex );\n\t\treturn nodeIndex;\n\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param  {Scene} node Scene to process\n\t */\n\tprocessScene( scene ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! json.scenes ) {\n\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif ( scene.name !== '' ) sceneDef.name = scene.name;\n\n\t\tjson.scenes.push( sceneDef );\n\n\t\tconst nodes = [];\n\n\t\tfor ( let i = 0, l = scene.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = scene.children[ i ];\n\n\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\tif ( nodeIndex !== null ) nodes.push( nodeIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( nodes.length > 0 ) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData( scene, sceneDef );\n\n\t}\n\n\t/**\n\t * Creates a Scene to hold a list of objects and parse it\n\t * @param  {Array} objects List of objects to process\n\t */\n\tprocessObjects( objects ) {\n\n\t\tconst scene = new Scene();\n\t\tscene.name = 'AuxScene';\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t// modify the .parent and break its original scene and hierarchy\n\t\t\tscene.children.push( objects[ i ] );\n\n\t\t}\n\n\t\tthis.processScene( scene );\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|Array<THREE.Object3D>} input\n\t */\n\tprocessInput( input ) {\n\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [ input ];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.beforeParse && ext.beforeParse( input );\n\n\t\t} );\n\n\t\tconst objectsWithoutScene = [];\n\n\t\tfor ( let i = 0; i < input.length; i ++ ) {\n\n\t\t\tif ( input[ i ] instanceof Scene ) {\n\n\t\t\t\tthis.processScene( input[ i ] );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsWithoutScene.push( input[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsWithoutScene.length > 0 ) this.processObjects( objectsWithoutScene );\n\n\t\tfor ( let i = 0; i < this.skins.length; ++ i ) {\n\n\t\t\tthis.processSkin( this.skins[ i ] );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < options.animations.length; ++ i ) {\n\n\t\t\tthis.processAnimation( options.animations[ i ], input[ 0 ] );\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.afterParse && ext.afterParse( input );\n\n\t\t} );\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tfor ( let i = 0, il = this.plugins.length; i < il; i ++ ) {\n\n\t\t\tfunc( this.plugins[ i ] );\n\n\t\t}\n\n\t}\n\n\tcheckEmptyMap( map ) {\n\n\t\treturn !! map && ( ! this.options.ignoreEmptyTextures || !! map.image );\n\n\t}\n\n}\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\n\t}\n\n\twriteNode( light, nodeDef ) {\n\n\t\tif ( ! light.isLight ) return;\n\n\t\tif ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif ( light.name ) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif ( light.isDirectionalLight ) {\n\n\t\t\tlightDef.type = 'directional';\n\n\t\t} else if ( light.isPointLight ) {\n\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t} else if ( light.isSpotLight ) {\n\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\n\t\t}\n\n\t\tif ( light.decay !== undefined && light.decay !== 2 ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.' );\n\n\t\t}\n\n\t\tif ( light.target\n\t\t\t\t&& ( light.target.parent !== light\n\t\t\t\t|| light.target.position.x !== 0\n\t\t\t\t|| light.target.position.y !== 0\n\t\t\t\t|| light.target.position.z !== - 1 ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, '\n\t\t\t\t+ 'make light.target a child of the light with position 0,0,-1.' );\n\n\t\t}\n\n\t\tif ( ! extensionsUsed[ this.name ] ) {\n\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[ this.name ] = { lights: [] };\n\t\t\textensionsUsed[ this.name ] = true;\n\n\t\t}\n\n\t\tconst lights = json.extensions[ this.name ].lights;\n\t\tlights.push( lightDef );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { light: lights.length - 1 };\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshBasicMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = {};\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_clearcoat';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.clearcoat === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.clearcoatFactor = material.clearcoat;\n\n\t\tif ( writer.checkEmptyMap( material.clearcoatMap ) ) {\n\n\t\t\tconst clearcoatMapDef = {\n\t\t\t\tindex: writer.processTexture( material.clearcoatMap ),\n\t\t\t\ttexCoord: material.clearcoatMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatMapDef, material.clearcoatMap );\n\t\t\textensionDef.clearcoatTexture = clearcoatMapDef;\n\n\t\t}\n\n\t\textensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;\n\n\t\tif ( writer.checkEmptyMap( material.clearcoatRoughnessMap ) ) {\n\n\t\t\tconst clearcoatRoughnessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.clearcoatRoughnessMap ),\n\t\t\t\ttexCoord: material.clearcoatRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap );\n\t\t\textensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( writer.checkEmptyMap( material.clearcoatNormalMap ) ) {\n\n\t\t\tconst clearcoatNormalMapDef = {\n\t\t\t\tindex: writer.processTexture( material.clearcoatNormalMap ),\n\t\t\t\ttexCoord: material.clearcoatNormalMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap );\n\t\t\textensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_iridescence';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.iridescence === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.iridescenceFactor = material.iridescence;\n\n\t\tif ( writer.checkEmptyMap( material.iridescenceMap ) ) {\n\n\t\t\tconst iridescenceMapDef = {\n\t\t\t\tindex: writer.processTexture( material.iridescenceMap ),\n\t\t\t\ttexCoord: material.iridescenceMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceMapDef, material.iridescenceMap );\n\t\t\textensionDef.iridescenceTexture = iridescenceMapDef;\n\n\t\t}\n\n\t\textensionDef.iridescenceIor = material.iridescenceIOR;\n\t\textensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ];\n\t\textensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ];\n\n\t\tif ( writer.checkEmptyMap( material.iridescenceThicknessMap ) ) {\n\n\t\t\tconst iridescenceThicknessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.iridescenceThicknessMap ),\n\t\t\t\ttexCoord: material.iridescenceThicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap );\n\t\t\textensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_transmission';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.transmissionFactor = material.transmission;\n\n\t\tif ( writer.checkEmptyMap( material.transmissionMap ) ) {\n\n\t\t\tconst transmissionMapDef = {\n\t\t\t\tindex: writer.processTexture( material.transmissionMap ),\n\t\t\t\ttexCoord: material.transmissionMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( transmissionMapDef, material.transmissionMap );\n\t\t\textensionDef.transmissionTexture = transmissionMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_volume';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.thicknessFactor = material.thickness;\n\n\t\tif ( writer.checkEmptyMap( material.thicknessMap ) ) {\n\n\t\t\tconst thicknessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.thicknessMap ),\n\t\t\t\ttexCoord: material.thicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( thicknessMapDef, material.thicknessMap );\n\t\t\textensionDef.thicknessTexture = thicknessMapDef;\n\n\t\t}\n\n\t\textensionDef.attenuationDistance = material.attenuationDistance;\n\t\textensionDef.attenuationColor = material.attenuationColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_ior';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.ior === 1.5 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.ior = material.ior;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_specular';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 &&\n\t\t       material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) &&\n\t\t     ! material.specularIntensityMap && ! material.specularColorMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( writer.checkEmptyMap( material.specularIntensityMap ) ) {\n\n\t\t\tconst specularIntensityMapDef = {\n\t\t\t\tindex: writer.processTexture( material.specularIntensityMap ),\n\t\t\t\ttexCoord: material.specularIntensityMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularIntensityMapDef, material.specularIntensityMap );\n\t\t\textensionDef.specularTexture = specularIntensityMapDef;\n\n\t\t}\n\n\t\tif ( writer.checkEmptyMap( material.specularColorMap ) ) {\n\n\t\t\tconst specularColorMapDef = {\n\t\t\t\tindex: writer.processTexture( material.specularColorMap ),\n\t\t\t\ttexCoord: material.specularColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularColorMapDef, material.specularColorMap );\n\t\t\textensionDef.specularColorTexture = specularColorMapDef;\n\n\t\t}\n\n\t\textensionDef.specularFactor = material.specularIntensity;\n\t\textensionDef.specularColorFactor = material.specularColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_sheen';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.sheen < 0.001 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( writer.checkEmptyMap( material.sheenRoughnessMap ) ) {\n\n\t\t\tconst sheenRoughnessMapDef = {\n\t\t\t\tindex: writer.processTexture( material.sheenRoughnessMap ),\n\t\t\t\ttexCoord: material.sheenRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap );\n\t\t\textensionDef.sheenRoughnessTexture = sheenRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( writer.checkEmptyMap( material.sheenColorMap ) ) {\n\n\t\t\tconst sheenColorMapDef = {\n\t\t\t\tindex: writer.processTexture( material.sheenColorMap ),\n\t\t\t\ttexCoord: material.sheenColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenColorMapDef, material.sheenColorMap );\n\t\t\textensionDef.sheenColorTexture = sheenColorMapDef;\n\n\t\t}\n\n\t\textensionDef.sheenRoughnessFactor = material.sheenRoughness;\n\t\textensionDef.sheenColorFactor = material.sheenColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\tmaterialDef.extras = materialDef.extras || {};\n\t\tmaterialDef.extras.sheenFactor = material.sheen;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Anisotropy Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_anisotropy';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.anisotropy == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( writer.checkEmptyMap( material.anisotropyMap ) ) {\n\n\t\t\tconst anisotropyMapDef = { index: writer.processTexture( material.anisotropyMap ) };\n\t\t\twriter.applyTextureTransform( anisotropyMapDef, material.anisotropyMap );\n\t\t\textensionDef.anisotropyTexture = anisotropyMapDef;\n\n\t\t}\n\n\t\textensionDef.anisotropyStrength = material.anisotropy;\n\t\textensionDef.anisotropyRotation = material.anisotropyRotation;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_emissive_strength';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.emissiveStrength = material.emissiveIntensity;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_materials_bump';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || (\n\t\t       material.bumpScale === 1 &&\n\t\t     ! material.bumpMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tconst bumpMapDef = {\n\t\t\t\tindex: writer.processTexture( material.bumpMap ),\n\t\t\t\ttexCoord: material.bumpMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( bumpMapDef, material.bumpMap );\n\t\t\textensionDef.bumpTexture = bumpMapDef;\n\n\t\t}\n\n\t\textensionDef.bumpFactor = material.bumpScale;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_mesh_gpu_instancing';\n\n\t}\n\n\twriteNode( object, nodeDef ) {\n\n\t\tif ( ! object.isInstancedMesh ) return;\n\n\t\tconst writer = this.writer;\n\n\t\tconst mesh = object;\n\n\t\tconst translationAttr = new Float32Array( mesh.count * 3 );\n\t\tconst rotationAttr = new Float32Array( mesh.count * 4 );\n\t\tconst scaleAttr = new Float32Array( mesh.count * 3 );\n\n\t\tconst matrix = new Matrix4();\n\t\tconst position = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3();\n\n\t\tfor ( let i = 0; i < mesh.count; i ++ ) {\n\n\t\t\tmesh.getMatrixAt( i, matrix );\n\t\t\tmatrix.decompose( position, quaternion, scale );\n\n\t\t\tposition.toArray( translationAttr, i * 3 );\n\t\t\tquaternion.toArray( rotationAttr, i * 4 );\n\t\t\tscale.toArray( scaleAttr, i * 3 );\n\n\t\t}\n\n\t\tconst attributes = {\n\t\t\tTRANSLATION: writer.processAccessor( new BufferAttribute( translationAttr, 3 ) ),\n\t\t\tROTATION: writer.processAccessor( new BufferAttribute( rotationAttr, 4 ) ),\n\t\t\tSCALE: writer.processAccessor( new BufferAttribute( scaleAttr, 3 ) ),\n\t\t};\n\n\t\tif ( mesh.instanceColor )\n\t\t\tattributes._COLOR_0 = writer.processAccessor( mesh.instanceColor );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { attributes };\n\n\t\twriter.extensionsUsed[ this.name ] = true;\n\t\twriter.extensionsRequired[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Static utility functions\n */\nGLTFExporter.Utils = {\n\tGLTFWriter,\n\n\tinsertKeyframe: function ( track, time ) {\n\n\t\tconst tolerance = 0.001; // 1ms\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = new track.TimeBufferType( track.times.length + 1 );\n\t\tconst values = new track.ValueBufferType( track.values.length + valueSize );\n\t\tconst interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );\n\n\t\tlet index;\n\n\t\tif ( track.times.length === 0 ) {\n\n\t\t\ttimes[ 0 ] = time;\n\n\t\t\tfor ( let i = 0; i < valueSize; i ++ ) {\n\n\t\t\t\tvalues[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time < track.times[ 0 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;\n\n\t\t\ttimes[ 0 ] = time;\n\t\t\ttimes.set( track.times, 1 );\n\n\t\t\tvalues.set( interpolant.evaluate( time ), 0 );\n\t\t\tvalues.set( track.values, valueSize );\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time > track.times[ track.times.length - 1 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {\n\n\t\t\t\treturn track.times.length - 1;\n\n\t\t\t}\n\n\t\t\ttimes[ times.length - 1 ] = time;\n\t\t\ttimes.set( track.times, 0 );\n\n\t\t\tvalues.set( track.values, 0 );\n\t\t\tvalues.set( interpolant.evaluate( time ), track.values.length );\n\n\t\t\tindex = times.length - 1;\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < track.times.length; i ++ ) {\n\n\t\t\t\tif ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;\n\n\t\t\t\tif ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {\n\n\t\t\t\t\ttimes.set( track.times.slice( 0, i + 1 ), 0 );\n\t\t\t\t\ttimes[ i + 1 ] = time;\n\t\t\t\t\ttimes.set( track.times.slice( i + 1 ), i + 2 );\n\n\t\t\t\t\tvalues.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );\n\t\t\t\t\tvalues.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );\n\t\t\t\t\tvalues.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );\n\n\t\t\t\t\tindex = i + 1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttrack.times = times;\n\t\ttrack.values = values;\n\n\t\treturn index;\n\n\t},\n\n\tmergeMorphTargetTracks: function ( clip, root ) {\n\n\t\tconst tracks = [];\n\t\tconst mergedTracks = {};\n\t\tconst sourceTracks = clip.tracks;\n\n\t\tfor ( let i = 0; i < sourceTracks.length; ++ i ) {\n\n\t\t\tlet sourceTrack = sourceTracks[ i ];\n\t\t\tconst sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name );\n\t\t\tconst sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName );\n\n\t\t\tif ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {\n\n\t\t\t\t// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.\n\t\t\t\ttracks.push( sourceTrack );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete\n\t\t\t\t&& sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {\n\n\t\t\t\tif ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\t\t// This should never happen, because glTF morph target animations\n\t\t\t\t\t// affect all targets already.\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );\n\n\t\t\t\tsourceTrack = sourceTrack.clone();\n\t\t\t\tsourceTrack.setInterpolation( InterpolateLinear );\n\n\t\t\t}\n\n\t\t\tconst targetCount = sourceTrackNode.morphTargetInfluences.length;\n\t\t\tconst targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];\n\n\t\t\tif ( targetIndex === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );\n\n\t\t\t}\n\n\t\t\tlet mergedTrack;\n\n\t\t\t// If this is the first time we've seen this object, create a new\n\t\t\t// track to store merged keyframe data for each morph target.\n\t\t\tif ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {\n\n\t\t\t\tmergedTrack = sourceTrack.clone();\n\n\t\t\t\tconst values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );\n\n\t\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\t\tvalues[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];\n\n\t\t\t\t}\n\n\t\t\t\t// We need to take into consideration the intended target node\n\t\t\t\t// of our original un-merged morphTarget animation.\n\t\t\t\tmergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';\n\t\t\t\tmergedTrack.values = values;\n\n\t\t\t\tmergedTracks[ sourceTrackNode.uuid ] = mergedTrack;\n\t\t\t\ttracks.push( mergedTrack );\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );\n\n\t\t\tmergedTrack = mergedTracks[ sourceTrackNode.uuid ];\n\n\t\t\t// For every existing keyframe of the merged track, write a (possibly\n\t\t\t// interpolated) value from the source track.\n\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\tmergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );\n\n\t\t\t}\n\n\t\t\t// For every existing keyframe of the source track, write a (possibly\n\t\t\t// new) keyframe to the merged track. Values from the previous loop may\n\t\t\t// be written again, but keyframes are de-duplicated.\n\t\t\tfor ( let j = 0; j < sourceTrack.times.length; j ++ ) {\n\n\t\t\t\tconst keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );\n\t\t\t\tmergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\treturn clip;\n\n\t}\n\n};\n\nexport { GLTFExporter };\n","import {GLTFExporter, GLTFExporterOptions} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {AnimationClip, BufferGeometry, Material, MeshStandardMaterial, Object3D, PixelFormat, Texture} from 'three'\nimport {blobToDataURL} from 'ts-browser-helpers'\nimport type {GLTFExporter2Options} from './GLTFExporter2'\nimport {getEmptyMeta, isNonRelativeUrl, ThreeSerialization} from '../../utils'\nimport {IMaterial} from '../../core'\n\nexport class GLTFWriter2 extends GLTFExporter.Utils.GLTFWriter {\n\n    readonly TPAssetVersion = 1\n    serializationMeta = getEmptyMeta()\n\n    constructor() {\n        super()\n        this.json.asset.subversion = this.TPAssetVersion\n    }\n\n    // Hook for deterministic-injection.js to patch processBufferViewImage/write for testing.\n    // Guarded by import.meta.env.DEV — stripped from production builds by Vite.\n    static { if (import.meta.env.DEV) (globalThis as any).testing_patchGLTFWriter2?.(GLTFWriter2) }\n\n    declare options: GLTFExporterOptions & {\n        externalImagesInExtras: boolean,\n        exporterOptions: GLTFExporter2Options\n    }\n    serializeUserData(object: Object3D | Material | BufferGeometry | AnimationClip | Texture, objectDef: any): void {\n\n        const userData = object.userData\n        const temp: any = {}\n        if (userData.__disposed) {\n            console.error('Serializing a disposed object', object)\n        }\n        Object.entries(userData).forEach(([key, value]: any) => {\n            if (!value ||\n                typeof value === 'function' ||\n                value.isObject3D ||\n                value.isTexture ||\n                value.isMaterial ||\n                value.assetType != null ||\n                key.startsWith('_') // private data. todo remove private values inside userdata.ecs...\n            ) {\n                temp[key] = value\n                delete userData[key]\n            }\n        })\n\n        const ud2 = ThreeSerialization.Serialize(userData, this.serializationMeta)\n        Object.entries(temp).forEach(([key, value]) => {\n            userData[key] = value\n            delete temp[key]\n        })\n        object.userData = ud2\n        super.serializeUserData(object as any, objectDef)\n        object.userData = userData\n    }\n\n    processObjects(objects: Object3D[]) {\n        if (objects.length === 1 && objects[0]?.userData.rootSceneModelRoot) {\n            // objects[0].isScene = true\n            this.processScene(objects[0])\n            // delete objects[0].isScene\n        } else\n            super.processObjects(objects)\n    }\n\n    protected _defaultMaterial = new MeshStandardMaterial()\n\n    /**\n     * Checks for shader material and does the same thing...\n     * @param material\n     */\n    processMaterial(material: Material): number|null {\n        if (this.cache.materials.has(material)) return this.cache.materials.get(material)!\n\n        let mat = material as any\n\n        // set default material when material is null. shader material is processed further below for custom extensions like diamonds.\n        if (!mat || mat.isShaderMaterial) mat = this._defaultMaterial\n\n        const defIndex = super.processMaterial(mat)\n\n        if (defIndex === null) {\n            console.error('GLTFWriter2: Unexpected error: Failed to process material', material)\n            return null\n        }\n\n        // when not a shader material\n        if (!material || mat === material) return defIndex\n\n        // when shader material\n        const defaultDef = JSON.stringify(this.json.materials[defIndex])\n        const materialDef = JSON.parse(defaultDef) // for deep clone\n        // console.log(defIndex, defaultDef, materialDef)\n\n        const color = (material as IMaterial).color?.isColor ? (material as IMaterial).color!.toArray().concat([material.opacity]) : null\n        if (color && !color.every((c) => c === 1) && materialDef.pbrMetallicRoughness) {\n            materialDef.pbrMetallicRoughness.baseColorFactor = color\n        }\n\n        this.serializeUserData(material, materialDef)\n\n        this._invokeAll((ext)=>{\n            ext.writeMaterial && ext.writeMaterial(material, materialDef)\n        })\n\n        // todo: test remove this\n        // if (JSON.stringify(materialDef) === defaultDef) {\n        //     return defIndex\n        // }\n\n        const index = this.json.materials.push(materialDef) - 1\n        this.cache.materials.set(material, index)\n        return index\n\n    }\n\n    /**\n     * Same as processImage but for image blobs\n     * @param blob\n     * @param texture\n     */\n    processImageBlob(blob: Blob, texture: Texture) {\n        if (!blob) return -1\n\n        const cache = this.cache\n        const options = this.options\n        const pending = this.pending\n        const json = this.json\n\n        const image = texture.image\n\n        if (!cache.images.has(image)) cache.images.set(image, {})\n\n        const cachedImages = cache.images.get(image)\n        const key = blob.type + ':flipY/' + texture.flipY.toString()\n\n        if (cachedImages[ key ] !== undefined) return cachedImages[ key ]\n\n        if (!json.images) json.images = []\n\n        const imageDef: any = {mimeType: blob.type}\n\n        if (options.binary === true) {\n\n            pending.push(new Promise<void>((resolve)=>{\n\n                this.processBufferViewImage(blob).then((bufferViewIndex: number)=>{\n\n                    imageDef.bufferView = bufferViewIndex\n                    resolve()\n\n                })\n\n            }))\n\n        } else {\n\n            pending.push(blobToDataURL(blob).then((dataURL: string)=>{\n                imageDef.uri = dataURL\n            }))\n\n        }\n        const index = json.images.push(imageDef) - 1\n        cachedImages[ key ] = index\n        return index\n\n    }\n\n    processSampler(map: Texture) {\n        const samplerIndex = super.processSampler(map)\n\n        // const samplerDef = this.json.samplers[samplerIndex]\n        // if (!samplerDef) return samplerIndex\n\n        // this.serializeUserData(map, samplerDef) // todo check when serializeUserData added to three.js core\n\n        // todo: uncomment when sampler extras supported by gltf-transform: https://github.com/donmccurdy/glTF-Transform/issues/645\n        // if (!samplerDef.extras) samplerDef.extras = {}\n        // samplerDef.extras.uuid = map.uuid\n\n        return samplerIndex\n\n    }\n    processTexture(map: Texture) {\n        const cache = this.cache\n        const json = this.json\n\n        if (cache.textures.has(map)) return cache.textures.get(map)!\n\n        const srcData = map.source.data\n        const mimeType = map.userData.mimeType\n\n        const hasRootPath = !map.isRenderTargetTexture && map.userData.rootPath && typeof map.userData.rootPath === 'string' &&\n            isNonRelativeUrl(map.userData.rootPath)\n\n        if (hasRootPath && !this.options.exporterOptions.embedUrlImages) {\n            if (map.source.data) { // handled below in GLTFWriter2.processImage\n                if (!this.options.exporterOptions.embedUrlImagePreviews || (map as any).isDataTexture) map.source.data = null // todo make sure its only Texture, check for svg etc\n                else map.source.data._savePreview = true\n            }\n            delete map.userData.mimeType // for extensions like ktx2\n        }\n\n        const processed = super.processTexture(map)\n\n        const textureDef = json.textures[processed]\n        if (!textureDef) {\n            console.error('No texture def', processed, map)\n            return processed\n        }\n\n        // if (!textureDef.extras) textureDef.extras = {}\n\n        if (hasRootPath && !this.options.exporterOptions.embedUrlImages) {\n            if (map.source.data) delete map.source.data._savePreview\n            else map.source.data = srcData\n\n            map.userData.mimeType = mimeType\n            if (!textureDef) {\n                console.error('textureDef is null', processed, map)\n                return processed\n            }\n            let uri = map.userData.rootPath\n            const basePath = this.options.exporterOptions._basePath\n            if (basePath && typeof uri === 'string' && uri.startsWith(basePath)) {\n                uri = uri.slice(basePath.length)\n            }\n            if (textureDef.source >= 0) {\n                // console.warn('textureDef.source is already set', processed, map)\n                const img = this.json.images[textureDef.source]\n                if (img.uri) {\n                    console.warn('uri already set', img.uri)\n                } else {\n                    img.uri = uri\n                    img.mimeType = mimeType\n                    if (!img.extras) img.extras = {}\n                    img.extras.flipY = map.flipY\n                    img.extras.uri = uri // uri is removed by gltf-transform if bufferView is set\n                }\n            } else {\n                textureDef.source = this.processImageUri(map.image, uri, map.flipY, mimeType)\n            }\n        }\n        if (textureDef.source < 0) {\n            console.error('textureDef.source cannot be saved', textureDef, map)\n            delete textureDef.source // gltf spec allows undefined, not -1\n        } else {\n            const imageDef = json.images ? json.images[textureDef.source] : null\n            if (imageDef) {\n                if (!imageDef.extras) imageDef.extras = {}\n                if (map.source) imageDef.extras.uuid = map.source.uuid\n\n                imageDef.extras.t_uuid = map.uuid // todo: remove when extras supported by gltf-transform: https://github.com/donmccurdy/glTF-Transform/issues/645\n            }\n        }\n\n        // map uuid, extras saved in processSampler.\n\n        return processed\n    }\n\n    // Add extra check for null images. This is set in processTexture when we have a rootPath\n    processImage(image: any, format: PixelFormat, flipY: boolean, mimeType = 'image/png') {\n        if (!image) return -1\n        return super.processImage(image, format, flipY, mimeType, image._savePreview ? 32 : undefined, image._savePreview ? 32 : undefined)\n    }\n\n    /**\n     * Used in GLTFWriter2.processTexture for rootPath. Note that this does not check for options.exporterOptions.embedUrlImages, it must be done separately.\n     * @param image\n     * @param uri\n     * @param flipY\n     * @param mimeType\n     */\n    processImageUri(image: any, uri: string, flipY: boolean, mimeType = 'image/png') {\n\n        const cache = this.cache\n        const json = this.json\n\n        if (!cache.images.has(image)) cache.images.set(image, {})\n\n        const cachedImages = cache.images.get(image)\n\n        const key = mimeType + ':flipY/' + flipY.toString()\n\n        if (cachedImages[ key ] !== undefined) return cachedImages[ key ]\n\n        if (!json.images) json.images = []\n\n        const imageDef: any = {\n            mimeType, uri,\n            extras: {flipY},\n        }\n\n        const index = json.images.push(imageDef) - 1\n        cachedImages[ key ] = index\n        return index\n\n    }\n}\n","import type {GLTF, GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {ObjectLoader} from 'three'\nimport type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\n\nexport class GLTFLightExtrasExtension {\n    static readonly WebGiLightExtrasExtension = 'WEBGI_light_extras'\n\n    /**\n     * Also {@link Export}\n     * @param _\n     */\n    static Import = (_: GLTFParser): GLTFLoaderPlugin =>({\n        name: '__' + this.WebGiLightExtrasExtension, // __ is prefix so that the extension is added to userdata, and we can process later in afterRoot\n        afterRoot: async(result: GLTF) => {\n            const scenes = result.scenes || (result.scene ? [result.scene] : [])\n            scenes.forEach(s=>{\n                s.traverse((o: any)=>{\n                    if (!o.isLight) return\n                    const ext = o.userData?.gltfExtensions?.[this.WebGiLightExtrasExtension]\n                    if (!ext) {\n                        return\n                    }\n\n                    // castShadow is in GLTFObject3DExtrasExtension\n                    if (!o.shadow && ext.shadow) {\n                        console.error('Light has no shadow, cannot import', o, ext)\n                    }\n                    // keep updated with ObjectLoader.js\n                    if (ext.shadow && o.shadow) {\n                        if (ext.shadow.bias !== undefined) o.shadow.bias = ext.shadow.bias\n                        if (ext.shadow.normalBias !== undefined) o.shadow.normalBias = ext.shadow.normalBias\n                        if (ext.shadow.radius !== undefined) o.shadow.radius = ext.shadow.radius\n                        if (ext.shadow.mapSize !== undefined) o.shadow.mapSize.fromArray(ext.shadow.mapSize)\n                        if (ext.shadow.camera !== undefined) {\n                            o.shadow.camera = new ObjectLoader().parseObject(ext.shadow.camera, {}, {}, {}, {})\n                        }\n                    }\n\n                    delete o.userData.gltfExtensions[this.WebGiLightExtrasExtension]\n                })\n            })\n        },\n    })\n\n    /**\n     * Also {@link Import}\n     */\n    static Export = (w: GLTFWriter): GLTFExporterPlugin=> ({\n        writeNode: (object: any, nodeDef: any)=>{\n            if (!object?.isLight) return\n            if (!nodeDef.extensions) nodeDef.extensions = {}\n            const dat: any = {}\n            if (object.shadow) { // castShadow is in GLTFObject3DExtrasExtension\n                dat.shadow = object.shadow.toJSON()\n            }\n            if (Object.keys(dat).length > 0) {\n                nodeDef.extensions[this.WebGiLightExtrasExtension] = dat\n                w.extensionsUsed[this.WebGiLightExtrasExtension] = true\n            }\n        },\n    })\n\n    // see GLTFDracoExportPlugin\n    static Textures: Record<string, string|number>|undefined = undefined\n}\n","import type {GLTF, GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {ThreeSerialization} from '../../utils/serialization'\nimport {Color, DoubleSide, Material} from 'three'\nimport type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {ITexture, LineMaterial2, PhysicalMaterial} from '../../core'\nimport {threeMaterialPropList} from '../../core/material/threeMaterialPropList'\nimport {isNonRelativeUrl} from '../../utils'\n\nexport class GLTFMaterialExtrasExtension {\n    static readonly WebGiMaterialExtrasExtension = 'WEBGI_material_extras'\n\n    /**\n     * for physical material\n     * Also {@link Export}\n     * @param loadConfigResources\n     */\n    static Import = (loadConfigResources: (res: any)=>any)=> (parser: GLTFParser): GLTFLoaderPlugin=>({\n        name: '__' + GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension, // __ is prefix so that the extension is added to userdata, and we can process later in afterRoot\n        afterRoot: async(result: GLTF) => {\n            const scenes = result.scenes || (result.scene ? [result.scene] : [])\n            for (const s of scenes) {\n                const resExt = s.userData?.gltfExtensions?.[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension] // Note: see exporter for details of material extra resources in scene.\n                const resources = resExt?.resources ? await loadConfigResources(resExt.resources) : {}\n\n                s.traverse((obj: any)=>{\n                    const o = obj?.material\n                    if (!o?.isMaterial) return // todo array materials\n                    const ext = o.userData?.gltfExtensions?.[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension]\n                    if (!ext) return\n\n                    // extras from MaterialLoader.js\n\n                    if (ext.emissiveIntensity !== undefined) o.emissiveIntensity = ext.emissiveIntensity // kept for old versions, this is not saved in extras because of KHR_materials_emissive_strength\n                    // bumpMap, displacementMap, lightMap, alphaMap moved to separate extensions\n\n                    // if (material.shininess !== undefined) dat.shininess = material.shininess\n                    if (ext.fog !== undefined) o.fog = ext.fog\n                    if (ext.flatShading !== undefined) o.flatShading = ext.flatShading\n                    if (ext.blending !== undefined) o.blending = ext.blending\n                    // if (ext.combine !== undefined) o.combine = ext.combine\n                    if (ext.side !== undefined) o.side = ext.side\n                    if (ext.shadowSide !== undefined) o.shadowSide = ext.shadowSide\n                    if (ext.depthFunc !== undefined) o.depthFunc = ext.depthFunc\n                    if (ext.depthTest !== undefined) o.depthTest = ext.depthTest\n                    if (ext.depthWrite !== undefined) o.depthWrite = ext.depthWrite\n                    if (ext.colorWrite !== undefined) o.colorWrite = ext.colorWrite\n\n                    if (ext.vertexColors !== undefined) o.vertexColors = ext.vertexColors // this is override, it is also set in GLTFLoader if geometry has vertex colors, todo: check how to do this in a better way\n                    if (ext.alphaTest !== undefined) o.alphaTest = ext.alphaTest\n                    if (ext.alphaHash !== undefined) o.alphaHash = ext.alphaHash\n\n                    // if (ext.transparent !== undefined) o.transparent = ext.transparent // this is set by GLTFLoader based on alpha mode\n\n                    if (ext.envMapIntensity !== undefined) o.envMapIntensity = ext.envMapIntensity // for when separateEnvMapIntensity is true\n                    if (ext.envMapRotation !== undefined && Array.isArray(ext.envMapRotation) && o.envMapRotation?.fromArray) o.envMapRotation.fromArray(ext.envMapRotation)\n                    // if (ext.envMapSlotKey !== undefined) o.envMapSlotKey = ext.envMapSlotKey // in userdata\n\n                    if (ext.blendSrc !== undefined) o.blendSrc = ext.blendSrc\n                    if (ext.blendDst !== undefined) o.blendDst = ext.blendDst\n                    if (ext.blendEquation !== undefined) o.blendEquation = ext.blendEquation\n                    if (ext.blendSrcAlpha !== undefined) o.blendSrcAlpha = ext.blendSrcAlpha\n                    if (ext.blendDstAlpha !== undefined) o.blendDstAlpha = ext.blendDstAlpha\n                    if (ext.blendEquationAlpha !== undefined) o.blendEquationAlpha = ext.blendEquationAlpha\n                    if (ext.blendColor !== undefined && o.blendColor !== undefined) (o.blendColor as Color).setHex(ext.blendColor)\n                    if (ext.blendAlpha !== undefined) o.blendAlpha = ext.blendAlpha\n\n                    if (ext.stencilWrite !== undefined) o.stencilWrite = ext.stencilWrite\n                    if (ext.stencilWriteMask !== undefined) o.stencilWriteMask = ext.stencilWriteMask\n                    if (ext.stencilFunc !== undefined) o.stencilFunc = ext.stencilFunc\n                    if (ext.stencilRef !== undefined) o.stencilRef = ext.stencilRef\n                    if (ext.stencilFuncMask !== undefined) o.stencilFuncMask = ext.stencilFuncMask\n                    if (ext.stencilFail !== undefined) o.stencilFail = ext.stencilFail\n                    if (ext.stencilZFail !== undefined) o.stencilZFail = ext.stencilZFail\n                    if (ext.stencilZPass !== undefined) o.stencilZPass = ext.stencilZPass\n\n                    if (ext.wireframe !== undefined) o.wireframe = ext.wireframe\n                    if (ext.wireframeLinewidth !== undefined) o.wireframeLinewidth = ext.wireframeLinewidth\n                    if (ext.wireframeLinecap !== undefined) o.wireframeLinecap = ext.wireframeLinecap\n                    if (ext.wireframeLinejoin !== undefined) o.wireframeLinejoin = ext.wireframeLinejoin\n\n                    if (ext.rotation !== undefined) o.rotation = ext.rotation\n\n                    if (ext.linewidth !== undefined) o.linewidth = ext.linewidth\n                    if (ext.worldUnits !== undefined) o.worldUnits = ext.worldUnits\n                    if (ext.dashed !== undefined) o.dashed = ext.dashed\n                    if (ext.dashSize !== undefined) o.dashSize = ext.dashSize\n                    if (ext.dashScale !== undefined) o.dashScale = ext.dashScale\n                    if (ext.dashOffset !== undefined) o.dashOffset = ext.dashOffset\n                    if (ext.gapSize !== undefined) o.gapSize = ext.gapSize\n                    if (ext.resolution !== undefined && o.resolution && o.resolution.fromArray) {\n                        o.resolution.fromArray(ext.resolution)\n                    }\n                    // if (ext.scale !== undefined) o.scale = ext.scale\n\n                    if (ext.polygonOffset !== undefined) o.polygonOffset = ext.polygonOffset\n                    if (ext.polygonOffsetFactor !== undefined) o.polygonOffsetFactor = ext.polygonOffsetFactor\n                    if (ext.polygonOffsetUnits !== undefined) o.polygonOffsetUnits = ext.polygonOffsetUnits\n\n                    if (ext.dithering !== undefined) o.dithering = ext.dithering\n\n                    if (ext.alphaToCoverage !== undefined) o.alphaToCoverage = ext.alphaToCoverage\n                    if (ext.premultipliedAlpha !== undefined) o.premultipliedAlpha = ext.premultipliedAlpha\n\n                    // if (ext.visible !== undefined) o.visible = ext.visible\n\n                    if (ext.toneMapped !== undefined) o.toneMapped = ext.toneMapped\n\n                    // we are ignoring the normalScale set from the GLTFLoader, because it is not correct in some cases.\n                    // todo: check if this is still the case\n                    if (ext.normalScale !== undefined && o.normalScale !== undefined) {\n                        if (Array.isArray(ext.normalScale)) o.normalScale.fromArray(ext.normalScale)\n                        else if (typeof ext.normalScale === 'number') o.normalScale.set(ext.normalScale, ext.normalScale)\n                        else console.warn('normalScale is not an array or number', ext.normalScale)\n                    }\n\n                    if (ext.reflectivity !== undefined) o.reflectivity = ext.reflectivity // this is not present in the extras exporter because KHR_materials_ior, todo: kept for backward compatibility, remove ?\n                    // if (ext.refractionRatio !== undefined) o.refractionRatio = ext.refractionRatio\n\n                    // todo forceSinglePass\n\n                    // todo: make extension for these like GLTFMaterialsBumpMapExtension\n                    // if ( ext.gradientMap !== undefined ) o.gradientMap = getTexture( json.gradientMap );\n\n                    Object.entries(ext).forEach(([key, value]: [string, any])=>{\n                        if (key.startsWith('_')) return\n                        if (value && value.resource && typeof value.resource === 'string') {\n                            o[key] = ThreeSerialization.Deserialize(value, o[key], resources)\n                        }\n                    })\n\n                    delete o.userData.gltfExtensions[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension]\n\n                    // legacy bump map scale fix, test model - test model - http://samples.threepipe.org/tests/bumpmap_normalize_migrate.glb\n                    const assetVersion = parser.json?.asset?.version ? parseFloat(parser.json?.asset?.version) : null\n                    // https://github.com/repalash/three.js/commit/7b13bb515866f6a002928bd28d0a793cafeaeb1a\n                    if ((o.userData.legacyBumpScale || assetVersion && assetVersion <= 2.0) && (o as any)?.bumpScale !== undefined && o?.bumpMap && o.defines) {\n                        console.warn('MaterialManager: Old format material loaded, bump map might be incorrect.', o, (o as any).bumpScale)\n                        o.defines.BUMP_MAP_SCALE_LEGACY = '1'\n                        o.userData.legacyBumpScale = true\n                        o.needsUpdate = true\n                    }\n\n                })\n\n                // todo: check for resources that are not used and dispose them? see todo in ThreeViewer.fromJSON\n\n                if (resExt) delete s.userData.gltfExtensions[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension]\n            }\n        },\n    })\n\n    /**\n     * Also see {@link Import}\n     * @param w\n     * @constructor\n     */\n    static Export = (w: GLTFWriter): GLTFExporterPlugin&{materialExternalResources:any, serializedMeta: any}=> ({\n        writeMaterial(material: Material & any, matDef: any) {\n            if (!material?.isMaterial) return\n            if (!matDef.extensions) matDef.extensions = {}\n            const dat: any = {}\n\n            // non-default stuff from MaterialLoader.js\n\n            // hardcode fix for: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see threejs: #21849 and #22000.\n            // not needed anymore.\n            // if (material.emissiveIntensity !== undefined && material.emissive?.isColor) {\n            //     const emissive = material.emissive.clone().multiplyScalar(material.emissiveIntensity)\n            //     const maxEmissiveComponent = Math.max(emissive.r, emissive.g, emissive.b)\n            //     if (maxEmissiveComponent > 1) {\n            //         dat.emissiveIntensity = maxEmissiveComponent\n            //     }\n            // }\n\n            // bumpMap, lightMap, alphaMap moved to separate extensions\n\n            // if (material.shininess !== undefined) dat.shininess = material.shininess\n            if (material.fog !== undefined && material.fog !== PhysicalMaterial.MaterialProperties.fog) dat.fog = material.fog\n            if (material.flatShading !== undefined && material.flatShading !== PhysicalMaterial.MaterialProperties.flatShading) dat.flatShading = material.flatShading\n            if (material.blending !== undefined && material.blending !== threeMaterialPropList.blending) dat.blending = material.blending\n            // if (material.combine !== undefined && material.combine !== threeMaterialPropList.combine) dat.combine = material.combine\n            if (material.side !== undefined && material.side !== DoubleSide) dat.side = material.side // DoubleSide handled in GLTF\n            if (material.shadowSide !== undefined && material.shadowSide !== threeMaterialPropList.shadowSide) dat.shadowSide = material.shadowSide\n            if (material.depthFunc !== undefined && material.depthFunc !== threeMaterialPropList.depthFunc) dat.depthFunc = material.depthFunc\n            if (material.depthTest !== undefined && material.depthTest !== threeMaterialPropList.depthTest) dat.depthTest = material.depthTest\n            if (material.depthWrite !== undefined && material.depthWrite !== threeMaterialPropList.depthWrite) dat.depthWrite = material.depthWrite\n            if (material.colorWrite !== undefined && material.colorWrite !== threeMaterialPropList.colorWrite) dat.colorWrite = material.colorWrite\n\n            if (material.vertexColors !== undefined && material.vertexColors !== threeMaterialPropList.vertexColors) dat.vertexColors = material.vertexColors // this is override, it is also set in GLTFLoader if geometry has vertex colors, todo: check how to do this in a better way\n            if (material.alphaTest !== undefined && material.alphaTest !== threeMaterialPropList.alphaTest) dat.alphaTest = material.alphaTest\n            if (material.alphaHash !== undefined && material.alphaHash !== threeMaterialPropList.alphaHash) dat.alphaHash = material.alphaHash\n\n            if (material.envMapIntensity !== undefined && material.envMapIntensity !== PhysicalMaterial.MaterialProperties.envMapIntensity) dat.envMapIntensity = material.envMapIntensity // for when separateEnvMapIntensity is true\n            if (material.envMapRotation !== undefined && !material.envMapRotation.equals(PhysicalMaterial.MaterialProperties.envMapRotation)) dat.envMapRotation = material.envMapRotation.toArray()\n            // if (material.envMapSlotKey !== undefined && material.envMapSlotKey !== threeMaterialPropList.envMapSlotKey) dat.envMapSlotKey = material.envMapSlotKey // in userData\n\n            if (material.blendSrc !== undefined && material.blendSrc !== threeMaterialPropList.blendSrc) dat.blendSrc = material.blendSrc\n            if (material.blendDst !== undefined && material.blendDst !== threeMaterialPropList.blendDst) dat.blendDst = material.blendDst\n            if (material.blendEquation !== undefined && material.blendEquation !== threeMaterialPropList.blendEquation) dat.blendEquation = material.blendEquation\n            if (material.blendSrcAlpha !== undefined && material.blendSrcAlpha !== threeMaterialPropList.blendSrcAlpha) dat.blendSrcAlpha = material.blendSrcAlpha\n            if (material.blendDstAlpha !== undefined && material.blendDstAlpha !== threeMaterialPropList.blendDstAlpha) dat.blendDstAlpha = material.blendDstAlpha\n            if (material.blendEquationAlpha !== undefined && material.blendEquationAlpha !== threeMaterialPropList.blendEquationAlpha) dat.blendEquationAlpha = material.blendEquationAlpha\n            if (material.blendColor !== undefined && material.blendColor !== threeMaterialPropList.blendColor) dat.blendColor = (material.blendColor as Color).getHex()\n            if (material.blendAlpha !== undefined && material.blendAlpha !== threeMaterialPropList.blendAlpha) dat.blendAlpha = material.blendAlpha\n\n            if (material.stencilWrite !== undefined && material.stencilWrite !== threeMaterialPropList.stencilWrite) dat.stencilWrite = material.stencilWrite\n            if (material.stencilWriteMask !== undefined && material.stencilWriteMask !== threeMaterialPropList.stencilWriteMask) dat.stencilWriteMask = material.stencilWriteMask\n            if (material.stencilFunc !== undefined && material.stencilFunc !== threeMaterialPropList.stencilFunc) dat.stencilFunc = material.stencilFunc\n            if (material.stencilRef !== undefined && material.stencilRef !== threeMaterialPropList.stencilRef) dat.stencilRef = material.stencilRef\n            if (material.stencilFuncMask !== undefined && material.stencilFuncMask !== threeMaterialPropList.stencilFuncMask) dat.stencilFuncMask = material.stencilFuncMask\n            if (material.stencilFail !== undefined && material.stencilFail !== threeMaterialPropList.stencilFail) dat.stencilFail = material.stencilFail\n            if (material.stencilZFail !== undefined && material.stencilZFail !== threeMaterialPropList.stencilZFail) dat.stencilZFail = material.stencilZFail\n            if (material.stencilZPass !== undefined && material.stencilZPass !== threeMaterialPropList.stencilZPass) dat.stencilZPass = material.stencilZPass\n\n            if (material.wireframe !== undefined && material.wireframe !== PhysicalMaterial.MaterialProperties.wireframe) dat.wireframe = material.wireframe\n            if (material.wireframeLinewidth !== undefined && material.wireframeLinewidth !== PhysicalMaterial.MaterialProperties.wireframeLinewidth) dat.wireframeLinewidth = material.wireframeLinewidth\n            if (material.wireframeLinecap !== undefined && material.wireframeLinecap !== PhysicalMaterial.MaterialProperties.wireframeLinecap) dat.wireframeLinecap = material.wireframeLinecap\n            if (material.wireframeLinejoin !== undefined && material.wireframeLinejoin !== PhysicalMaterial.MaterialProperties.wireframeLinejoin) dat.wireframeLinejoin = material.wireframeLinejoin\n\n            if (material.rotation !== undefined) dat.rotation = material.rotation\n\n            if (material.linewidth !== undefined && material.linewidth !== LineMaterial2.MaterialProperties.linewidth) dat.linewidth = material.linewidth\n            if (material.worldUnits !== undefined && material.worldUnits !== LineMaterial2.MaterialProperties.worldUnits) dat.worldUnits = material.worldUnits\n            if (material.dashed !== undefined && material.dashed !== LineMaterial2.MaterialProperties.dashed) dat.dashed = material.dashed\n            if (material.dashSize !== undefined && material.dashSize !== LineMaterial2.MaterialProperties.dashSize) dat.dashSize = material.dashSize\n            if (material.dashScale !== undefined && material.dashScale !== LineMaterial2.MaterialProperties.dashScale) dat.dashScale = material.dashScale\n            if (material.dashOffset !== undefined && material.dashOffset !== LineMaterial2.MaterialProperties.dashOffset) dat.dashOffset = material.dashOffset\n            if (material.gapSize !== undefined && material.gapSize !== LineMaterial2.MaterialProperties.gapSize) dat.gapSize = material.gapSize\n            // if (material.resolution !== undefined && material.resolution.isVector2 && (material.resolution.x !== LineMaterial2.MaterialProperties.resolution.x || material.resolution.y !== LineMaterial2.MaterialProperties.resolution.y)) dat.resolution = material.resolution.toArray()\n            // if (material.scale !== undefined) dat.scale = material.scale\n\n            if (material.polygonOffset !== undefined && material.polygonOffset !== threeMaterialPropList.polygonOffset) dat.polygonOffset = material.polygonOffset\n            if (material.polygonOffsetFactor !== undefined && material.polygonOffsetFactor !== threeMaterialPropList.polygonOffsetFactor) dat.polygonOffsetFactor = material.polygonOffsetFactor\n            if (material.polygonOffsetUnits !== undefined && material.polygonOffsetUnits !== threeMaterialPropList.polygonOffsetUnits) dat.polygonOffsetUnits = material.polygonOffsetUnits\n\n            if (material.dithering !== undefined && material.dithering !== threeMaterialPropList.dithering) dat.dithering = material.dithering\n\n            if (material.alphaToCoverage !== undefined && material.alphaToCoverage !== threeMaterialPropList.alphaToCoverage) dat.alphaToCoverage = material.alphaToCoverage\n            if (material.premultipliedAlpha !== undefined && material.premultipliedAlpha !== threeMaterialPropList.premultipliedAlpha) dat.premultipliedAlpha = material.premultipliedAlpha\n\n            // if (material.visible !== undefined && material.visible !== threeMaterialPropList.visible) dat.visible = material.visible\n\n            if (material.toneMapped !== undefined && material.toneMapped !== threeMaterialPropList.toneMapped) dat.toneMapped = material.toneMapped\n\n            // ignoring data from the GLTFExporter.\n            if (material.normalScale !== undefined && material.normalScale.isVector2 && (material.normalScale.x !== PhysicalMaterial.MaterialProperties.normalScale.x || material.normalScale.y !== PhysicalMaterial.MaterialProperties.normalScale.y)) dat.normalScale = [material.normalScale.x, material.normalScale.y]\n\n            // if (material.reflectivity !== undefined) dat.reflectivity = material.reflectivity // see KHR_materials_ior, and comments in parser.\n\n            // if (material.refractionRatio !== undefined) dat.refractionRatio = material.refractionRatio\n\n            // todo: make extension for this like GLTFMaterialsBumpMapExtension\n            // if ( material.gradientMap !== undefined ) dat.gradientMap = getTexture( json.gradientMap );\n\n            const resources = this.materialExternalResources[material.uuid]\n            if (resources) {\n                Object.entries(resources).forEach(([k, v]: [string, any|ITexture]) => {\n                    if (k.startsWith('_')) return\n                    let setFlag = false\n                    if (v?.userData && v.userData.embedUrlImagePreviews === undefined) { // check ThreeSerialization texture serialization and GLTFWriter2.processTexture\n                        v.userData.embedUrlImagePreviews = w.options.exporterOptions?.embedUrlImagePreviews\n                        setFlag = true\n                    }\n                    dat[k] = ThreeSerialization.Serialize(v, this.serializedMeta)\n                    if (v?.userData && setFlag) delete v.userData.embedUrlImagePreviews\n                })\n            }\n            if (Object.keys(dat).length > 0) {\n                matDef.extensions[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension] = dat\n                w.extensionsUsed[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension] = true\n            }\n        },\n\n        materialExternalResources: {},\n        serializedMeta: {\n            images: {},\n            textures: {},\n        },\n        beforeParse(input) {\n            this.materialExternalResources = {}\n            // externalImagesInExtras: this is required because gltf-transform doesnt support external images in glb\n            // see https://github.com/donmccurdy/glTF-Transform/discussions/644\n            if (!w.options.externalImagesInExtras) return\n            const materials: (Material&any)[] = [];\n            (Array.isArray(input) ? input : [input]).forEach(obj=>{\n                obj?.traverse((o: any)=>{\n                    if (o && o.material?.isMaterial) materials.push(o.material)\n                })\n            })\n            materials.forEach(material=>{\n                if (material) {\n                    if (!this.materialExternalResources[material.uuid])\n                        this.materialExternalResources[material.uuid] = {}\n                    this.materialExternalResources[material.uuid].__materialRef = material\n                    Object.entries(material).forEach(([k, v]: [string, any])=>{\n                        if (k.startsWith('_')) return\n                        if (!v) return\n                        if (!v.isTexture) return\n                        if (\n                            v.userData.rootPath && isNonRelativeUrl(v.userData.rootPath)\n                        ) {\n                            material[k] = null\n                            this.materialExternalResources[material.uuid][k] = v\n                        }\n                    })\n                }\n            })\n        },\n        afterParse(_) {\n            const vals = Object.values(this.materialExternalResources)\n            if (vals.length < 1) return\n            vals.forEach((resources: any)=>{\n                const mat = resources.__materialRef\n                if (!mat) return\n                Object.entries(resources).forEach(([k, v]: [string, any])=>{\n                    if (k.startsWith('_')) return\n                    if (!v) return\n                    mat[k] = v\n                })\n                delete this.materialExternalResources[mat.uuid]\n            })\n            const scene = w.json.scenes[w.json.scene || 0]\n            if (!scene.extensions) scene.extensions = {}\n            scene.extensions[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension] = {\n                resources: this.serializedMeta,\n            }\n            w.extensionsUsed[GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension] = true\n            // console.log(w)\n        },\n    })\n\n    // see GLTFDracoExportPlugin\n    static Textures: Record<string, string|number>|undefined = undefined\n}\n","import type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport type {MeshStandardMaterial} from 'three'\nimport type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\n\n/**\n * Alpha Map Extension\n *\n * alphaTexture is added to the material\n * This is separate from the alpha in base color texture. This is used when that is not supported in the viewer\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_alphamap.html\n */\nexport class GLTFMaterialsAlphaMapExtension {\n    static readonly WebGiMaterialsAlphaMapExtension = 'WEBGI_materials_alphamap'\n    static Import = (parser: GLTFParser): GLTFLoaderPlugin=> new GLTFMaterialsAlphaMapExtensionImport(parser)\n    static Export = (writer: GLTFWriter): GLTFExporterPlugin => new GLTFMaterialsAlphaMapExtensionExport(writer)\n\n    // see GLTFDracoExportPlugin\n    static Textures: Record<string, string|number> = {\n        alphaTexture: 'G',\n    }\n}\n\nclass GLTFMaterialsAlphaMapExtensionImport {\n\n    public name: string\n    constructor(public parser: GLTFParser) {\n\n        this.name = GLTFMaterialsAlphaMapExtension.WebGiMaterialsAlphaMapExtension\n\n    }\n\n    // getMaterialType(materialIndex: number) { // todo: required?\n    //\n    //     const parser = this.parser\n    //     const materialDef = parser.json.materials[ materialIndex ]\n    //\n    //     if (!materialDef.extensions || !materialDef.extensions[ this.name ]) return null\n    //\n    //     return MeshPhysicalMaterial\n    //\n    // }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n\n        const parser = this.parser\n        const materialDef = parser.json.materials[ materialIndex ]\n\n        if (!materialDef.extensions || !materialDef.extensions[ this.name ]) {\n\n            return Promise.resolve()\n\n        }\n\n        const pending = []\n\n        const extension = materialDef.extensions[ this.name ]\n\n        if (extension.alphaTexture !== undefined) {\n\n            pending.push(parser.assignTexture(materialParams, 'alphaMap', extension.alphaTexture))\n\n        }\n\n        return Promise.all(pending)\n\n    }\n\n}\nexport type {GLTFMaterialsAlphaMapExtensionImport}\n\nclass GLTFMaterialsAlphaMapExtensionExport {\n\n    public name: string\n\n    constructor(public writer: GLTFWriter) {\n\n        this.name = GLTFMaterialsAlphaMapExtension.WebGiMaterialsAlphaMapExtension\n\n    }\n\n    writeMaterial(material: MeshStandardMaterial, materialDef: any) {\n\n        if (!material.isMeshStandardMaterial || !material.alphaMap) return\n\n        const writer = this.writer\n        const extensionsUsed = writer.extensionsUsed\n\n        const extensionDef: any = {}\n\n        if (material.alphaMap && writer.checkEmptyMap(material.alphaMap)) {\n\n            const alphaMapDef = {index: writer.processTexture(material.alphaMap)}\n            writer.applyTextureTransform(alphaMapDef, material.alphaMap)\n            extensionDef.alphaTexture = alphaMapDef\n\n        }\n\n        if (!Object.keys(extensionDef)) return\n\n        materialDef.extensions = materialDef.extensions || {}\n        materialDef.extensions[ this.name ] = extensionDef\n\n        extensionsUsed[ this.name ] = true\n\n    }\n\n}\nexport type {GLTFMaterialsAlphaMapExtensionExport}\n","import type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport type {MeshStandardMaterial} from 'three'\nimport type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {PhysicalMaterial} from '../../core'\n\n/**\n * Bump Map Extension\n *\n * bumpTexture and bumpScale are added to the material\n *\n * Note - this is not deprecated as an official KHR extension now exists, but the importer is kept as it's used in many files.\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_bumpmap.html\n */\nexport class GLTFMaterialsBumpMapExtension {\n    static readonly WebGiMaterialsBumpMapExtension = 'WEBGI_materials_bumpmap'\n    static Import = (parser: GLTFParser): GLTFLoaderPlugin=> new GLTFMaterialsBumpMapExtensionImport(parser)\n    static Export = (writer: GLTFWriter): GLTFExporterPlugin => new GLTFMaterialsBumpMapExtensionExport(writer)\n\n    // see GLTFDracoExportPlugin\n    static Textures: Record<string, string|number> = {\n        bumpTexture: 'R',\n    }\n}\n\nclass GLTFMaterialsBumpMapExtensionImport {\n\n    public name: string\n    constructor(public parser: GLTFParser) {\n\n        this.name = GLTFMaterialsBumpMapExtension.WebGiMaterialsBumpMapExtension\n\n    }\n\n    // getMaterialType(materialIndex: number) { // todo: required?\n    //\n    //     const parser = this.parser\n    //     const materialDef = parser.json.materials[ materialIndex ]\n    //\n    //     if (!materialDef.extensions || !materialDef.extensions[ this.name ]) return null\n    //\n    //     return MeshPhysicalMaterial\n    //\n    // }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n\n        const parser = this.parser\n        const materialDef = parser.json.materials[ materialIndex ]\n\n        if (!materialDef.extensions || !materialDef.extensions[ this.name ]) {\n\n            return Promise.resolve()\n\n        }\n\n        const pending = []\n\n        const extension = materialDef.extensions[ this.name ]\n\n        if (extension.bumpScale !== undefined) {\n\n            materialParams.bumpScale = extension.bumpScale\n\n        }\n\n        if (extension.bumpTexture !== undefined) {\n\n            pending.push(parser.assignTexture(materialParams, 'bumpMap', extension.bumpTexture))\n\n        }\n\n        return Promise.all(pending)\n\n    }\n\n}\nexport type {GLTFMaterialsBumpMapExtensionImport}\n\nclass GLTFMaterialsBumpMapExtensionExport {\n\n    public name: string\n\n    constructor(public writer: GLTFWriter) {\n\n        this.name = GLTFMaterialsBumpMapExtension.WebGiMaterialsBumpMapExtension\n\n    }\n\n    writeMaterial(material: MeshStandardMaterial, materialDef: any) {\n\n        if (!material.isMeshStandardMaterial || material.bumpScale === 0) return\n\n        const writer = this.writer\n        const extensionsUsed = writer.extensionsUsed\n\n        const extensionDef: any = {}\n\n        if (material.bumpScale !== PhysicalMaterial.MaterialProperties.bumpScale)\n            extensionDef.bumpScale = material.bumpScale\n\n        if (material.bumpMap && writer.checkEmptyMap(material.bumpMap)) {\n\n            const bumpMapDef = {index: writer.processTexture(material.bumpMap)}\n            writer.applyTextureTransform(bumpMapDef, material.bumpMap)\n            extensionDef.bumpTexture = bumpMapDef\n\n        }\n\n        if (!Object.keys(extensionDef)) return\n\n        materialDef.extensions = materialDef.extensions || {}\n        materialDef.extensions[ this.name ] = extensionDef\n\n        extensionsUsed[ this.name ] = true\n\n    }\n\n}\nexport type {GLTFMaterialsBumpMapExtensionExport}\n","import type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport type {MeshStandardMaterial} from 'three'\nimport type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {PhysicalMaterial} from '../../core'\n\n/**\n * Displacement Map Extension\n *\n * displacementTexture and displacementScale are added to the material\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_displacementmap.html\n */\nexport class GLTFMaterialsDisplacementMapExtension {\n    static readonly WebGiMaterialsDisplacementMapExtension = 'WEBGI_materials_displacementmap'\n    static Import = (parser: GLTFParser): GLTFLoaderPlugin=> new GLTFMaterialsDisplacementMapExtensionImport(parser)\n    static Export = (writer: GLTFWriter): GLTFExporterPlugin => new GLTFMaterialsDisplacementMapExtensionExport(writer)\n\n    // see GLTFDracoExportPlugin\n    static Textures: Record<string, string|number> = {\n        displacementTexture: 'R',\n    }\n}\n\nclass GLTFMaterialsDisplacementMapExtensionImport {\n\n    public name: string\n    constructor(public parser: GLTFParser) {\n\n        this.name = GLTFMaterialsDisplacementMapExtension.WebGiMaterialsDisplacementMapExtension\n\n    }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n\n        const parser = this.parser\n        const materialDef = parser.json.materials[ materialIndex ]\n\n        if (!materialDef.extensions || !materialDef.extensions[ this.name ]) {\n\n            return Promise.resolve()\n\n        }\n\n        const pending = []\n\n        const extension = materialDef.extensions[ this.name ]\n\n        if (extension.displacementScale !== undefined) {\n\n            materialParams.displacementScale = extension.displacementScale\n\n        }\n        if (extension.displacementBias !== undefined) {\n\n            materialParams.displacementBias = extension.displacementBias\n\n        }\n\n        if (extension.displacementTexture !== undefined) {\n\n            pending.push(parser.assignTexture(materialParams, 'displacementMap', extension.displacementTexture))\n\n        }\n\n        return Promise.all(pending)\n\n    }\n\n}\nexport type {GLTFMaterialsDisplacementMapExtensionImport}\n\nclass GLTFMaterialsDisplacementMapExtensionExport {\n\n    public name: string\n\n    constructor(public writer: GLTFWriter) {\n\n        this.name = GLTFMaterialsDisplacementMapExtension.WebGiMaterialsDisplacementMapExtension\n\n    }\n\n    writeMaterial(material: MeshStandardMaterial, materialDef: any) {\n\n        if (!material.isMeshStandardMaterial || material.displacementScale === 0) return\n\n        const writer = this.writer\n        const extensionsUsed = writer.extensionsUsed\n\n        const extensionDef: any = {}\n\n        if (material.displacementScale !== PhysicalMaterial.MaterialProperties.displacementScale)\n            extensionDef.displacementScale = material.displacementScale\n\n        if (material.displacementBias !== PhysicalMaterial.MaterialProperties.displacementBias)\n            extensionDef.displacementBias = material.displacementBias\n\n        if (material.displacementMap && writer.checkEmptyMap(material.displacementMap)) {\n\n            const displacementMapDef = {index: writer.processTexture(material.displacementMap)}\n            writer.applyTextureTransform(displacementMapDef, material.displacementMap)\n            extensionDef.displacementTexture = displacementMapDef\n\n        }\n\n        if (!Object.keys(extensionDef)) return\n\n        materialDef.extensions = materialDef.extensions || {}\n        materialDef.extensions[ this.name ] = extensionDef\n\n        extensionsUsed[ this.name ] = true\n\n    }\n\n}\nexport type {GLTFMaterialsDisplacementMapExtensionExport}\n","import type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport type {MeshStandardMaterial} from 'three'\nimport type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {PhysicalMaterial} from '../../core'\n\n/**\n * Light Map Extension\n *\n * lightMapTexture and lightMapIntensity are added to the material\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_lightmap.html\n */\nexport class GLTFMaterialsLightMapExtension {\n    static readonly WebGiMaterialsLightMapExtension = 'WEBGI_materials_lightmap'\n    static Import = (parser: GLTFParser): GLTFLoaderPlugin=> new GLTFMaterialsLightMapExtensionImport(parser)\n    static Export = (writer: GLTFWriter): GLTFExporterPlugin => new GLTFMaterialsLightMapExtensionExport(writer)\n\n    // see GLTFDracoExportPlugin\n    static Textures: Record<string, string|number> = {\n        lightMapTexture: 'RGB',\n    }\n}\n\nclass GLTFMaterialsLightMapExtensionImport {\n\n    public name: string\n    constructor(public parser: GLTFParser) {\n\n        this.name = GLTFMaterialsLightMapExtension.WebGiMaterialsLightMapExtension\n\n    }\n\n    // getMaterialType(materialIndex: number) { // todo: required?\n    //\n    //     const parser = this.parser\n    //     const materialDef = parser.json.materials[ materialIndex ]\n    //\n    //     if (!materialDef.extensions || !materialDef.extensions[ this.name ]) return null\n    //\n    //     return MeshPhysicalMaterial\n    //\n    // }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n\n        const parser = this.parser\n        const materialDef = parser.json.materials[ materialIndex ]\n\n        if (!materialDef.extensions || !materialDef.extensions[ this.name ]) {\n\n            return Promise.resolve()\n\n        }\n\n        const pending = []\n\n        const extension = materialDef.extensions[ this.name ]\n\n        if (extension.lightMapIntensity !== undefined) {\n\n            materialParams.lightMapIntensity = extension.lightMapIntensity\n\n        }\n\n        if (extension.lightMapTexture !== undefined) {\n\n            pending.push(parser.assignTexture(materialParams, 'lightMap', extension.lightMapTexture))\n\n        }\n\n        return Promise.all(pending)\n\n    }\n\n}\nexport type {GLTFMaterialsLightMapExtensionImport}\n\nclass GLTFMaterialsLightMapExtensionExport {\n\n    public name: string\n\n    constructor(public writer: GLTFWriter) {\n\n        this.name = GLTFMaterialsLightMapExtension.WebGiMaterialsLightMapExtension\n\n    }\n\n    writeMaterial(material: MeshStandardMaterial, materialDef: any) {\n\n        if (!material.isMeshStandardMaterial || material.lightMapIntensity === 0) return\n\n        const writer = this.writer\n        const extensionsUsed = writer.extensionsUsed\n\n        const extensionDef: any = {}\n\n        if (material.lightMapIntensity !== PhysicalMaterial.MaterialProperties.lightMapIntensity)\n            extensionDef.lightMapIntensity = material.lightMapIntensity\n\n        if (material.lightMap && writer.checkEmptyMap(material.lightMap)) {\n\n            const lightMapDef = {index: writer.processTexture(material.lightMap)}\n            writer.applyTextureTransform(lightMapDef, material.lightMap)\n            extensionDef.lightMapTexture = lightMapDef\n\n        }\n\n        if (!Object.keys(extensionDef)) return\n\n        materialDef.extensions = materialDef.extensions || {}\n        materialDef.extensions[ this.name ] = extensionDef\n\n        extensionsUsed[ this.name ] = true\n\n    }\n\n}\nexport type {GLTFMaterialsLightMapExtensionExport}\n","import type {GLTF, GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport type {Object3D} from 'three'\nimport type {GLTFExporterPlugin, GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\n\nexport class GLTFObject3DExtrasExtension {\n    static readonly WebGiObject3DExtrasExtension = 'WEBGI_object3d_extras'\n\n    /**\n     * Also {@link Export}\n     * @param _\n     */\n    static Import = (_: GLTFParser): GLTFLoaderPlugin =>({\n        name: '__' + this.WebGiObject3DExtrasExtension, // __ is prefix so that the extension is added to userdata, and we can process later in afterRoot\n        afterRoot: async(result: GLTF) => {\n            const scenes = result.scenes || (result.scene ? [result.scene] : [])\n            scenes.forEach(s=>{\n                s.traverse((o: any)=>{\n                    if (!o || !o.isObject3D) return\n                    const ext = o.userData?.gltfExtensions?.[this.WebGiObject3DExtrasExtension]\n                    if (!ext) {\n                        if (o.isLight && !o.isAmbientLight) o.castShadow = true\n                        return\n                    }\n\n                    // if this extension is set, we use default (false) if not seet in ext. see the Export func.\n                    const hasShadowDef = true\n                    o.castShadow = ext.castShadow ?? false\n                    o.receiveShadow = ext.receiveShadow ?? false\n                    if (ext.visible !== undefined) o.visible = ext.visible\n                    if (ext.frustumCulled !== undefined) o.frustumCulled = ext.frustumCulled\n                    if (ext.renderOrder !== undefined) o.renderOrder = ext.renderOrder\n                    // if (ext.userData !== undefined) o.userData = ext.userData\n                    if (ext.layers !== undefined) o.layers.mask = ext.layers\n\n                    if (hasShadowDef) {\n                        o.userData.__keepShadowDef = true\n                    }\n\n                    delete o.userData.gltfExtensions[this.WebGiObject3DExtrasExtension]\n\n                })\n            })\n        },\n    })\n\n    /**\n     * Also {@link Import}\n     * @param w\n     * @constructor\n     */\n    static Export = (w: GLTFWriter): GLTFExporterPlugin => ({\n        writeNode: (object: Object3D, nodeDef: any)=>{\n            if (!object?.isObject3D) return\n            if (!nodeDef.extensions) nodeDef.extensions = {}\n            const dat: any = {}\n\n            // non-default stuff from ObjectLoader.js\n\n            if (object.castShadow !== undefined && object.castShadow) dat.castShadow = object.castShadow\n            if (object.receiveShadow !== undefined && object.receiveShadow) dat.receiveShadow = object.receiveShadow\n            if (object.visible === false) dat.visible = false\n            if (object.frustumCulled === false) dat.frustumCulled = false\n            if (object.renderOrder !== 0) dat.renderOrder = object.renderOrder\n            if (object.layers.mask !== 1) dat.layers = object.layers.mask\n            if (object.matrixAutoUpdate === false) dat.matrixAutoUpdate = false\n\n            if (Object.keys(dat).length > 0) {\n                nodeDef.extensions[this.WebGiObject3DExtrasExtension] = dat\n                w.extensionsUsed[this.WebGiObject3DExtrasExtension] = true\n            }\n        },\n    })\n\n    // see GLTFDracoExportPlugin\n    static Textures: Record<string, string|number>|undefined = undefined\n}\n","import {\n    DataTexture,\n    DataUtils,\n    FileLoader,\n    FloatType,\n    HalfFloatType,\n    LinearFilter,\n    LoadingManager,\n    RGBAFormat,\n    SRGBColorSpace,\n    TextureDataType,\n} from 'three'\nimport {imageUrlToImageData} from 'ts-browser-helpers'\n\n/**\n * 8bit HDR image in png format\n * not properly working with files from hdrpng.js but used in {@link GLTFViewerConfigExtension}, so a slightly modified version is used here\n */\nexport class RGBEPNGLoader extends FileLoader {\n    type: TextureDataType = HalfFloatType\n    constructor(manager?: LoadingManager) {\n        super(manager)\n    }\n    async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<any> {\n        const image = await this.parseAsync(url, onProgress, false)\n        const texture = new DataTexture(image.data, image.width, image.height, RGBAFormat, this.type)\n        texture.needsUpdate = true\n        texture.flipY = true\n        texture.colorSpace = SRGBColorSpace\n        texture.minFilter = LinearFilter\n        texture.magFilter = LinearFilter\n        texture.source.data.complete = true\n        return texture\n    }\n    async parseAsync(url: string, onProgress?: (event: ProgressEvent) => void, isFloat16Data = false): Promise<any> {\n        let created = false\n        if (!url.startsWith('data:') && !url.startsWith('blob:')) {\n            this.responseType = 'blob'\n            const blob = await super.loadAsync(url, onProgress) as any as Blob\n            // url = await blobToDataURL(blob)\n            // console.log(url)\n            // url = url.replace('application/octet-stream', 'image/png')\n            url = URL.createObjectURL(blob)\n            created = true\n        }\n        const imageData = await imageUrlToImageData(url)\n        if (created) URL.revokeObjectURL(url)\n        let aType: any = Uint8Array\n        if (this.type === HalfFloatType) aType = Uint16Array\n        else if (this.type === FloatType) aType = Float32Array\n        const buffer = rgbeToHalfFloat(imageData.data, 4, aType, isFloat16Data)\n        return {data: buffer, width: imageData.width, height: imageData.height}\n    }\n    setDataType(value: TextureDataType) {\n        this.type = value\n        return this\n    }\n}\n\n// adapted from https://github.com/enkimute/hdrpng.js/blob/3a62b3ae2940189777df9f669df5ece3e78d9c16/hdrpng.js#L253\n// channels = 4 for RGBA data or 3 for RGB data. res to use with THREE.DataTexture\nfunction rgbeToHalfFloat(buffer: Uint8ClampedArray, channels = 3, type = Uint16Array, float16Data = false): Uint16Array {\n    let s\n    const l = buffer.byteLength >> 2\n    const res = new type(l * channels)\n    for (let i = 0;i < l;i++) {\n        s = Math.pow(2, buffer[i * 4 + 3] - (128 + 8))\n        if (float16Data) {\n            res[ i * channels ] = Math.min(buffer[i * 4] * s, 65504)\n            res[ i * channels + 1] = Math.min(buffer[i * 4 + 1] * s, 65504)\n            res[ i * channels + 2] = Math.min(buffer[i * 4 + 2] * s, 65504)\n        } else {\n            res[i * channels] = DataUtils.toHalfFloat(Math.min(buffer[i * 4] * s, 65504))\n            res[i * channels + 1] = DataUtils.toHalfFloat(Math.min(buffer[i * 4 + 1] * s, 65504))\n            res[i * channels + 2] = DataUtils.toHalfFloat(Math.min(buffer[i * 4 + 2] * s, 65504))\n        }\n        // res[i * channels] = Math.min(15360, buffer[i * 4] * s)\n        // res[i * channels + 1] = Math.min(15360, buffer[i * 4 + 1] * s)\n        // res[i * channels + 2] = Math.min(15360, buffer[i * 4 + 2] * s)\n        if (channels === 4) res[i * channels + 3] = DataUtils.toHalfFloat(1) // alpha is always 1 // todo: handle for uint8 and float32\n    }\n    return res\n}\n\n\n","import type {GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport type {GLTFWriter} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {ISerializedViewerConfig, ThreeViewer} from '../../viewer'\nimport {Group, ImageUtils} from 'three'\nimport {RGBEPNGLoader} from '../import/RGBEPNGLoader'\nimport {SerializationMetaType, SerializationResourcesType} from '../../utils'\nimport {RootSceneImportResult} from '../IAssetImporter'\nimport {halfFloatToRgbe} from '../../three'\nimport {GLTFWriter2} from '../export'\n\nexport class GLTFViewerConfigExtension {\n\n    static readonly ViewerConfigGLTFExtension = 'WEBGI_viewer'\n\n    // region Import\n    /**\n     * Import viewer config from glTF(exported from {@link GLTFViewerConfigExtension.ExportViewerConfig}) and sets in scene.importedViewerConfig\n     * Must be called from afterRoot in gltf loader. Used in {@link GLTFLoader2.setup}\n     * Only imports, does not apply.\n     * @param parser\n     * @param viewer\n     * @param resultScenes\n     * @param scene\n     */\n    static async ImportViewerConfig(parser: GLTFParser, viewer: ThreeViewer, resultScenes: Group[], scene?: any): Promise<Partial<ISerializedViewerConfig>> {\n        if (!scene) {\n            const scenes = (parser.json.scenes as Group[]) || []\n            if (scenes.length !== 1) {\n                for (const scene1 of scenes) {\n                    const i = scenes.indexOf(scene1)\n                    await this.ImportViewerConfig(parser, viewer, i >= 0 ? [resultScenes[i]] : resultScenes, scene1)\n                }\n                return {}\n            }\n            scene = scenes[0]\n        }\n        const resultScene = resultScenes.length > 0 ? resultScenes[0] : undefined\n\n        const viewerConfig1: Partial<ISerializedViewerConfig> = scene.extensions?.[this.ViewerConfigGLTFExtension]\n        // console.log({...viewerConfig?.resources})\n\n        if (!viewerConfig1) return {}\n\n        const viewerConfig: ISerializedViewerConfig = {\n            type: 'ThreeViewer',\n            version: '0',\n            plugins: [],\n            assetType: 'config',\n            ...viewerConfig1,\n        }\n        if (viewerConfig.resources) {\n            viewerConfig.resources = await this.ImportResources(viewerConfig.resources, parser, viewer)\n        }\n\n        if (resultScene) (resultScene as RootSceneImportResult).importedViewerConfig = viewerConfig\n\n        return viewerConfig\n    }\n\n    static async ImportResources(resources: Partial<SerializationResourcesType>, parser: GLTFParser, viewer: ThreeViewer): Promise<any> {\n        if (resources.__isLoadedResources) return resources\n        await this._parseArrayBuffers(resources, parser)\n\n        // Find empty resources and try to find them in the glTF as a dependency by saved UUID.\n        const extraResources = await this._parseExtraResources(resources, parser, viewer)\n\n        return await viewer.loadConfigResources(resources || {}, extraResources)\n    }\n\n    /**\n     * Find resources in parser from uuid\n     * @param currentResources\n     * @param parser\n     * @param viewer\n     * @private\n     */\n    private static async _parseExtraResources(currentResources: {textures?: Record<string, any>, materials?: Record<string, any>}, parser: GLTFParser, viewer: ThreeViewer) {\n        const extraResources: any = {\n            textures: {},\n            materials: {},\n        }\n\n        if (currentResources.textures && parser.json.textures)\n            for (const [uuid, texture] of [...Object.entries(currentResources.textures)]) {\n                // console.log(texture) // todo: texture should be {} but its {userData:undefined}, why?\n                if ((texture as any).uuid || !uuid) continue\n                delete currentResources.textures[uuid]\n\n                const texIndex = parser.json.textures.findIndex((t: any) =>\n                    t.extras?.uuid === uuid ||\n                    parser.json.samplers?.[t.sampler]?.extras?.uuid === uuid ||\n                    parser.json.images?.[t.source]?.extras?.t_uuid === uuid\n                )\n                // This HAS To be called from afterRoot in gltf loader.\n                // And make sure that texture is not cloned in any gltf extension like khr_texture_transform, which happens in three.js by default and it's commented in custom fork.\n                if (texIndex >= 0)\n                    extraResources.textures[uuid] = await parser.getDependency('texture', texIndex)\n            }\n\n        // todo: need to test, because materials are also cloned in GLTFLoader.js\n        if (currentResources.materials && parser.json.materials)\n            for (const [uuid, material] of [...Object.entries(currentResources.materials)]) {\n                // console.log(material)\n                if ((material as any).uuid || !uuid) continue\n                delete currentResources.materials[uuid]\n\n                const matIndex = parser.json.materials.findIndex((m: any) => m.extras?.uuid === uuid)\n                if (matIndex >= 0) {\n                    const mat = await parser.getDependency('material', matIndex)\n                    extraResources.materials[uuid] = viewer.assetManager.materials.convertToIMaterial(mat)\n                }\n            }\n\n        // todo: do same for other dependencies?\n        return extraResources\n    }\n\n    private static async _parseArrayBuffers(resources: Partial<SerializationResourcesType>, parser: GLTFParser) {\n        const buffers: any = []\n        Object.values(resources).forEach((res: any) => {\n            Object.values(res).forEach((item: any) => {\n                if (!item.url) return\n                if (item.url.type === 'Uint16Array' && item.url.data) {\n                    // item.url.data = new Uint16Array(item.url.data)\n                    buffers.push(item.url)\n                }\n                if (item.url.type === 'Uint8Array' && item.url.data) {\n                    // item.url.data = new Uint8Array(item.url.data)\n                    buffers.push(item.url)\n                }\n            })\n        })\n\n        for (const buff of buffers) {\n            const imgIndex = buff.data.image\n            const img = parser.json.images[imgIndex]\n            const bufferView = await parser.getDependency('bufferView', img.bufferView)\n\n            // todo: add more checks\n            if (img.mimeType.startsWith('image/') && buff.type === 'Uint16Array' && buff.encoding === 'rgbe') {\n                // todo: find a optimal way, this has too many cross conversions\n                // const view2 = (bufferView as ArrayBuffer).slice(0, bufferView.byteLength - 4)\n\n                const blob = new Blob([bufferView])\n                // const blob2 = new Blob([await blob.text()], {type: img.mimeType})\n                let url = URL.createObjectURL(blob)\n                const encodingVersion = buff.encodingVersion || 1\n                if (encodingVersion < 2) {\n                    url = 'data:image/png;base64,' + btoa(await blob.text())\n                }\n                // fetch(url).then(async r=>r.blob()).then(b=>console.log(b))\n                // console.log(view2)\n                buff.data = (await new RGBEPNGLoader().parseAsync(url, undefined, encodingVersion < 3)).data\n                URL.revokeObjectURL(url)\n                delete buff.encoding\n                delete buff.encodingVersion\n            } else {\n                buff.data = bufferView\n            }\n        }\n    }\n\n    // endregion\n\n    // region Export\n\n    /**\n     * Export viewer config to glTF(can be imported by {@link GLTFViewerConfigExtension.ImportViewerConfig}).\n     * Used in {@link GLTFExporter2}\n     * @param viewer\n     * @param writer\n     * @constructor\n     */\n    static ExportViewerConfig(viewer: ThreeViewer, writer: GLTFWriter2) {\n        const itemCount = Object.entries(writer.serializationMeta).reduce((acc, res) => acc + (res[0].startsWith('_') ? 0 : Object.keys(res[1]).length), 0)\n        const meta = itemCount ? writer.serializationMeta : undefined\n        const viewerData = viewer.toJSON(true, undefined, meta)\n\n        const scene = writer.json.scenes[writer.json.scene || 0]\n        if (!scene.extensions) scene.extensions = {}\n        writer.extensionsUsed[this.ViewerConfigGLTFExtension] = true\n        scene.extensions[this.ViewerConfigGLTFExtension] = viewerData\n\n        const resources = viewerData.resources\n        if (!resources) return undefined\n        GLTFViewerConfigExtension.BundleExtraResources(writer.json, resources)\n        GLTFViewerConfigExtension.BundleArrayBuffers(resources, writer)\n\n        if (meta) { // it will be saved in the GLTF.asset.extras\n            delete viewerData.resources\n            return resources\n        }\n        return undefined\n    }\n\n    static BundleArrayBuffers(resources: Partial<SerializationMetaType>, writer: GLTFWriter) {\n        // For DataTextures like env map with custom rgbe encoding\n        // Create objects of TypedArray\n        const buffers: any = []\n        Object.entries(resources).forEach(([key, res]: [string, any]) => {\n            if (key.startsWith('_')) return\n            if (res) Object.values(res).forEach((item: any) => {\n                if (!item.url) return\n                if (item.url.type === 'Uint16Array' && item.url.data) {\n                    if (!(item.url.data instanceof Uint16Array)) item.url.data = new Uint16Array(item.url.data)\n                    buffers.push(item.url)\n                }\n                if (item.url.type === 'Uint8Array' && item.url.data) {\n                    if (!(item.url.data instanceof Uint8Array)) item.url.data = new Uint8Array(item.url.data)\n                    buffers.push(item.url) // todo: just use jpeg or PNG for this\n                }\n            })\n        })\n        // console.log(writer)\n        for (const buffer of buffers) {\n            // todo:[update: done one case below] check if buffer is of image, if yes convert to rgbe with png compression blob. [or this can be done while serializing the DataTexture]\n\n            let mime = 'application/octet-stream'\n            if (buffer.mimeType) mime = buffer.mimeType\n            // console.log(buffer, buffer.data)\n            const encodeUint16Rgbe = writer.options.exporterOptions.encodeUint16Rgbe // disabled for now, todo: add a UI option to enable this\n            if (encodeUint16Rgbe && buffer.type === 'Uint16Array' && buffer.width > 0 && buffer.height > 0) { // import for this is handled in gltf.ts:importViewer.\n                // todo: also check if this is indeed an hdr image or something else like LUT or other kind of embedded file.\n\n                const encodingVersion: any = 3\n\n                // todo: can we optimize this? this is too many steps\n                const d = encodingVersion < 3 ? halfFloatToRgbe2(buffer.data, 4) : halfFloatToRgbe(buffer.data, 4)\n                const id = new ImageData(d, buffer.width, buffer.height)\n\n                const b64 = ImageUtils.getDataURL(id, true).split(',')[1]\n\n                mime = 'image/png'\n                if (encodingVersion === 1) {\n                    buffer.data = atob(b64)\n                } else if (encodingVersion === 2 || encodingVersion === 3) {\n                    buffer.data = Uint8Array.from(atob(b64), c => c.charCodeAt(0))\n                } else {\n                    throw new Error('Invalid encoding version')\n                }\n                buffer.encoding = 'rgbe'\n                buffer.encodingVersion = encodingVersion\n            }\n            // console.log(mime, buffer)\n\n            // const blob = new Blob([buffer.data], {type: mime})\n            if (!writer.json.images) writer.json.images = []\n            const img: any = {\n                mimeType: mime,\n            }\n            // console.log(buffer, img)\n            const imgIndex = writer.json.images.push(img) - 1\n            const data = buffer.data\n            img.bufferView = writer.processBufferViewImageBuffer(data)\n            // console.log(buffer)\n            buffer.data = {image: imgIndex}\n\n        }\n    }\n\n    /**\n     * Find the resources that are in the viewer config AND in writer.json and use the ones in writer and remove from viewer Config.\n     * For now (for the lack of a better way) we can let the resources be exported twice and removed from resources. Overhead will be just for some images.\n     * @param json\n     * @param resources\n     * @private\n     */\n    static BundleExtraResources(json: GLTFWriter['json'], resources: Partial<SerializationMetaType>) {\n        const {textures, materials} = resources\n        if (json.textures && json.samplers && json.images && textures)\n            [...Object.entries(textures)].forEach(([uuid, texture]: [string, any]) => {\n                const tex = json.textures.find((t: any) => // find same texture in gltf writer\n                    t.extras?.uuid === uuid ||\n                    json.samplers[t.sampler]?.extras?.uuid === uuid ||\n                    json.images[t.source]?.extras?.t_uuid === uuid // todo: remove t_uuid when sampler extras supported by gltf-transform: https://github.com/donmccurdy/glTF-Transform/issues/645\n                )\n                if (!tex) return\n                // console.log('Removing texture', uuid, tex, texture)\n                if (texture.image && resources.images && resources.images[texture.image]) {\n                    delete resources.images[texture.image] // assuming images are only referenced once.\n                }\n                textures[uuid] = {} // set to empty, can be read from the gltf data after loading gltf\n            })\n\n        // todo: test\n        if (json.materials && materials)\n            [...Object.entries(materials)].forEach(([uuid, _]: [string, any]) => {\n                const mat = json.materials.find((m: any) => m.extras?.uuid === uuid) // same material in gltf writer\n                if (!mat) return\n                materials[uuid] = {} // set to empty, can be read from the gltf data after loading gltf\n            })\n\n        // todo: do same for object references?\n    }\n\n    // endregion\n\n}\n\n/**\n * @deprecated old version. see {@link halfFloatToRgbe} to convert half float buffer to rgbe\n * adapted from https://github.com/enkimute/hdrpng.js/blob/3a62b3ae2940189777df9f669df5ece3e78d9c16/hdrpng.js#L235\n * channels = 4 for RGBA data or 3 for RGB data. buffer from THREE.DataTexture\n * @param buffer\n * @param channels\n * @param res\n */\nfunction halfFloatToRgbe2(buffer: Uint16Array, channels = 3, res?: Uint8ClampedArray): Uint8ClampedArray {\n    let r, g, b, v, s\n    const l = buffer.byteLength / (channels * 2) | 0\n    res = res || new Uint8ClampedArray(l * 4)\n    for (let i = 0;i < l;i++) {\n        r = buffer[i * channels]; g = buffer[i * channels + 1]; b = buffer[i * channels + 2]\n        v = Math.max(Math.max(r, g), b)\n        const e = Math.ceil(Math.log2(v)); s = Math.pow(2, e - 8)\n        res[i * 4] = r / s | 0\n        res[i * 4 + 1] = g / s | 0\n        res[i * 4 + 2] = b / s | 0\n        res[i * 4 + 3] = e + 128\n    }\n    return res\n}\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example  path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError, url );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetDDSLoader() {\n\n\t\tthrow new Error(\n\n\t\t\t'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".'\n\n\t\t);\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError, url ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\nGLTFLoader.ObjectConstructors = {\n\t'DirectionalLight': DirectionalLight,\n\t'PointLight': PointLight,\n\t'SpotLight': SpotLight,\n\t'MeshStandardMaterial': MeshStandardMaterial,\n\t'MeshBasicMaterial': MeshBasicMaterial,\n\t'MeshPhysicalMaterial': MeshPhysicalMaterial,\n\t'LineBasicMaterial': LineBasicMaterial,\n\t'PointsMaterial': PointsMaterial,\n\t'PerspectiveCamera': PerspectiveCamera,\n\t'OrthographicCamera': OrthographicCamera\n};\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new GLTFLoader.ObjectConstructors.DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new GLTFLoader.ObjectConstructors.PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new GLTFLoader.ObjectConstructors.SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( materialDef.extras && materialDef.extras.sheenFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheen = materialDef.extras.sheenFactor;\n\t\t\tdelete materialDef.extras.sheenFactor; // so that it doesn't get into userData.\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\tinstancedMesh.sourceTrs = attributes;\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tif ( ! texture.__hasGLTFUuid ) // uuid of the sampler not considered in this texture, so we can clone.\n\t\t\ttexture = texture.clone(); // Its done always in default three.js,\n\t\t// todo: why?. this will create a new uuid and break texture caching. Uncommenting will break mapdef copy in webgi manager importViewer\n\t\t// answer - this is actually done because samplers can be different for textures with the same source on different objects\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\t\t\t// texture.center.set( 0.5, 0.5 ); // todo: texture center is not saved in gltf.\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t//   [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t                        // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new GLTFLoader.ObjectConstructors.MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry|AnimationClip} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( navigator.userAgent ) === true;\n\t\t\tisFirefox = navigator.userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? navigator.userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || isSafari || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tif ( textureIndex < 0 || textureIndex >= json.textures.length ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid texture index:', textureIndex );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\n\t\tif ( sourceIndex < 0 || sourceIndex >= json.images.length ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid source index:', sourceIndex );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\t// texture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tif ( sampler.extras ) {\n\n\t\t\t\tif ( sampler.extras.uuid !== undefined ) {\n\n\t\t\t\t\ttexture.uuid = sampler.extras.uuid;\n\t\t\t\t\ttexture.__hasGLTFUuid = true; // this is read in GLTFTextureTransformExtension.extendTexture\n\t\t\t\t\t// delete sampler.extras.uuid; // do not delete this. It can be read for finding texture references by uuid in after parse. Also sampler extras is not copied to user data so no problem.\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\t// do not call this from any extension.\n\tloadImageSource( sourceIndex, loader, preferUri = false, skipCache = false ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! skipCache && this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tif ( sourceDef.uri === undefined && sourceDef.extras && sourceDef.extras.uri ) {\n\n\t\t\tsourceDef.uri = sourceDef.extras.uri;\n\n\t\t}\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\t\tlet sourceBlob = null;\n\n\t\tif ( sourceDef.bufferView !== undefined && ( ! preferUri || ! sourceURI ) ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\tsourceBlob = blob;\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, function ( e ) {\n\n\t\t\t\t\tif ( loader.isImageBitmapLoader === true ) { // special check in-case ImageBitmapLoader fails, like with loading SVGs\n\n\t\t\t\t\t\tloader = new TextureLoader( parser.options.manager ); // todo: instead get handler from loading manager, so that we can load HDR files also\n\t\t\t\t\t\tonLoad = resolve; // reset from override done above for ImageBitmapLoader\n\t\t\t\t\t\tloader.setCrossOrigin( parser.options.crossOrigin );\n\t\t\t\t\t\tloader.setRequestHeader( parser.options.requestHeader );\n\t\t\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t\t\t} else reject( e );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( sourceDef.extras ) {\n\n\t\t\t\tif ( sourceDef.extras.flipY !== undefined ) { // we still need to handle this for externally loaded textures, which cannot be flipped during export\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/16144\n\t\t\t\t\tif ( loader.isImageBitmapLoader === true && typeof createImageBitmap !== undefined ) {\n\n\t\t\t\t\t\tlet t1 = texture;\n\t\t\t\t\t\tconst flip = sourceDef.extras.flipY && ! t1.flipY;\n\t\t\t\t\t\tcreateImageBitmap( t1.source.data, {\n\t\t\t\t\t\t\timageOrientation: flip ? 'flipY' : 'none',\n\t\t\t\t\t\t} ).then( function ( imageBitmap ) { // this is a terrible hack, todo: find a better way\n\n\t\t\t\t\t\t\tif ( t1._newTex ) t1 = t1._newTex; // search for _newTex below\n\t\t\t\t\t\t\tif ( t1.source.data.close ) t1.source.data.close();\n\t\t\t\t\t\t\tt1.source.data = imageBitmap;\n\t\t\t\t\t\t\tt1.source.needsUpdate = true;\n\t\t\t\t\t\t\tt1.needsUpdate = true;\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.flipY = sourceDef.extras.flipY;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tdelete sourceDef.extras.flipY;\n\n\t\t\t\t}\n\n\t\t\t\tif ( sourceDef.extras.uuid !== undefined ) {\n\n\t\t\t\t\ttexture.source.uuid = sourceDef.extras.uuid;\n\t\t\t\t\t// delete sourceDef.extras.uuid; // do not delete\n\n\t\t\t\t}\n\n\t\t\t\tif ( sourceDef.extras.t_uuid !== undefined ) {\n\n\t\t\t\t\ttexture.uuid = sourceDef.extras.t_uuid;\n\t\t\t\t\ttexture.__hasGLTFUuid = true; // this is read in GLTFTextureTransformExtension.extendTexture\n\t\t\t\t\t// delete sourceDef.extras.t_uuid; // do not delete\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( sourceDef.uri && typeof sourceDef.uri === 'string' && isObjectURL === false )\n\t\t\t\ttexture.userData.rootPath = LoaderUtils.resolveURL( sourceDef.uri, options.path );\n\n\t\t\tif ( sourceBlob ) texture.userData.__sourceBlob = sourceBlob;\n\n\t\t\t// load image again if preferUri is false to replace embedded preview images\n\t\t\tif ( ! preferUri && sourceDef.uri && sourceDef.uri !== sourceURI ) {\n\n\t\t\t\t// load again with uri.\n\t\t\t\tparser.loadImageSource( sourceIndex, loader, true, true ).then( function ( texture2 ) {\n\n\t\t\t\t\tif ( texture.source.data && texture.source.data.close ) texture.source.data.close();\n\t\t\t\t\ttexture.dispose();\n\t\t\t\t\t// texture.source.data = texture2.source.data;\n\t\t\t\t\ttexture.source = texture2.source;\n\t\t\t\t\ttexture.source.needsUpdate = true;\n\t\t\t\t\ttexture.needsUpdate = true;\n\t\t\t\t\ttexture.uuid = texture2.uuid;\n\t\t\t\t\tif ( texture2.__hasGLTFUuid ) texture.__hasGLTFUuid = true;\n\t\t\t\t\ttexture.flipY = texture2.flipY;\n\t\t\t\t\ttexture.userData = texture2.userData;\n\t\t\t\t\ttexture.setDirty && texture.setDirty();\n\t\t\t\t\ttexture2._newTex = texture;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param  {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new GLTFLoader.ObjectConstructors.PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new GLTFLoader.ObjectConstructors.LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// do not clone the material if the properties are in the extras extension\n\t\tconst hasExtrasExtension = ( material.userData && material.userData.gltfExtensions ) ? !! material.userData.gltfExtensions[ 'WEBGI_material_extras' ] : false;\n\n\t\t// Clone the material if it will be modified\n\t\tif ( ( useDerivativeTangents || useVertexColors || useFlatShading ) && ! ( hasExtrasExtension ) ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn GLTFLoader.ObjectConstructors.MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== GLTFLoader.ObjectConstructors.MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== GLTFLoader.ObjectConstructors.MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== GLTFLoader.ObjectConstructors.MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== GLTFLoader.ObjectConstructors.MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.extras && materialDef.extras.uuid )\n\t\t\t\tmaterial.uuid = materialDef.extras.uuid;\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tif ( mesh.geometry && meshDef.extras && meshDef.extras.isGeometryUserData ) {\n\n\t\t\t\t\tassignExtrasToUserData( mesh.geometry, meshDef );\n\t\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh.geometry, primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\t\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\t}\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tif ( meshDef.extensions ) meshes.forEach( mesh => addUnknownExtensionsToUserData( extensions, mesh, meshDef ) );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new GLTFLoader.ObjectConstructors.PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new GLTFLoader.ObjectConstructors.OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst animation = new AnimationClip( animationName, undefined, tracks );\n\n\t\t\tassignExtrasToUserData( animation, animationDef );\n\n\t\t\treturn animation;\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader, GLTFBinaryExtension, GLTFParser };\n","import {aesGcmDecrypt, aesGcmEncrypt, getOrCall} from 'ts-browser-helpers'\nimport {makeGLBFile} from '../../utils'\nimport {GLTFExporter2Options} from '../export'\nimport {GLTFBinaryExtension} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {GLTFPreparser} from '../import'\n\n/**\n * Sample encryption processor for {@link GLTFExporter2} that wraps the glb in a new glb with encrypted content and encryption metadata.\n * Uses AES-GCM ({@link aesGcmEncrypt}) for encryption since it is widely supported across browsers and js environments.\n * @param gltf\n * @param options\n */\nexport const glbEncryptionProcessor = async(gltf: ArrayBuffer|any, options: GLTFExporter2Options) => {\n    if (!gltf || !(gltf instanceof ArrayBuffer) || !gltf.byteLength || !options.encrypt) return gltf\n    if (!options.encryptKey && window && window.prompt) {\n        options.encryptKey = window.prompt('GLTFEncryption: Enter encryption key/password') || ''\n    }\n    if (!options.encryptKey) {\n        console.warn('GLTF Export: encryption key not provided, skipping encryption')\n        return gltf\n    }\n    const buffer = await aesGcmEncrypt(new Uint8Array(gltf), options.encryptKey)\n    return makeGLBFile(buffer, {\n        asset: {\n            version: '2.0',\n            generator: 'ThreePipeGLBWrapper',\n            encryption: {\n                type: 'aesgcm',\n                version: 1,\n            },\n        },\n    })\n}\n\nexport interface IGLBEncryptionPreparser extends GLTFPreparser{\n    key: string | ((encryption: any, json: any, path: string)=>string|Promise<string>)\n}\n\n/**\n * Sample encryption preparser for {@link GLTFLoader2} that unwraps the glb container and decrypts the content. The encryption key can be provided in the file or set in this const is prompted from the user.\n */\nexport const glbEncryptionPreparser: IGLBEncryptionPreparser = {\n    key: (encryption: any, _: any, path: string) => {\n        return encryption.key || window && window.prompt && window.prompt('GLTFEncryption: Please enter the password/key for the model: ' + path) || ''\n    },\n    async process(data: string | ArrayBuffer, path: string) {\n        if (typeof data === 'string' || data.byteLength < 100) return data\n        const prefixBytes = 100\n        const prefix = new TextDecoder().decode(new Uint8Array(data, 0, prefixBytes))\n        if (!prefix.includes('GLBWrapper')) return data\n        const binaryExtension = new GLTFBinaryExtension(data)\n        const json = JSON.parse(binaryExtension.content || '{}')\n        let data2 = binaryExtension.body || data\n        const encryption = json.asset?.encryption\n        if (!encryption) return data2\n        const type = encryption.type\n        const version = encryption.version\n        if (type === 'aesgcm' && version === 1) {\n            const key = await getOrCall(this.key, encryption, json, path) || ''\n            try {\n                data2 = (await aesGcmDecrypt(new Uint8Array(data2), key)).buffer\n            } catch (e) {\n                throw new ErrorEvent('decryption error')\n            }\n        }\n        return data2\n    },\n}\n","import {FileLoader} from 'three'\nimport {ValOrFunc} from 'ts-browser-helpers'\n\nexport class SimpleJSONLoader extends FileLoader {\n    static SupportedJSONTypes: ValOrFunc<string[]> = []\n    static SupportedJSONExtensions: ValOrFunc<string[]> = []\n\n    async parseAsync(data: Record<string, any>): Promise<any> {\n        // todo use ThreeSerialization here? or in a subclass? it needs loadConfigResources as well.\n        return data\n    }\n    load(url: string, onLoad?: (response: (any)) => void, onProgress?: (request: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): any {\n        return super.load(url, (res)=>{\n            try {\n                if (typeof res === 'string') {\n                    this.parseAsync(JSON.parse(res)).then(onLoad)\n                } else {\n                    throw new Error('Invalid JSON')\n                }\n            } catch (e: any) {\n                onError?.(e)\n            }\n        }, onProgress, onError)\n    }\n}\n\n","import {SimpleJSONLoader} from './SimpleJSONLoader'\nimport {ThreeViewer} from '../../viewer'\nimport {getEmptyMeta, SerializationMetaType, ThreeSerialization} from '../../utils/serialization'\nimport {IMaterial} from '../../core'\n\nexport class JSONMaterialLoader extends SimpleJSONLoader {\n    // todo remove spread after node 22 widespread support\n    static SupportedJSONTypes = ()=>['Material', ...[...ThreeSerialization.SerializableMaterials.values()].flatMap(t => [t.TYPE, ...t.TypeAlias || []])]\n    static SupportedJSONExtensions = ()=>['mat', ...[...ThreeSerialization.SerializableMaterials.values()].map(t => t.TypeSlug)]\n\n    viewer?: ThreeViewer\n\n    /**\n     * Find any existing material with the same uuid and update it instead of creating a new one\n     * This is a global flag to toggle this behavior on or off\n     * @default false\n     */\n    static FindExistingMaterial = false\n\n    async parseAsync(json: Record<string, any>): Promise<any> {\n        if (!this.viewer) throw 'Viewer not set in JSONMaterialLoader.'\n        let mat = undefined\n        if (JSONMaterialLoader.FindExistingMaterial && json.uuid && this.viewer) {\n            // find any existing mat with the same uuid.\n            mat = this.viewer.materialManager.findMaterial(json.uuid)\n        }\n        return await JSONMaterialLoader.DeserializeMaterialJSON(json, this.viewer, undefined, mat)\n    }\n\n    static async DeserializeMaterialJSON(json: any, viewer: ThreeViewer, meta?: SerializationMetaType, obj?: IMaterial|IMaterial[]) {\n        meta = meta || getEmptyMeta()\n        const json2 = {...json}\n        if (json.images) {\n            if (Array.isArray(json.images)) meta.images = Object.fromEntries(json.images.map((i: any) => [i.uuid, i]))\n            else meta.images = json.images\n            delete json2.images\n        }\n        if (json.textures) {\n            if (Array.isArray(json.textures)) meta.textures = Object.fromEntries(json.textures.map((t: any) => [t.uuid, t]))\n            else meta.textures = json.textures\n            delete json2.textures\n        }\n        if (json.materials) {\n            if (Array.isArray(json.materials)) meta.materials = Object.fromEntries(json.materials.map((m: any) => [m.uuid, m]))\n            else meta.materials = json.materials\n            delete json2.materials\n        }\n        const resources = await viewer.loadConfigResources(meta)\n        return ThreeSerialization.Deserialize(json2, obj || undefined, resources)\n    }\n}\n","/* eslint-disable */\n// @ts-nocheck\n// r152 jsm/MTLLoader.js\nimport {\n    Color,\n    DefaultLoadingManager,\n    FileLoader,\n    FrontSide,\n    Loader,\n    LoaderUtils,\n    MeshPhongMaterial,\n    RepeatWrapping,\n    SRGBColorSpace,\n    TextureLoader,\n    Vector2,\n} from 'three';\n\n/**\n * Loads a Wavefront .mtl file specifying materials\n */\n\nclass MTLLoader2 extends Loader {\n\n    constructor(manager) {\n\n        super(manager);\n\n    }\n\n    /**\n     * Loads and parses a MTL asset from a URL.\n     *\n     * @param {String} url - URL to the MTL file.\n     * @param {Function} [onLoad] - Callback invoked with the loaded object.\n     * @param {Function} [onProgress] - Callback for download progress.\n     * @param {Function} [onError] - Callback for download errors.\n     *\n     * {@link setPath} {@link setResourcePath}\n     *\n     * @note In order for relative texture references to resolve correctly\n     * you must call setResourcePath() explicitly prior to load.\n     */\n    load(url, onLoad, onProgress, onError) {\n\n        const scope = this;\n\n        const path = (this.path === '') ? LoaderUtils.extractUrlBase(url) : this.path;\n\n        const loader = new FileLoader(this.manager);\n        loader.setPath(this.path);\n        loader.setRequestHeader(this.requestHeader);\n        loader.setWithCredentials(this.withCredentials);\n        loader.load(url, function (text) {\n\n            try {\n\n                onLoad(scope.parse(text, path));\n\n            } catch (e) {\n\n                if (onError) {\n\n                    onError(e);\n\n                } else {\n\n                    console.error(e);\n\n                }\n\n                scope.manager.itemError(url);\n\n            }\n\n        }, onProgress, onError);\n\n    }\n\n    setMaterialOptions(value) {\n\n        this.materialOptions = value;\n        return this;\n\n    }\n\n    /**\n     * Parses a MTL file.\n     *\n     * @param {String} text - Content of MTL file\n     * @return {MaterialCreator}\n     *\n     * {@link setPath} {@link setResourcePath}\n     *\n     * @note In order for relative texture references to resolve correctly\n     * you must call setResourcePath() explicitly prior to parse.\n     */\n    parse(text, path) {\n\n        const lines = text.split('\\n');\n        let info = {};\n        const delimiter_pattern = /\\s+/;\n        const materialsInfo = {};\n\n        for (let i = 0; i < lines.length; i++) {\n\n            let line = lines[i];\n            line = line.trim();\n\n            if (line.length === 0 || line.charAt(0) === '#') {\n\n                // Blank line or comment ignore\n                continue;\n\n            }\n\n            const pos = line.indexOf(' ');\n\n            let key = (pos >= 0) ? line.substring(0, pos) : line;\n            key = key.toLowerCase();\n\n            let value = (pos >= 0) ? line.substring(pos + 1) : '';\n            value = value.trim();\n\n            if (key === 'newmtl') {\n\n                // New material\n\n                info = {name: value};\n                materialsInfo[value] = info;\n\n            } else {\n\n                if (key === 'ka' || key === 'kd' || key === 'ks' || key === 'ke') {\n\n                    const ss = value.split(delimiter_pattern, 3);\n                    info[key] = [parseFloat(ss[0]), parseFloat(ss[1]), parseFloat(ss[2])];\n\n                } else {\n\n                    info[key] = value;\n\n                }\n\n            }\n\n        }\n\n        const materialCreator = new MaterialCreator(this.resourcePath || path, this.materialOptions);\n        materialCreator.setCrossOrigin(this.crossOrigin);\n        materialCreator.setManager(this.manager);\n        materialCreator.setMaterials(materialsInfo);\n        return materialCreator;\n\n    }\n\n}\n\n/**\n * Create a new MTLLoader2.MaterialCreator\n * @param baseUrl - Url relative to which textures are loaded\n * @param options - Set of options on how to construct the materials\n *                  side: Which side to apply the material\n *                        FrontSide (default), THREE.BackSide, THREE.DoubleSide\n *                  wrap: What type of wrapping to apply for textures\n *                        RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping\n *                  normalizeRGB: RGBs need to be normalized to 0-1 from 0-255\n *                                Default: false, assumed to be already normalized\n *                  ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's\n *                                  Default: false\n * @constructor\n */\n\nclass MaterialCreator {\n\n    constructor(baseUrl = '', options = {}) {\n\n        this.baseUrl = baseUrl;\n        this.options = options;\n        this.materialsInfo = {};\n        this.materials = {};\n        this.materialsArray = [];\n        this.nameLookup = {};\n\n        this.crossOrigin = 'anonymous';\n\n        this.side = (this.options.side !== undefined) ? this.options.side : FrontSide;\n        this.wrap = (this.options.wrap !== undefined) ? this.options.wrap : RepeatWrapping;\n\n    }\n\n    setCrossOrigin(value) {\n\n        this.crossOrigin = value;\n        return this;\n\n    }\n\n    setManager(value) {\n\n        this.manager = value;\n\n    }\n\n    setMaterials(materialsInfo) {\n\n        this.materialsInfo = this.convert(materialsInfo);\n        this.materials = {};\n        this.materialsArray = [];\n        this.nameLookup = {};\n\n    }\n\n    convert(materialsInfo) {\n\n        if (!this.options) return materialsInfo;\n\n        const converted = {};\n\n        for (const mn in materialsInfo) {\n\n            // Convert materials info into normalized form based on options\n\n            const mat = materialsInfo[mn];\n\n            const covmat = {};\n\n            converted[mn] = covmat;\n\n            for (const prop in mat) {\n\n                let save = true;\n                let value = mat[prop];\n                const lprop = prop.toLowerCase();\n\n                switch (lprop) {\n\n                    case 'kd':\n                    case 'ka':\n                    case 'ks':\n\n                        // Diffuse color (color under white light) using RGB values\n\n                        if (this.options && this.options.normalizeRGB) {\n\n                            value = [value[0] / 255, value[1] / 255, value[2] / 255];\n\n                        }\n\n                        if (this.options && this.options.ignoreZeroRGBs) {\n\n                            if (value[0] === 0 && value[1] === 0 && value[2] === 0) {\n\n                                // ignore\n\n                                save = false;\n\n                            }\n\n                        }\n\n                        break;\n\n                    default:\n\n                        break;\n\n                }\n\n                if (save) {\n\n                    covmat[lprop] = value;\n\n                }\n\n            }\n\n        }\n\n        return converted;\n\n    }\n\n    async preload() {\n\n        for (const mn in this.materialsInfo) {\n\n            await this.create(mn);\n\n        }\n\n    }\n\n    getIndex(materialName) {\n\n        return this.nameLookup[materialName];\n\n    }\n\n    async getAsArray() {\n\n        let index = 0;\n\n        for (const mn in this.materialsInfo) {\n\n            this.materialsArray[index] = await this.create(mn);\n            this.nameLookup[mn] = index;\n            index++;\n\n        }\n\n        return this.materialsArray;\n\n    }\n\n    async create(materialName) {\n\n        if (this.materials[materialName] === undefined) {\n\n            await this.createMaterial_(materialName);\n\n        }\n\n        return this.materials[materialName];\n\n    }\n\n    async createMaterial_(materialName) {\n\n        // Create material\n\n        const scope = this;\n        const mat = this.materialsInfo[materialName];\n        const params = {\n\n            name: materialName,\n            side: this.side\n\n        };\n\n        function resolveURL(baseUrl, url) {\n\n            if (typeof url !== 'string' || url === '')\n                return '';\n\n            // Absolute URL\n            if (/^https?:\\/\\//i.test(url)) return url;\n\n            return baseUrl + url;\n\n        }\n\n        async function setMapForType(mapType, value) {\n\n            if (params[mapType]) return; // Keep the first encountered texture\n\n            const texParams = scope.getTextureParams(value, params);\n            return new Promise((resolve, reject) => {\n                let resolved = false;\n                let res = ()=> (!resolved && (resolved = true) && resolve())\n                const map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url), undefined, (map)=>{\n                    params[mapType] = map;\n                    res()\n                }, undefined, res);\n                setTimeout(res, 50); // timeout.\n\n                map.repeat.copy(texParams.scale);\n                map.offset.copy(texParams.offset);\n\n                map.wrapS = scope.wrap;\n                map.wrapT = scope.wrap;\n\n                if ( mapType === 'map' || mapType === 'emissiveMap' ) {\n\n                    map.colorSpace = SRGBColorSpace;\n\n                }\n\n            })\n\n        }\n\n        /**\n         *\n         * @type {string[]}\n         */\n        const propList = Array.from(Object.keys(mat?mat:{}));\n\n        let hasOpacity = propList.includes('d') || propList.includes('D');\n\n        for (const prop of propList) {\n            const value = mat[prop];\n            let n;\n\n            if (value === '') continue;\n\n            switch (prop.toLowerCase()) {\n\n                // Ns is material specular exponent\n\n                case 'kd':\n\n                    // Diffuse color (color under white light) using RGB values\n\n                    params.color = new Color().fromArray( value ).convertSRGBToLinear();\n\n                    break;\n\n                case 'ks':\n\n                    // Specular color (color when light is reflected from shiny surface) using RGB values\n                    params.specular = new Color().fromArray( value ).convertSRGBToLinear();\n\n                    break;\n\n                case 'ke':\n\n                    // Emissive using RGB values\n                    params.emissive = new Color().fromArray( value ).convertSRGBToLinear();\n\n                    break;\n\n                case 'map_kd':\n\n                    // Diffuse texture map\n\n                    await setMapForType('map', value);\n\n                    break;\n\n                case 'map_ks':\n\n                    // Specular map\n\n                    await setMapForType('specularMap', value);\n\n                    break;\n\n                case 'map_ke':\n\n                    // Emissive map\n\n                    await setMapForType('emissiveMap', value);\n\n                    break;\n\n                case 'norm':\n\n                    await setMapForType('normalMap', value);\n\n                    break;\n\n                case 'map_bump':\n                case 'bump':\n\n                    // Bump texture map\n\n                    await setMapForType('bumpMap', value);\n\n                    break;\n\n                case 'map_d':\n\n                    // Alpha map\n\n                    await setMapForType('alphaMap', value);\n                    params.transparent = true;\n\n                    break;\n\n                case 'ns':\n\n                    // The specular exponent (defines the focus of the specular highlight)\n                    // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\n\n                    params.shininess = parseFloat(value);\n\n                    break;\n\n                case 'd':\n                    n = parseFloat(value);\n\n                    if (n < 1) {\n\n                        params.opacity = n;\n                        params.transparent = true;\n\n                    }\n\n                    break;\n\n                case 'tr': // is this translucency?\n                    if (hasOpacity) break; // ignore transparency if opacity is present\n\n                    n = parseFloat(value);\n\n                    if (this.options && this.options.invertTrProperty) n = 1 - n;\n\n                    if (n > 0) {\n\n                        params.opacity = 1 - n;\n                        params.transparent = true;\n\n                    }\n\n                    break;\n\n                default:\n                    break;\n\n            }\n\n        }\n\n        this.materials[materialName] = new MeshPhongMaterial(params);\n        return this.materials[materialName];\n\n    }\n\n    getTextureParams(value, matParams) {\n\n        const texParams = {\n\n            scale: new Vector2(1, 1),\n            offset: new Vector2(0, 0)\n\n        };\n\n        const items = value.split(/\\s+/);\n        let pos;\n\n        pos = items.indexOf('-bm');\n\n        if (pos >= 0) {\n\n            matParams.bumpScale = parseFloat(items[pos + 1]);\n            items.splice(pos, 2);\n\n        }\n\n        pos = items.indexOf('-s');\n\n        if (pos >= 0) {\n\n            texParams.scale.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2]));\n            items.splice(pos, 4); // we expect 3 parameters here!\n\n        }\n\n        pos = items.indexOf('-o');\n\n        if (pos >= 0) {\n\n            texParams.offset.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2]));\n            items.splice(pos, 4); // we expect 3 parameters here!\n\n        }\n\n        texParams.url = items.join(' ').trim();\n        return texParams;\n\n    }\n\n    loadTexture(url, mapping, onLoad, onProgress, onError) {\n\n        const manager = (this.manager !== undefined) ? this.manager : DefaultLoadingManager;\n        let loader = manager.getHandler(url);\n\n        if (loader === null) {\n\n            loader = new TextureLoader(manager);\n\n        }\n\n        if (loader.setCrossOrigin) loader.setCrossOrigin(this.crossOrigin);\n\n        const texture = loader.load(url, onLoad, onProgress, onError);\n\n        if (mapping !== undefined) texture.mapping = mapping;\n\n        return texture;\n\n    }\n\n}\n\nexport {MTLLoader2, type MaterialCreator};\n","/* eslint-disable */\n// @ts-nocheck\n// threejs r152 OBJLoader. Added auto material loading.\nimport {\n    BufferGeometry,\n    Color,\n    FileLoader,\n    Float32BufferAttribute,\n    Group,\n    LineBasicMaterial,\n    LineSegments,\n    Loader,\n    Material,\n    Mesh,\n    MeshStandardMaterial,\n    Points,\n    PointsMaterial,\n    Vector3\n} from 'three';\nimport {MTLLoader2} from './MTLLoader2'\nimport {ILoader} from '../IImporter'\n// o object_name | g group_name\nconst _object_pattern = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst _material_library_pattern = /^mtllib /;\n// usemtl material_name\nconst _material_use_pattern = /^usemtl /;\n// usemap map_name\nconst _map_use_pattern = /^usemap /;\nconst _face_vertex_data_separator_pattern = /\\s+/;\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _ab = new Vector3();\nconst _cb = new Vector3();\n\nconst _color = new Color();\n\nfunction ParserState() {\n\n    const state = {\n        objects: [],\n        object: {},\n\n        vertices: [],\n        normals: [],\n        colors: [],\n        uvs: [],\n\n        materials: {},\n        materialLibraries: [],\n\n        startObject: function ( name, fromDeclaration ) {\n\n            // If the current object (initial from reset) is not from a g/o declaration in the parsed\n            // file. We need to use it for the first parsed g/o to keep things in sync.\n            if ( this.object && this.object.fromDeclaration === false ) {\n\n                this.object.name = name;\n                this.object.fromDeclaration = ( fromDeclaration !== false );\n                return;\n\n            }\n\n            const previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );\n\n            if ( this.object && typeof this.object._finalize === 'function' ) {\n\n                this.object._finalize( true );\n\n            }\n\n            this.object = {\n                name: name || '',\n                fromDeclaration: ( fromDeclaration !== false ),\n\n                geometry: {\n                    vertices: [],\n                    normals: [],\n                    colors: [],\n                    uvs: [],\n                    hasUVIndices: false\n                },\n                materials: [],\n                smooth: true,\n\n                startMaterial: function ( name, libraries ) {\n\n                    const previous = this._finalize( false );\n\n                    // New usemtl declaration overwrites an inherited material, except if faces were declared\n                    // after the material, then it must be preserved for proper MultiMaterial continuation.\n                    if ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {\n\n                        this.materials.splice( previous.index, 1 );\n\n                    }\n\n                    const material = {\n                        index: this.materials.length,\n                        name: name || '',\n                        mtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),\n                        smooth: ( previous !== undefined ? previous.smooth : this.smooth ),\n                        groupStart: ( previous !== undefined ? previous.groupEnd : 0 ),\n                        groupEnd: - 1,\n                        groupCount: - 1,\n                        inherited: false,\n\n                        clone: function ( index ) {\n\n                            const cloned = {\n                                index: ( typeof index === 'number' ? index : this.index ),\n                                name: this.name,\n                                mtllib: this.mtllib,\n                                smooth: this.smooth,\n                                groupStart: 0,\n                                groupEnd: - 1,\n                                groupCount: - 1,\n                                inherited: false\n                            };\n                            cloned.clone = this.clone.bind( cloned );\n                            return cloned;\n\n                        }\n                    };\n\n                    this.materials.push( material );\n\n                    return material;\n\n                },\n\n                currentMaterial: function () {\n\n                    if ( this.materials.length > 0 ) {\n\n                        return this.materials[ this.materials.length - 1 ];\n\n                    }\n\n                    return undefined;\n\n                },\n\n                _finalize: function ( end ) {\n\n                    const lastMultiMaterial = this.currentMaterial();\n                    if ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) {\n\n                        lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n                        lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n                        lastMultiMaterial.inherited = false;\n\n                    }\n\n                    // Ignore objects tail materials if no face declarations followed them before a new o/g started.\n                    if ( end && this.materials.length > 1 ) {\n\n                        for ( let mi = this.materials.length - 1; mi >= 0; mi -- ) {\n\n                            if ( this.materials[ mi ].groupCount <= 0 ) {\n\n                                this.materials.splice( mi, 1 );\n\n                            }\n\n                        }\n\n                    }\n\n                    // Guarantee at least one empty material, this makes the creation later more straight forward.\n                    if ( end && this.materials.length === 0 ) {\n\n                        this.materials.push( {\n                            name: '',\n                            smooth: this.smooth\n                        } );\n\n                    }\n\n                    return lastMultiMaterial;\n\n                }\n            };\n\n            // Inherit previous objects material.\n            // Spec tells us that a declared material must be set to all objects until a new material is declared.\n            // If a usemtl declaration is encountered while this new object is being parsed, it will\n            // overwrite the inherited material. Exception being that there was already face declarations\n            // to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n\n            if ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {\n\n                const declared = previousMaterial.clone( 0 );\n                declared.inherited = true;\n                this.object.materials.push( declared );\n\n            }\n\n            this.objects.push( this.object );\n\n        },\n\n        finalize: function () {\n\n            if ( this.object && typeof this.object._finalize === 'function' ) {\n\n                this.object._finalize( true );\n\n            }\n\n        },\n\n        parseVertexIndex: function ( value, len ) {\n\n            const index = parseInt( value, 10 );\n            return ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n        },\n\n        parseNormalIndex: function ( value, len ) {\n\n            const index = parseInt( value, 10 );\n            return ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n        },\n\n        parseUVIndex: function ( value, len ) {\n\n            const index = parseInt( value, 10 );\n            return ( index >= 0 ? index - 1 : index + len / 2 ) * 2;\n\n        },\n\n        addVertex: function ( a, b, c ) {\n\n            const src = this.vertices;\n            const dst = this.object.geometry.vertices;\n\n            dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n            dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n            dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n        },\n\n        addVertexPoint: function ( a ) {\n\n            const src = this.vertices;\n            const dst = this.object.geometry.vertices;\n\n            dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n        },\n\n        addVertexLine: function ( a ) {\n\n            const src = this.vertices;\n            const dst = this.object.geometry.vertices;\n\n            dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n        },\n\n        addNormal: function ( a, b, c ) {\n\n            const src = this.normals;\n            const dst = this.object.geometry.normals;\n\n            dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n            dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n            dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n        },\n\n        addFaceNormal: function ( a, b, c ) {\n\n            const src = this.vertices;\n            const dst = this.object.geometry.normals;\n\n            _vA.fromArray( src, a );\n            _vB.fromArray( src, b );\n            _vC.fromArray( src, c );\n\n            _cb.subVectors( _vC, _vB );\n            _ab.subVectors( _vA, _vB );\n            _cb.cross( _ab );\n\n            _cb.normalize();\n\n            dst.push( _cb.x, _cb.y, _cb.z );\n            dst.push( _cb.x, _cb.y, _cb.z );\n            dst.push( _cb.x, _cb.y, _cb.z );\n\n        },\n\n        addColor: function ( a, b, c ) {\n\n            const src = this.colors;\n            const dst = this.object.geometry.colors;\n\n            if ( src[ a ] !== undefined ) dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n            if ( src[ b ] !== undefined ) dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n            if ( src[ c ] !== undefined ) dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n        },\n\n        addUV: function ( a, b, c ) {\n\n            const src = this.uvs;\n            const dst = this.object.geometry.uvs;\n\n            dst.push( src[ a + 0 ], src[ a + 1 ] );\n            dst.push( src[ b + 0 ], src[ b + 1 ] );\n            dst.push( src[ c + 0 ], src[ c + 1 ] );\n\n        },\n\n        addDefaultUV: function () {\n\n            const dst = this.object.geometry.uvs;\n\n            dst.push( 0, 0 );\n            dst.push( 0, 0 );\n            dst.push( 0, 0 );\n\n        },\n\n        addUVLine: function ( a ) {\n\n            const src = this.uvs;\n            const dst = this.object.geometry.uvs;\n\n            dst.push( src[ a + 0 ], src[ a + 1 ] );\n\n        },\n\n        addFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {\n\n            const vLen = this.vertices.length;\n\n            let ia = this.parseVertexIndex( a, vLen );\n            let ib = this.parseVertexIndex( b, vLen );\n            let ic = this.parseVertexIndex( c, vLen );\n\n            this.addVertex( ia, ib, ic );\n            this.addColor( ia, ib, ic );\n\n            // normals\n\n            if ( na !== undefined && na !== '' ) {\n\n                const nLen = this.normals.length;\n\n                ia = this.parseNormalIndex( na, nLen );\n                ib = this.parseNormalIndex( nb, nLen );\n                ic = this.parseNormalIndex( nc, nLen );\n\n                this.addNormal( ia, ib, ic );\n\n            } else {\n\n                this.addFaceNormal( ia, ib, ic );\n\n            }\n\n            // uvs\n\n            if ( ua !== undefined && ua !== '' ) {\n\n                const uvLen = this.uvs.length;\n\n                ia = this.parseUVIndex( ua, uvLen );\n                ib = this.parseUVIndex( ub, uvLen );\n                ic = this.parseUVIndex( uc, uvLen );\n\n                this.addUV( ia, ib, ic );\n\n                this.object.geometry.hasUVIndices = true;\n\n            } else {\n\n                // add placeholder values (for inconsistent face definitions)\n\n                this.addDefaultUV();\n\n            }\n\n        },\n\n        addPointGeometry: function ( vertices ) {\n\n            this.object.geometry.type = 'Points';\n\n            const vLen = this.vertices.length;\n\n            for ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n                const index = this.parseVertexIndex( vertices[ vi ], vLen );\n\n                this.addVertexPoint( index );\n                this.addColor( index );\n\n            }\n\n        },\n\n        addLineGeometry: function ( vertices, uvs ) {\n\n            this.object.geometry.type = 'Line';\n\n            const vLen = this.vertices.length;\n            const uvLen = this.uvs.length;\n\n            for ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n                this.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n            }\n\n            for ( let uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {\n\n                this.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );\n\n            }\n\n        }\n\n    };\n\n    state.startObject( '', false );\n\n    return state;\n\n}\n\n//\n\nclass OBJLoader2 extends Loader implements ILoader{\n\n    constructor( manager ) {\n\n        super( manager );\n\n        this.materials = null;\n\n    }\n\n    load( url, onLoad, onProgress, onError ) {\n\n        const scope = this;\n\n        const loader = new FileLoader( this.manager );\n        loader.setPath( this.path );\n        loader.setRequestHeader( this.requestHeader );\n        loader.setWithCredentials( this.withCredentials );\n        scope.currentUrl = url;\n        loader.load( url, async function ( text ) {\n\n            try {\n\n                onLoad( await scope.parse( text ) );\n\n            } catch ( e ) {\n\n                if ( onError ) {\n\n                    onError( e );\n\n                } else {\n\n                    console.error( e );\n\n                }\n\n                scope.manager.itemError( url );\n\n            }\n\n            scope.currentUrl = undefined;\n\n        }, onProgress, onError );\n\n    }\n\n    loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<any>\n\n    setMaterials( materials ) {\n\n        this.materials = materials;\n\n        return this;\n\n    }\n\n    async parse( text ) {\n\n        const state = new ParserState();\n\n        if ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n            // This is faster than String.split with regex that splits on both\n            text = text.replace( /\\r\\n/g, '\\n' );\n\n        }\n\n        if ( text.indexOf( '\\\\\\n' ) !== - 1 ) {\n\n            // join lines separated by a line continuation character (\\)\n            text = text.replace( /\\\\\\n/g, '' );\n\n        }\n\n        const lines = text.split( '\\n' );\n        let result = [];\n\n        for ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n            const line = lines[ i ].trimStart();\n\n            if ( line.length === 0 ) continue;\n\n            const lineFirstChar = line.charAt( 0 );\n\n            // @todo invoke passed in handler if any\n            if ( lineFirstChar === '#' ) continue; // skip comments\n\n            if ( lineFirstChar === 'v' ) {\n\n                const data = line.split( _face_vertex_data_separator_pattern );\n\n                switch ( data[ 0 ] ) {\n\n                    case 'v':\n                        state.vertices.push(\n                            parseFloat( data[ 1 ] ),\n                            parseFloat( data[ 2 ] ),\n                            parseFloat( data[ 3 ] )\n                        );\n                        if ( data.length >= 7 ) {\n\n                            _color.setRGB(\n                                parseFloat( data[ 4 ] ),\n                                parseFloat( data[ 5 ] ),\n                                parseFloat( data[ 6 ] )\n                            ).convertSRGBToLinear();\n\n                            state.colors.push( _color.r, _color.g, _color.b );\n\n                        } else {\n\n                            // if no colors are defined, add placeholders so color and vertex indices match\n\n                            state.colors.push( undefined, undefined, undefined );\n\n                        }\n\n                        break;\n                    case 'vn':\n                        state.normals.push(\n                            parseFloat( data[ 1 ] ),\n                            parseFloat( data[ 2 ] ),\n                            parseFloat( data[ 3 ] )\n                        );\n                        break;\n                    case 'vt':\n                        state.uvs.push(\n                            parseFloat( data[ 1 ] ),\n                            parseFloat( data[ 2 ] )\n                        );\n                        break;\n\n                }\n\n            } else if ( lineFirstChar === 'f' ) {\n\n                const lineData = line.slice( 1 ).trim();\n                const vertexData = lineData.split( _face_vertex_data_separator_pattern );\n                const faceVertices = [];\n\n                // Parse the face vertex data into an easy to work with format\n\n                for ( let j = 0, jl = vertexData.length; j < jl; j ++ ) {\n\n                    const vertex = vertexData[ j ];\n\n                    if ( vertex.length > 0 ) {\n\n                        const vertexParts = vertex.split( '/' );\n                        faceVertices.push( vertexParts );\n\n                    }\n\n                }\n\n                // Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n                const v1 = faceVertices[ 0 ];\n\n                for ( let j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {\n\n                    const v2 = faceVertices[ j ];\n                    const v3 = faceVertices[ j + 1 ];\n\n                    state.addFace(\n                        v1[ 0 ], v2[ 0 ], v3[ 0 ],\n                        v1[ 1 ], v2[ 1 ], v3[ 1 ],\n                        v1[ 2 ], v2[ 2 ], v3[ 2 ]\n                    );\n\n                }\n\n            } else if ( lineFirstChar === 'l' ) {\n\n                const lineParts = line.substring( 1 ).trim().split( ' ' );\n                let lineVertices = [];\n                const lineUVs = [];\n\n                if ( line.indexOf( '/' ) === - 1 ) {\n\n                    lineVertices = lineParts;\n\n                } else {\n\n                    for ( let li = 0, llen = lineParts.length; li < llen; li ++ ) {\n\n                        const parts = lineParts[ li ].split( '/' );\n\n                        if ( parts[ 0 ] !== '' ) lineVertices.push( parts[ 0 ] );\n                        if ( parts[ 1 ] !== '' ) lineUVs.push( parts[ 1 ] );\n\n                    }\n\n                }\n\n                state.addLineGeometry( lineVertices, lineUVs );\n\n            } else if ( lineFirstChar === 'p' ) {\n\n                const lineData = line.slice( 1 ).trim();\n                const pointData = lineData.split( ' ' );\n\n                state.addPointGeometry( pointData );\n\n            } else if ( ( result = _object_pattern.exec( line ) ) !== null ) {\n\n                // o object_name\n                // or\n                // g group_name\n\n                // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n                // let name = result[ 0 ].slice( 1 ).trim();\n                const name = ( ' ' + result[ 0 ].slice( 1 ).trim() ).slice( 1 );\n\n                state.startObject( name );\n\n            } else if ( _material_use_pattern.test( line ) ) {\n\n                // material\n\n                state.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );\n\n            } else if ( _material_library_pattern.test( line ) ) {\n\n                // mtl file\n\n                state.materialLibraries.push( line.substring( 7 ).trim() );\n\n                let mtl_file = line.substring(7).trim()\n                let handler = this.manager.getHandler(mtl_file)\n                if(!handler && mtl_file.trim().split('?')[0].endsWith('.mtl')) {\n                    handler = new MTLLoader2(this.manager)\n                    handler.setPath(this.path)\n                    handler.setWithCredentials(this.withCredentials)\n                    handler.setRequestHeader(this.requestHeader)\n                    handler.setResourcePath(this.resourcePath)\n                    handler.setCrossOrigin(this.crossOrigin)\n                }\n                // todo isNonRelativeUrl\n                if(this.currentUrl.startsWith('http') && !mtl_file.startsWith('http')) {\n                    mtl_file = this.currentUrl.substring(0, this.currentUrl.lastIndexOf('/') + 1) + mtl_file\n                }\n\n                if (!handler) {\n                    console.warn(\"OBJLoader2: Register MTLLoader2 or any other material loader to loading manager to load the material file:\", mtl_file)\n                } else {\n                    const materials = await handler.loadAsync(mtl_file).catch(reason => {\n                        console.warn(reason)\n                    })\n                    if (materials) this.setMaterials(materials);\n                }\n\n            } else if ( _map_use_pattern.test( line ) ) {\n\n                // the line is parsed but ignored since the loader assumes textures are defined MTL files\n                // (according to https://www.okino.com/conv/imp_wave.htm, 'usemap' is the old-style Wavefront texture reference method)\n\n                console.warn('OBJLoader2: Rendering identifier \"usemap\" not supported. Textures must be defined in MTL files.');\n\n            } else if ( lineFirstChar === 's' ) {\n\n                result = line.split( ' ' );\n\n                // smooth shading\n\n                // @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n                // but does not define a usemtl for each face set.\n                // This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n                // This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n                // where explicit usemtl defines geometry groups.\n                // Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n                /*\n                     * http://paulbourke.net/dataformats/obj/\n                     * or\n                     * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n                     *\n                     * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n                     * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n                     * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n                     * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n                     * than 0.\"\n                     */\n                if ( result.length > 1 ) {\n\n                    const value = result[ 1 ].trim().toLowerCase();\n                    state.object.smooth = ( value !== '0' && value !== 'off' );\n\n                } else {\n\n                    // ZBrush can produce \"s\" lines #11707\n                    state.object.smooth = true;\n\n                }\n\n                const material = state.object.currentMaterial();\n                if ( material ) material.smooth = state.object.smooth;\n\n            } else {\n\n                // Handle null terminated files without exception\n                if ( line === '\\0' ) continue;\n\n                console.warn( 'THREE.OBJLoader: Unexpected line: \"' + line + '\"' );\n\n            }\n\n        }\n\n        state.finalize();\n\n        const container = new Group();\n        container.materialLibraries = [].concat( state.materialLibraries );\n\n        const hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 );\n\n        if ( hasPrimitives === true ) {\n\n            for ( let i = 0, l = state.objects.length; i < l; i ++ ) {\n\n                const object = state.objects[ i ];\n                const geometry = object.geometry;\n                const materials = object.materials;\n                const isLine = ( geometry.type === 'Line' );\n                const isPoints = ( geometry.type === 'Points' );\n                let hasVertexColors = false;\n\n                // Skip o/g line declarations that did not follow with any faces\n                if ( geometry.vertices.length === 0 ) continue;\n\n                const buffergeometry = new BufferGeometry();\n\n                buffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) );\n\n                if ( geometry.normals.length > 0 ) {\n\n                    buffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) );\n\n                }\n\n                if ( geometry.colors.length > 0 ) {\n\n                    hasVertexColors = true;\n                    buffergeometry.setAttribute( 'color', new Float32BufferAttribute( geometry.colors, 3 ) );\n\n                }\n\n                if ( geometry.hasUVIndices === true ) {\n\n                    buffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) );\n\n                }\n\n                // Create materials\n\n                const createdMaterials = [];\n\n                for ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n                    const sourceMaterial = materials[ mi ];\n                    const materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;\n                    let material = state.materials[ materialHash ];\n\n                    if ( this.materials !== null ) {\n\n                        material = await this.materials.create( sourceMaterial.name );\n\n                        // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\n                        if ( isLine && material && ! ( material instanceof LineBasicMaterial ) ) {\n\n                            const materialLine = new LineBasicMaterial();\n                            Material.prototype.copy.call( materialLine, material );\n                            materialLine.color.copy( material.color );\n                            material = materialLine;\n\n                        } else if ( isPoints && material && ! ( material instanceof PointsMaterial ) ) {\n\n                            const materialPoints = new PointsMaterial( { size: 10, sizeAttenuation: false } );\n                            Material.prototype.copy.call( materialPoints, material );\n                            materialPoints.color.copy( material.color );\n                            materialPoints.map = material.map;\n                            material = materialPoints;\n\n                        }\n\n                    }\n\n                    if ( material === undefined ) {\n\n                        if ( isLine ) {\n\n                            material = new LineBasicMaterial();\n\n                        } else if ( isPoints ) {\n\n                            material = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n                        } else {\n\n                            material = new MeshStandardMaterial();\n\n                        }\n\n                        material.name = sourceMaterial.name;\n                        material.flatShading = sourceMaterial.smooth ? false : true;\n                        material.vertexColors = hasVertexColors;\n\n                        state.materials[ materialHash ] = material;\n\n                    }\n\n                    createdMaterials.push( material );\n\n                }\n\n                // Create mesh\n\n                let mesh;\n\n                if ( createdMaterials.length > 1 ) {\n\n                    for ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n                        const sourceMaterial = materials[ mi ];\n                        buffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );\n\n                    }\n\n                    if ( isLine ) {\n\n                        mesh = new LineSegments( buffergeometry, createdMaterials );\n\n                    } else if ( isPoints ) {\n\n                        mesh = new Points( buffergeometry, createdMaterials );\n\n                    } else {\n\n                        mesh = new Mesh( buffergeometry, createdMaterials );\n\n                    }\n\n                } else {\n\n                    if ( isLine ) {\n\n                        mesh = new LineSegments( buffergeometry, createdMaterials[ 0 ] );\n\n                    } else if ( isPoints ) {\n\n                        mesh = new Points( buffergeometry, createdMaterials[ 0 ] );\n\n                    } else {\n\n                        mesh = new Mesh( buffergeometry, createdMaterials[ 0 ] );\n\n                    }\n\n                }\n\n                mesh.name = object.name;\n\n                container.add( mesh );\n\n            }\n\n        } else {\n\n            // if there is only the default parser state object with no geometry data, interpret data as point cloud\n\n            if ( state.vertices.length > 0 ) {\n\n                const material = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n                const buffergeometry = new BufferGeometry();\n\n                buffergeometry.setAttribute( 'position', new Float32BufferAttribute( state.vertices, 3 ) );\n\n                if ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) {\n\n                    buffergeometry.setAttribute( 'color', new Float32BufferAttribute( state.colors, 3 ) );\n                    material.vertexColors = true;\n\n                }\n\n                const points = new Points( buffergeometry, material );\n                container.add( points );\n\n            }\n\n        }\n\n        return container;\n\n    }\n\n}\n\nexport { OBJLoader2 };\n","/*!\nfflate - fast JavaScript compression/decompression\n<https://101arrowz.github.io/fflate>\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.8.2\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n        c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n    ], { type: 'text/javascript' }))));\n    w.onmessage = function (e) {\n        var d = e.data, ed = d.$e$;\n        if (ed) {\n            var err = new Error(ed[0]);\n            err['code'] = ed[1];\n            err.stack = ed[2];\n            cb(err, null);\n        }\n        else\n            cb(null, d);\n    };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new i32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i) {\n        if (cd[i])\n            ++l[cd[i] - 1];\n    }\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 1; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i) {\n            if (cd[i]) {\n                co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n            }\n        }\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n    UnexpectedEOF: 0,\n    InvalidBlockType: 1,\n    InvalidLengthLiteral: 2,\n    InvalidDistance: 3,\n    StreamFinished: 4,\n    NoStreamHandler: 5,\n    InvalidHeader: 6,\n    NoCallback: 7,\n    InvalidUTF8: 8,\n    ExtraFieldTooLong: 9,\n    InvalidDate: 10,\n    FilenameTooLong: 11,\n    StreamFinishing: 12,\n    InvalidZipData: 13,\n    UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n    'unexpected EOF',\n    'invalid block type',\n    'invalid length/literal',\n    'invalid distance',\n    'stream finished',\n    'no stream handler',\n    ,\n    'no callback',\n    'invalid UTF-8 data',\n    'extra field too long',\n    'date not in range 1980-2099',\n    'filename too long',\n    'stream finishing',\n    'invalid zip data'\n    // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n    var e = new Error(msg || ec[ind]);\n    e.code = ind;\n    if (Error.captureStackTrace)\n        Error.captureStackTrace(e, err);\n    if (!nt)\n        throw e;\n    return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n    // source length       dict length\n    var sl = dat.length, dl = dict ? dict.length : 0;\n    if (!sl || st.f && !st.l)\n        return buf || new u8(0);\n    var noBuf = !buf;\n    // have to estimate size\n    var resize = noBuf || st.i != 2;\n    // no state\n    var noSt = st.i;\n    // Assumes roughly 33% compression ratio average\n    if (noBuf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                // ensure size\n                if (resize)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8, st.f = final;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                err(1);\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17\n        if (resize)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var lpos = pos;\n        for (;; lpos = pos) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n            pos += c & 15;\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n            if (!c)\n                err(2);\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lpos = pos, lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n                if (!d)\n                    err(3);\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n                }\n                if (pos > tbts) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                if (resize)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                if (bt < dt) {\n                    var shift = dl - dt, dend = Math.min(dt, end);\n                    if (shift + bt < 0)\n                        err(3);\n                    for (; bt < dend; ++bt)\n                        buf[bt] = dict[shift + bt];\n                }\n                for (; bt < end; ++bt)\n                    buf[bt] = buf[bt - dt];\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    // don't reallocate for streams or user buffers\n    return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n    d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return { t: et, l: 0 };\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return { t: v, l: 1 };\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n    var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n    var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n    var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        ++lcfreq[lclt[i] & 31];\n    for (var i = 0; i < lcdt.length; ++i)\n        ++lcfreq[lcdt[i] & 31];\n    var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n    if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        var sym = syms[i];\n        if (sym > 255) {\n            var len = (sym >> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n            var dst = sym & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[sym]), p += ll[sym];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n    var s = st.z || dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var lst = st.l;\n    var pos = (st.r || 0) & 7;\n    if (lvl) {\n        if (pos)\n            w[0] = st.r >> 3;\n        var opt = deo[lvl - 1];\n        var n = opt >> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new i32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index          l/lind  waitdx          blkpos\n        var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n        for (; i + 2 < s; ++i) {\n            // hash value\n            var hv = hsh(i);\n            // index mod 32768    previous index mod\n            var imod = i & 32767, pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = i - dif + j & 32767;\n                                    var pti = prev[ti];\n                                    var cd = ti - pti & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += imod - pimod & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one int32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        for (i = Math.max(i, wi); i < s; ++i) {\n            syms[li++] = dat[i];\n            ++lf[dat[i]];\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        if (!lst) {\n            st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n            // shft(pos) now 1 less if pos & 7 != 0\n            pos -= 7;\n            st.h = head, st.p = prev, st.i = i, st.w = wi;\n        }\n    }\n    else {\n        for (var i = st.w || 0; i < s + lst; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e >= s) {\n                // write final block\n                w[(pos / 8) | 0] = lst;\n                e = s;\n            }\n            pos = wfblk(w, pos + 1, dat.subarray(i, e));\n        }\n        st.i = s;\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new Int32Array(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && -306674912) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = -1;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return ~c; }\n    };\n};\n// Adler32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length | 0;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 2655, l);\n                for (; i < e; ++i)\n                    m += n += d[i];\n                n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n            }\n            a = n, b = m;\n        },\n        d: function () {\n            a %= 65521, b %= 65521;\n            return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    if (!st) {\n        st = { l: 1 };\n        if (opt.dictionary) {\n            var dict = opt.dictionary.subarray(-32768);\n            var newDat = new u8(dict.length + dat.length);\n            newDat.set(dict);\n            newDat.set(dat, dict.length);\n            dat = newDat;\n            st.w = dict.length;\n        }\n    }\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k].buffer) {\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n        }\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            fnStr = wcln(fns[i], fnStr, td_1);\n        ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n    }\n    var td = mrg({}, ch[id].e);\n    return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n    out: o.size && new u8(o.size),\n    dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) {\n        if (ev.data.length) {\n            strm.push(ev.data[0], ev.data[1]);\n            postMessage([ev.data[0].length]);\n        }\n        else\n            strm.flush();\n    };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else if (!Array.isArray(dat))\n            ext(dat);\n        else if (dat.length == 1) {\n            strm.queuedSize -= dat[0];\n            if (strm.ondrain)\n                strm.ondrain(dat[0]);\n        }\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.queuedSize = 0;\n    strm.push = function (d, f) {\n        if (!strm.ondata)\n            err(5);\n        if (t)\n            strm.ondata(err(4, 0, 1), null, !!f);\n        strm.queuedSize += d.length;\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\n    if (flush) {\n        strm.flush = function () { w.postMessage([]); };\n    }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        err(6, 'invalid gzip data');\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += (d[10] | d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n    c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n    if (o.dictionary) {\n        var h = adler();\n        h.p(o.dictionary);\n        wbytes(c, 2, h.d());\n    }\n};\n// zlib start\nvar zls = function (d, dict) {\n    if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        err(6, 'invalid zlib data');\n    if ((d[1] >> 5 & 1) == +!dict)\n        err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n    return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n    if (typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n        this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n        // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n        // 98304 = 32768 (lookback) + 65536 (common chunk size)\n        this.b = new u8(98304);\n        if (this.o.dictionary) {\n            var dict = this.o.dictionary.subarray(-32768);\n            this.b.set(dict, 32768 - dict.length);\n            this.s.i = 32768 - dict.length;\n        }\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        var endLen = chunk.length + this.s.z;\n        if (endLen > this.b.length) {\n            if (endLen > 2 * this.b.length - 32768) {\n                var newBuf = new u8(endLen & -32768);\n                newBuf.set(this.b.subarray(0, this.s.z));\n                this.b = newBuf;\n            }\n            var split = this.b.length - this.s.z;\n            this.b.set(chunk.subarray(0, split), this.s.z);\n            this.s.z = this.b.length;\n            this.p(this.b, false);\n            this.b.set(this.b.subarray(-32768));\n            this.b.set(chunk.subarray(split), 32768);\n            this.s.z = chunk.length - split + 32768;\n            this.s.i = 32766, this.s.w = 32768;\n        }\n        else {\n            this.b.set(chunk, this.s.z);\n            this.s.z += chunk.length;\n        }\n        this.s.l = final & 1;\n        if (this.s.z > this.s.w + 8191 || final) {\n            this.p(this.b, final || false);\n            this.s.w = this.s.i, this.s.i -= 2;\n        }\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * deflated output for small inputs.\n     */\n    Deflate.prototype.flush = function () {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        this.p(this.b, false);\n        this.s.w = this.s.i, this.s.i -= 2;\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6, 1);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    function Inflate(opts, cb) {\n        // no StrmOpt here to avoid adding to workerizer\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n        this.s = { i: 0, b: dict ? dict.length : 0 };\n        this.o = new u8(32768);\n        this.p = new u8(0);\n        if (dict)\n            this.o.set(dict);\n    }\n    Inflate.prototype.e = function (c) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        if (!this.p.length)\n            this.p = c;\n        else if (c.length) {\n            var n = new u8(this.p.length + c.length);\n            n.set(this.p), n.set(c, this.p.length), this.p = n;\n        }\n    };\n    Inflate.prototype.c = function (final) {\n        this.s.i = +(this.d = final || false);\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.s, this.o);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    function AsyncInflate(opts, cb) {\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Inflate(ev.data);\n            onmessage = astrm(strm);\n        }, 7, 0);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n    return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        this.l += chunk.length;\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * GZIPped output for small inputs.\n     */\n    Gzip.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8, 1);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    function Gunzip(opts, cb) {\n        this.v = 1;\n        this.r = 0;\n        Inflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        this.r += chunk.length;\n        if (this.v) {\n            var p = this.p.subarray(this.v - 1);\n            var s = p.length > 3 ? gzs(p) : 4;\n            if (s > p.length) {\n                if (!final)\n                    return;\n            }\n            else if (this.v > 1 && this.onmember) {\n                this.onmember(this.r - p.length);\n            }\n            this.p = p.subarray(s), this.v = 0;\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n        // process concatenated GZIP\n        if (this.s.f && !this.s.l && !final) {\n            this.v = shft(this.s.p) + 9;\n            this.s = { i: 0 };\n            this.o = new u8(0);\n            this.push(new u8(0), final);\n        }\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    function AsyncGunzip(opts, cb) {\n        var _this = this;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gunzip(ev.data);\n            strm.onmember = function (offset) { return postMessage(offset); };\n            onmessage = astrm(strm);\n        }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n    var st = gzs(data);\n    if (st + 8 > data.length)\n        err(6, 'invalid gzip data');\n    return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * zlibbed output for small inputs.\n     */\n    Zlib.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10, 1);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    function Unzlib(opts, cb) {\n        Inflate.call(this, opts, cb);\n        this.v = opts && opts.dictionary ? 2 : 1;\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 6 && !final)\n                return;\n            this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                err(6, 'invalid zlib data');\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    function AsyncUnzlib(opts, cb) {\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Unzlib(ev.data);\n            onmessage = astrm(strm);\n        }, 11, 0);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n    return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    function Decompress(opts, cb) {\n        this.o = StrmOpt.call(this, opts, cb) || {};\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n    }\n    // init substream\n    // overriden by AsyncDecompress\n    Decompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (dat, final) {\n            _this.ondata(dat, final);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(this.o)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(this.o)\n                        : new this.Z(this.o);\n                this.i();\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    function AsyncDecompress(opts, cb) {\n        Decompress.call(this, opts, cb);\n        this.queuedSize = 0;\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n    }\n    AsyncDecompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        };\n        this.s.ondrain = function (size) {\n            _this.queuedSize -= size;\n            if (_this.ondrain)\n                _this.ondrain(size);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        this.queuedSize += chunk.length;\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, opts)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, opts)\n            : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k, op = o;\n        if (Array.isArray(val))\n            op = mrg(o, val[1]), val = val[0];\n        if (val instanceof u8)\n            t[n] = [val, op];\n        else {\n            t[n += '/'] = [new u8(0), op];\n            fltn(val, n, t, o);\n        }\n    }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n    td.decode(et, { stream: true });\n    tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n    for (var r = '', i = 0;;) {\n        var c = d[i++];\n        var eb = (c > 127) + (c > 223) + (c > 239);\n        if (i + eb > d.length)\n            return { s: r, r: slc(d, i - 1) };\n        if (!eb)\n            r += String.fromCharCode(c);\n        else if (eb == 3) {\n            c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n        }\n        else if (eb & 1)\n            r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n        else\n            r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n    }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is decoded\n     */\n    function DecodeUTF8(cb) {\n        this.ondata = cb;\n        if (tds)\n            this.t = new TextDecoder();\n        else\n            this.p = et;\n    }\n    /**\n     * Pushes a chunk to be decoded from UTF-8 binary\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    DecodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        final = !!final;\n        if (this.t) {\n            this.ondata(this.t.decode(chunk, { stream: true }), final);\n            if (final) {\n                if (this.t.decode().length)\n                    err(8);\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            err(4);\n        var dat = new u8(this.p.length + chunk.length);\n        dat.set(this.p);\n        dat.set(chunk, this.p.length);\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (final) {\n            if (r.length)\n                err(8);\n            this.p = null;\n        }\n        else\n            this.p = r;\n        this.ondata(s, final);\n    };\n    return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is encoded\n     */\n    function EncodeUTF8(cb) {\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be encoded to UTF-8\n     * @param chunk The string data to push\n     * @param final Whether this is the last chunk\n     */\n    EncodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        this.ondata(strToU8(chunk), this.d = final || false);\n    };\n    return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    if (latin1) {\n        var ar_1 = new u8(str.length);\n        for (var i = 0; i < str.length; ++i)\n            ar_1[i] = str.charCodeAt(i);\n        return ar_1;\n    }\n    if (te)\n        return te.encode(str);\n    var l = str.length;\n    var ar = new u8(str.length + (str.length >> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    if (latin1) {\n        var r = '';\n        for (var i = 0; i < dat.length; i += 16384)\n            r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n        return r;\n    }\n    else if (td) {\n        return td.decode(dat);\n    }\n    else {\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (r.length)\n            err(8);\n        return s;\n    }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n    var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n    for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n        ;\n    return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n    var le = 0;\n    if (ex) {\n        for (var k in ex) {\n            var l = ex[k].length;\n            if (l > 65535)\n                err(9);\n            le += l + 4;\n        }\n    }\n    return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n    var fl = fn.length, ex = f.extra, col = co && co.length;\n    var exl = exfl(ex);\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b++] = 20, d[b++] = f.os;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n    d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n    var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        err(10);\n    wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n    if (c != -1) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n        wbytes(d, b + 8, f.size);\n    }\n    wbytes(d, b + 12, fl);\n    wbytes(d, b + 14, exl), b += 16;\n    if (ce != null) {\n        wbytes(d, b, col);\n        wbytes(d, b + 6, f.attrs);\n        wbytes(d, b + 10, ce), b += 14;\n    }\n    d.set(fn, b);\n    b += fl;\n    if (exl) {\n        for (var k in ex) {\n            var exf = ex[k], l = exf.length;\n            wbytes(d, b, +k);\n            wbytes(d, b + 2, l);\n            d.set(exf, b + 4), b += 4 + l;\n        }\n    }\n    if (col)\n        d.set(co, b), b += col;\n    return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n    /**\n     * Creates a pass-through stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     */\n    function ZipPassThrough(filename) {\n        this.filename = filename;\n        this.c = crc();\n        this.size = 0;\n        this.compression = 0;\n    }\n    /**\n     * Processes a chunk and pushes to the output stream. You can override this\n     * method in a subclass for custom behavior, but by default this passes\n     * the data through. You must call this.ondata(err, chunk, final) at some\n     * point in this method.\n     * @param chunk The chunk to process\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.process = function (chunk, final) {\n        this.ondata(null, chunk, final);\n    };\n    /**\n     * Pushes a chunk to be added. If you are subclassing this with a custom\n     * compression algorithm, note that you must push data from the source\n     * file only, pre-compression.\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        this.c.p(chunk);\n        this.size += chunk.length;\n        if (final)\n            this.crc = this.c.d();\n        this.process(chunk, final || false);\n    };\n    return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function ZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n    }\n    ZipDeflate.prototype.process = function (chunk, final) {\n        try {\n            this.d.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function AsyncZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n        this.terminate = this.d.terminate;\n    }\n    AsyncZipDeflate.prototype.process = function (chunk, final) {\n        this.d.push(chunk, final);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an empty ZIP archive to which files can be added\n     * @param cb The callback to call whenever data for the generated ZIP archive\n     *           is available\n     */\n    function Zip(cb) {\n        this.ondata = cb;\n        this.u = [];\n        this.d = 1;\n    }\n    /**\n     * Adds a file to the ZIP archive\n     * @param file The file stream to add\n     */\n    Zip.prototype.add = function (file) {\n        var _this = this;\n        if (!this.ondata)\n            err(5);\n        // finishing or finished\n        if (this.d & 2)\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n        else {\n            var f = strToU8(file.filename), fl_1 = f.length;\n            var com = file.comment, o = com && strToU8(com);\n            var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n            var hl_1 = fl_1 + exfl(file.extra) + 30;\n            if (fl_1 > 65535)\n                this.ondata(err(11, 0, 1), null, false);\n            var header = new u8(hl_1);\n            wzh(header, 0, file, f, u, -1);\n            var chks_1 = [header];\n            var pAll_1 = function () {\n                for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n                    var chk = chks_2[_i];\n                    _this.ondata(null, chk, false);\n                }\n                chks_1 = [];\n            };\n            var tr_1 = this.d;\n            this.d = 0;\n            var ind_1 = this.u.length;\n            var uf_1 = mrg(file, {\n                f: f,\n                u: u,\n                o: o,\n                t: function () {\n                    if (file.terminate)\n                        file.terminate();\n                },\n                r: function () {\n                    pAll_1();\n                    if (tr_1) {\n                        var nxt = _this.u[ind_1 + 1];\n                        if (nxt)\n                            nxt.r();\n                        else\n                            _this.d = 1;\n                    }\n                    tr_1 = 1;\n                }\n            });\n            var cl_1 = 0;\n            file.ondata = function (err, dat, final) {\n                if (err) {\n                    _this.ondata(err, dat, final);\n                    _this.terminate();\n                }\n                else {\n                    cl_1 += dat.length;\n                    chks_1.push(dat);\n                    if (final) {\n                        var dd = new u8(16);\n                        wbytes(dd, 0, 0x8074B50);\n                        wbytes(dd, 4, file.crc);\n                        wbytes(dd, 8, cl_1);\n                        wbytes(dd, 12, file.size);\n                        chks_1.push(dd);\n                        uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n                        if (tr_1)\n                            uf_1.r();\n                        tr_1 = 1;\n                    }\n                    else if (tr_1)\n                        pAll_1();\n                }\n            };\n            this.u.push(uf_1);\n        }\n    };\n    /**\n     * Ends the process of adding files and prepares to emit the final chunks.\n     * This *must* be called after adding all desired files for the resulting\n     * ZIP file to work properly.\n     */\n    Zip.prototype.end = function () {\n        var _this = this;\n        if (this.d & 2) {\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n            return;\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this.d & 1))\n                        return;\n                    _this.u.splice(-1, 1);\n                    _this.e();\n                },\n                t: function () { }\n            });\n        this.d = 3;\n    };\n    Zip.prototype.e = function () {\n        var bt = 0, l = 0, tl = 0;\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n        }\n        var out = new u8(tl + 22);\n        for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n            var f = _c[_b];\n            wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n            bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n        }\n        wzf(out, bt, this.u.length, tl, l);\n        this.ondata(null, out, true);\n        this.d = 2;\n    };\n    /**\n     * A method to terminate any internal workers used by the stream. Subsequent\n     * calls to add() will fail.\n     */\n    Zip.prototype.terminate = function () {\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            f.t();\n        }\n        this.d = 2;\n    };\n    return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                var l = f.c.length;\n                wzh(out, tot, f, f.f, f.u, l);\n                var badd = 30 + f.f.length + exfl(f.extra);\n                var loc = tot + badd;\n                out.set(f.c, loc);\n                wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n            }\n            catch (e) {\n                return cbd(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cbd(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), size = file.length;\n        c.p(file);\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        var compression = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cbd(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = mrg(p, {\n                    size: size,\n                    crc: c.d(),\n                    c: d,\n                    f: f,\n                    m: m,\n                    u: s != fn.length || (m && (com.length != ms)),\n                    compression: compression\n                });\n                o += 30 + s + exl + l;\n                tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (s > 65535)\n            cbl(err(11, 0, 1), null);\n        if (!compression)\n            cbl(null, file);\n        else if (size < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var compression = p.level == 0 ? 0 : 8;\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        if (s > 65535)\n            err(11);\n        var d = compression ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push(mrg(p, {\n            size: file.length,\n            crc: c.d(),\n            c: d,\n            f: f,\n            m: m,\n            u: s != fn.length || (m && (com.length != ms)),\n            o: o,\n            compression: compression\n        }));\n        o += 30 + s + exl + l;\n        tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f, f.f, f.u, f.c.length);\n        var badd = 30 + f.f.length + exfl(f.extra);\n        out.set(f.c, f.o + badd);\n        wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n    function UnzipPassThrough() {\n    }\n    UnzipPassThrough.prototype.push = function (data, final) {\n        this.ondata(null, data, final);\n    };\n    UnzipPassThrough.compression = 0;\n    return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function UnzipInflate() {\n        var _this = this;\n        this.i = new Inflate(function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n    }\n    UnzipInflate.prototype.push = function (data, final) {\n        try {\n            this.i.push(data, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    UnzipInflate.compression = 8;\n    return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function AsyncUnzipInflate(_, sz) {\n        var _this = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this.ondata(err, dat, final);\n            });\n            this.terminate = this.i.terminate;\n        }\n    }\n    AsyncUnzipInflate.prototype.push = function (data, final) {\n        if (this.i.terminate)\n            data = slc(data, 0);\n        this.i.push(data, final);\n    };\n    AsyncUnzipInflate.compression = 8;\n    return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a ZIP decompression stream\n     * @param cb The callback to call whenever a file in the ZIP archive is found\n     */\n    function Unzip(cb) {\n        this.onfile = cb;\n        this.k = [];\n        this.o = {\n            0: UnzipPassThrough\n        };\n        this.p = et;\n    }\n    /**\n     * Pushes a chunk to be unzipped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzip.prototype.push = function (chunk, final) {\n        var _this = this;\n        if (!this.onfile)\n            err(5);\n        if (!this.p)\n            err(4);\n        if (this.c > 0) {\n            var len = Math.min(this.c, chunk.length);\n            var toAdd = chunk.subarray(0, len);\n            this.c -= len;\n            if (this.d)\n                this.d.push(toAdd, !this.c);\n            else\n                this.k[0].push(toAdd);\n            chunk = chunk.subarray(len);\n            if (chunk.length)\n                return this.push(chunk, final);\n        }\n        else {\n            var f = 0, i = 0, is = void 0, buf = void 0;\n            if (!this.p.length)\n                buf = chunk;\n            else if (!chunk.length)\n                buf = this.p;\n            else {\n                buf = new u8(this.p.length + chunk.length);\n                buf.set(this.p), buf.set(chunk, this.p.length);\n            }\n            var l = buf.length, oc = this.c, add = oc && this.d;\n            var _loop_2 = function () {\n                var _a;\n                var sig = b4(buf, i);\n                if (sig == 0x4034B50) {\n                    f = 1, is = i;\n                    this_1.d = null;\n                    this_1.c = 0;\n                    var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n                    if (l > i + 30 + fnl + es) {\n                        var chks_3 = [];\n                        this_1.k.unshift(chks_3);\n                        f = 2;\n                        var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n                        var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n                        if (sc_1 == 4294967295) {\n                            _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n                        }\n                        else if (dd)\n                            sc_1 = -1;\n                        i += es;\n                        this_1.c = sc_1;\n                        var d_1;\n                        var file_1 = {\n                            name: fn_1,\n                            compression: cmp_1,\n                            start: function () {\n                                if (!file_1.ondata)\n                                    err(5);\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this.o[cmp_1];\n                                    if (!ctr)\n                                        file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n                                    d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n                                    d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n                                    for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n                                        var dat = chks_4[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this.k[0] == chks_3 && _this.c)\n                                        _this.d = d_1;\n                                    else\n                                        d_1.push(et, true);\n                                }\n                            },\n                            terminate: function () {\n                                if (d_1 && d_1.terminate)\n                                    d_1.terminate();\n                            }\n                        };\n                        if (sc_1 >= 0)\n                            file_1.size = sc_1, file_1.originalSize = su_1;\n                        this_1.onfile(file_1);\n                    }\n                    return \"break\";\n                }\n                else if (oc) {\n                    if (sig == 0x8074B50) {\n                        is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                    else if (sig == 0x2014B50) {\n                        is = i -= 4, f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                }\n            };\n            var this_1 = this;\n            for (; i < l - 4; ++i) {\n                var state_1 = _loop_2();\n                if (state_1 === \"break\")\n                    break;\n            }\n            this.p = et;\n            if (oc < 0) {\n                var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n                if (add)\n                    add.push(dat, !!f);\n                else\n                    this.k[+(f == 2)].push(dat);\n            }\n            if (f & 2)\n                return this.push(buf.subarray(i), final);\n            this.p = buf.subarray(i);\n        }\n        if (final) {\n            if (this.c)\n                err(13);\n            this.p = null;\n        }\n    };\n    /**\n     * Registers a decoder with the stream, allowing for files compressed with\n     * the compression type provided to be expanded correctly\n     * @param decoder The decoder constructor\n     */\n    Unzip.prototype.register = function (decoder) {\n        this.o[decoder.compression] = decoder;\n    };\n    return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cbd(err(13, 0, 1), null);\n            return tAll;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (lft) {\n        var c = lft;\n        var o = b4(data, e + 16);\n        var z = o == 4294967295 || c == 65535;\n        if (z) {\n            var ze = b4(data, e - 12);\n            z = b4(data, ze) == 0x6064B50;\n            if (z) {\n                c = lft = b4(data, ze + 32);\n                o = b4(data, ze + 48);\n            }\n        }\n        var fltr = opts && opts.filter;\n        var _loop_3 = function (i) {\n            var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n            o = no;\n            var cbl = function (e, d) {\n                if (e) {\n                    tAll();\n                    cbd(e, null);\n                }\n                else {\n                    if (d)\n                        files[fn] = d;\n                    if (!--lft)\n                        cbd(null, files);\n                }\n            };\n            if (!fltr || fltr({\n                name: fn,\n                size: sc,\n                originalSize: su,\n                compression: c_1\n            })) {\n                if (!c_1)\n                    cbl(null, slc(data, b, b + sc));\n                else if (c_1 == 8) {\n                    var infl = data.subarray(b, b + sc);\n                    // Synchronously decompress under 512KB, or barely-compressed data\n                    if (su < 524288 || sc > 0.8 * su) {\n                        try {\n                            cbl(null, inflateSync(infl, { out: new u8(su) }));\n                        }\n                        catch (e) {\n                            cbl(e, null);\n                        }\n                    }\n                    else\n                        term.push(inflate(infl, { size: su }, cbl));\n                }\n                else\n                    cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n            }\n            else\n                cbl(null, null);\n        };\n        for (var i = 0; i < c; ++i) {\n            _loop_3(i);\n        }\n    }\n    else\n        cbd(null, {});\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            err(13);\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = o == 4294967295 || c == 65535;\n    if (z) {\n        var ze = b4(data, e - 12);\n        z = b4(data, ze) == 0x6064B50;\n        if (z) {\n            c = b4(data, ze + 32);\n            o = b4(data, ze + 48);\n        }\n    }\n    var fltr = opts && opts.filter;\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!fltr || fltr({\n            name: fn,\n            size: sc,\n            originalSize: su,\n            compression: c_2\n        })) {\n            if (!c_2)\n                files[fn] = slc(data, b, b + sc);\n            else if (c_2 == 8)\n                files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n            else\n                err(14, 'unknown compression type ' + c_2);\n        }\n    }\n    return files;\n}\n","import {\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * NURBS utils\n *\n * See NURBSCurve and NURBSSurface.\n **/\n\n\n/**************************************************************\n *\tNURBS Utils\n **************************************************************/\n\n/*\nFinds knot vector span.\n\np : degree\nu : parametric value\nU : knot vector\n\nreturns the span\n*/\nfunction findSpan( p, u, U ) {\n\n\tconst n = U.length - p - 1;\n\n\tif ( u >= U[ n ] ) {\n\n\t\treturn n - 1;\n\n\t}\n\n\tif ( u <= U[ p ] ) {\n\n\t\treturn p;\n\n\t}\n\n\tlet low = p;\n\tlet high = n;\n\tlet mid = Math.floor( ( low + high ) / 2 );\n\n\twhile ( u < U[ mid ] || u >= U[ mid + 1 ] ) {\n\n\t\tif ( u < U[ mid ] ) {\n\n\t\t\thigh = mid;\n\n\t\t} else {\n\n\t\t\tlow = mid;\n\n\t\t}\n\n\t\tmid = Math.floor( ( low + high ) / 2 );\n\n\t}\n\n\treturn mid;\n\n}\n\n\n/*\nCalculate basis functions. See The NURBS Book, page 70, algorithm A2.2\n\nspan : span in which u lies\nu    : parametric point\np    : degree\nU    : knot vector\n\nreturns array[p+1] with basis functions values.\n*/\nfunction calcBasisFunctions( span, u, p, U ) {\n\n\tconst N = [];\n\tconst left = [];\n\tconst right = [];\n\tN[ 0 ] = 1.0;\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tconst temp = N[ r ] / ( rv + lv );\n\t\t\tN[ r ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tN[ j ] = saved;\n\n\t}\n\n\treturn N;\n\n}\n\n\n/*\nCalculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.\n\np : degree of B-Spline\nU : knot vector\nP : control points (x, y, z, w)\nu : parametric point\n\nreturns point for given u\n*/\nfunction calcBSplinePoint( p, U, P, u ) {\n\n\tconst span = findSpan( p, u, U );\n\tconst N = calcBasisFunctions( span, u, p, U );\n\tconst C = new Vector4( 0, 0, 0, 0 );\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tconst point = P[ span - p + j ];\n\t\tconst Nj = N[ j ];\n\t\tconst wNj = point.w * Nj;\n\t\tC.x += point.x * wNj;\n\t\tC.y += point.y * wNj;\n\t\tC.z += point.z * wNj;\n\t\tC.w += point.w * Nj;\n\n\t}\n\n\treturn C;\n\n}\n\n\n/*\nCalculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.\n\nspan : span in which u lies\nu    : parametric point\np    : degree\nn    : number of derivatives to calculate\nU    : knot vector\n\nreturns array[n+1][p+1] with basis functions derivatives\n*/\nfunction calcBasisFunctionDerivatives( span, u, p, n, U ) {\n\n\tconst zeroArr = [];\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tzeroArr[ i ] = 0.0;\n\n\tconst ders = [];\n\n\tfor ( let i = 0; i <= n; ++ i )\n\t\tders[ i ] = zeroArr.slice( 0 );\n\n\tconst ndu = [];\n\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tndu[ i ] = zeroArr.slice( 0 );\n\n\tndu[ 0 ][ 0 ] = 1.0;\n\n\tconst left = zeroArr.slice( 0 );\n\tconst right = zeroArr.slice( 0 );\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tndu[ j ][ r ] = rv + lv;\n\n\t\t\tconst temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];\n\t\t\tndu[ r ][ j ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tndu[ j ][ j ] = saved;\n\n\t}\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tders[ 0 ][ j ] = ndu[ j ][ p ];\n\n\t}\n\n\tfor ( let r = 0; r <= p; ++ r ) {\n\n\t\tlet s1 = 0;\n\t\tlet s2 = 1;\n\n\t\tconst a = [];\n\t\tfor ( let i = 0; i <= p; ++ i ) {\n\n\t\t\ta[ i ] = zeroArr.slice( 0 );\n\n\t\t}\n\n\t\ta[ 0 ][ 0 ] = 1.0;\n\n\t\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\t\tlet d = 0.0;\n\t\t\tconst rk = r - k;\n\t\t\tconst pk = p - k;\n\n\t\t\tif ( r >= k ) {\n\n\t\t\t\ta[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];\n\t\t\t\td = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];\n\n\t\t\t}\n\n\t\t\tconst j1 = ( rk >= - 1 ) ? 1 : - rk;\n\t\t\tconst j2 = ( r - 1 <= pk ) ? k - 1 : p - r;\n\n\t\t\tfor ( let j = j1; j <= j2; ++ j ) {\n\n\t\t\t\ta[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];\n\t\t\t\td += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];\n\n\t\t\t}\n\n\t\t\tif ( r <= pk ) {\n\n\t\t\t\ta[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];\n\t\t\t\td += a[ s2 ][ k ] * ndu[ r ][ pk ];\n\n\t\t\t}\n\n\t\t\tders[ k ][ r ] = d;\n\n\t\t\tconst j = s1;\n\t\t\ts1 = s2;\n\t\t\ts2 = j;\n\n\t\t}\n\n\t}\n\n\tlet r = p;\n\n\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\t\tders[ k ][ j ] *= r;\n\n\t\t}\n\n\t\tr *= p - k;\n\n\t}\n\n\treturn ders;\n\n}\n\n\n/*\n\tCalculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.\n\n\tp  : degree\n\tU  : knot vector\n\tP  : control points\n\tu  : Parametric points\n\tnd : number of derivatives\n\n\treturns array[d+1] with derivatives\n\t*/\nfunction calcBSplineDerivatives( p, U, P, u, nd ) {\n\n\tconst du = nd < p ? nd : p;\n\tconst CK = [];\n\tconst span = findSpan( p, u, U );\n\tconst nders = calcBasisFunctionDerivatives( span, u, p, du, U );\n\tconst Pw = [];\n\n\tfor ( let i = 0; i < P.length; ++ i ) {\n\n\t\tconst point = P[ i ].clone();\n\t\tconst w = point.w;\n\n\t\tpoint.x *= w;\n\t\tpoint.y *= w;\n\t\tpoint.z *= w;\n\n\t\tPw[ i ] = point;\n\n\t}\n\n\tfor ( let k = 0; k <= du; ++ k ) {\n\n\t\tconst point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );\n\n\t\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\t\tpoint.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = point;\n\n\t}\n\n\tfor ( let k = du + 1; k <= nd + 1; ++ k ) {\n\n\t\tCK[ k ] = new Vector4( 0, 0, 0 );\n\n\t}\n\n\treturn CK;\n\n}\n\n\n/*\nCalculate \"K over I\"\n\nreturns k!/(i!(k-i)!)\n*/\nfunction calcKoverI( k, i ) {\n\n\tlet nom = 1;\n\n\tfor ( let j = 2; j <= k; ++ j ) {\n\n\t\tnom *= j;\n\n\t}\n\n\tlet denom = 1;\n\n\tfor ( let j = 2; j <= i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\tfor ( let j = 2; j <= k - i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\treturn nom / denom;\n\n}\n\n\n/*\nCalculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.\n\nPders : result of function calcBSplineDerivatives\n\nreturns array with derivatives for rational curve.\n*/\nfunction calcRationalCurveDerivatives( Pders ) {\n\n\tconst nd = Pders.length;\n\tconst Aders = [];\n\tconst wders = [];\n\n\tfor ( let i = 0; i < nd; ++ i ) {\n\n\t\tconst point = Pders[ i ];\n\t\tAders[ i ] = new Vector3( point.x, point.y, point.z );\n\t\twders[ i ] = point.w;\n\n\t}\n\n\tconst CK = [];\n\n\tfor ( let k = 0; k < nd; ++ k ) {\n\n\t\tconst v = Aders[ k ].clone();\n\n\t\tfor ( let i = 1; i <= k; ++ i ) {\n\n\t\t\tv.sub( CK[ k - i ].clone().multiplyScalar( calcKoverI( k, i ) * wders[ i ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = v.divideScalar( wders[ 0 ] );\n\n\t}\n\n\treturn CK;\n\n}\n\n\n/*\nCalculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.\n\np  : degree\nU  : knot vector\nP  : control points in homogeneous space\nu  : parametric points\nnd : number of derivatives\n\nreturns array with derivatives.\n*/\nfunction calcNURBSDerivatives( p, U, P, u, nd ) {\n\n\tconst Pders = calcBSplineDerivatives( p, U, P, u, nd );\n\treturn calcRationalCurveDerivatives( Pders );\n\n}\n\n\n/*\nCalculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.\n\np, q : degrees of B-Spline surface\nU, V : knot vectors\nP    : control points (x, y, z, w)\nu, v : parametric values\n\nreturns point for given (u, v)\n*/\nfunction calcSurfacePoint( p, q, U, V, P, u, v, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst temp = [];\n\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\ttemp[ l ] = new Vector4( 0, 0, 0, 0 );\n\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ].clone();\n\t\t\tconst w = point.w;\n\t\t\tpoint.x *= w;\n\t\t\tpoint.y *= w;\n\t\t\tpoint.z *= w;\n\t\t\ttemp[ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\tSw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\n/*\nCalculate rational B-Spline volume point. See The NURBS Book, page 134, algorithm A4.3.\n\np, q, r   : degrees of B-Splinevolume\nU, V, W   : knot vectors\nP         : control points (x, y, z, w)\nu, v, w   : parametric values\n\nreturns point for given (u, v, w)\n*/\nfunction calcVolumePoint( p, q, r, U, V, W, P, u, v, w, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst wspan = findSpan( r, w, W );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst Nw = calcBasisFunctions( wspan, w, r, W );\n\tconst temp = [];\n\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\ttemp[ m ] = [];\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\ttemp[ m ][ l ] = new Vector4( 0, 0, 0, 0 );\n\t\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ][ wspan - r + m ].clone();\n\t\t\t\tconst w = point.w;\n\t\t\t\tpoint.x *= w;\n\t\t\t\tpoint.y *= w;\n\t\t\t\tpoint.z *= w;\n\t\t\t\ttemp[ m ][ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let m = 0; m <= r; ++ m ) {\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\tSw.add( temp[ m ][ l ].multiplyScalar( Nw[ m ] ).multiplyScalar( Nv[ l ] ) );\n\n\t\t}\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\n\nexport {\n\tfindSpan,\n\tcalcBasisFunctions,\n\tcalcBSplinePoint,\n\tcalcBasisFunctionDerivatives,\n\tcalcBSplineDerivatives,\n\tcalcKoverI,\n\tcalcRationalCurveDerivatives,\n\tcalcNURBSDerivatives,\n\tcalcSurfacePoint,\n\tcalcVolumePoint,\n};\n","import {\n\tCurve,\n\tVector3,\n\tVector4\n} from 'three';\nimport * as NURBSUtils from '../curves/NURBSUtils.js';\n\n/**\n * NURBS curve object\n *\n * Derives from Curve, overriding getPoint and getTangent.\n *\n * Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.\n *\n **/\n\nclass NURBSCurve extends Curve {\n\n\tconstructor(\n\t\tdegree,\n\t\tknots /* array of reals */,\n\t\tcontrolPoints /* array of Vector(2|3|4) */,\n\t\tstartKnot /* index in knots */,\n\t\tendKnot /* index in knots */\n\t) {\n\n\t\tsuper();\n\n\t\tthis.degree = degree;\n\t\tthis.knots = knots;\n\t\tthis.controlPoints = [];\n\t\t// Used by periodic NURBS to remove hidden spans\n\t\tthis.startKnot = startKnot || 0;\n\t\tthis.endKnot = endKnot || ( this.knots.length - 1 );\n\n\t\tfor ( let i = 0; i < controlPoints.length; ++ i ) {\n\n\t\t\t// ensure Vector4 for control points\n\t\t\tconst point = controlPoints[ i ];\n\t\t\tthis.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t\t}\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u\n\n\t\t// following results in (wx, wy, wz, w) homogeneous point\n\t\tconst hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );\n\n\t\tif ( hpoint.w !== 1.0 ) {\n\n\t\t\t// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)\n\t\t\thpoint.divideScalar( hpoint.w );\n\n\t\t}\n\n\t\treturn point.set( hpoint.x, hpoint.y, hpoint.z );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\tconst tangent = optionalTarget;\n\n\t\tconst u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );\n\t\tconst ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );\n\t\ttangent.copy( ders[ 1 ] ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n}\n\nexport { NURBSCurve };\n","import {\n\tAmbientLight,\n\tAnimationClip,\n\tBone,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tEquirectangularReflectionMapping,\n\tEuler,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLine,\n\tLineBasicMaterial,\n\tLoader,\n\tLoaderUtils,\n\tMathUtils,\n\tMatrix3,\n\tMatrix4,\n\tMesh,\n\tMeshLambertMaterial,\n\tMeshPhongMaterial,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tUint16BufferAttribute,\n\tVector2,\n\tVector3,\n\tVector4,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tShapeUtils\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\nimport { NURBSCurve } from '../curves/NURBSCurve.js';\n\n/**\n * Loader loads FBX file and generates Group representing FBX scene.\n * Requires FBX file to be >= 7.0 and in ASCII or >= 6400 in Binary format\n * Versions lower than this may load but will probably have errors\n *\n * Needs Support:\n *  Morph normals / blend shape normals\n *\n * FBX format references:\n * \thttps://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html (C++ SDK reference)\n *\n * Binary format specification:\n *\thttps://code.blender.org/2013/08/fbx-binary-file-format-specification/\n */\n\n\nlet fbxTree;\nlet connections;\nlet sceneGraph;\n\nclass FBXLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( FBXBuffer, path ) {\n\n\t\tif ( isFbxFormatBinary( FBXBuffer ) ) {\n\n\t\t\tfbxTree = new BinaryParser().parse( FBXBuffer );\n\n\t\t} else {\n\n\t\t\tconst FBXText = convertArrayBufferToString( FBXBuffer );\n\n\t\t\tif ( ! isFbxFormatASCII( FBXText ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown format.' );\n\n\t\t\t}\n\n\t\t\tif ( getFbxVersion( FBXText ) < 7000 ) {\n\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + getFbxVersion( FBXText ) );\n\n\t\t\t}\n\n\t\t\tfbxTree = new TextParser().parse( FBXText );\n\n\t\t}\n\n\t\t// console.log( fbxTree );\n\n\t\tconst textureLoader = new TextureLoader( this.manager ).setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\tconst result = new FBXTreeParser( textureLoader, this.manager ).parse( fbxTree );\n\n\t\tfbxTree = null;\n\t\tconnections = null;\n\t\tsceneGraph = null;\n\n\t\treturn result;\n\n\t}\n\n}\n\n// Parse the FBXTree object returned by the BinaryParser or TextParser and return a Group\nclass FBXTreeParser {\n\n\tconstructor( textureLoader, manager ) {\n\n\t\tthis.textureLoader = textureLoader;\n\t\tthis.manager = manager;\n\n\t}\n\n\tparse() {\n\n\t\tconnections = this.parseConnections();\n\n\t\tconst images = this.parseImages();\n\t\tconst textures = this.parseTextures( images );\n\t\tconst materials = this.parseMaterials( textures );\n\t\tconst deformers = this.parseDeformers();\n\t\tconst geometryMap = new GeometryParser().parse( deformers );\n\n\t\tthis.parseScene( deformers, geometryMap, materials );\n\n\t\treturn sceneGraph;\n\n\t}\n\n\t// Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry )\n\t// and details the connection type\n\tparseConnections() {\n\n\t\tconst connectionMap = new Map();\n\n\t\tif ( 'Connections' in fbxTree ) {\n\n\t\t\tconst rawConnections = fbxTree.Connections.connections;\n\n\t\t\trawConnections.forEach( function ( rawConnection ) {\n\n\t\t\t\tconst fromID = rawConnection[ 0 ];\n\t\t\t\tconst toID = rawConnection[ 1 ];\n\t\t\t\tconst relationship = rawConnection[ 2 ];\n\n\t\t\t\tif ( ! connectionMap.has( fromID ) ) {\n\n\t\t\t\t\tconnectionMap.set( fromID, {\n\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tconst parentRelationship = { ID: toID, relationship: relationship };\n\t\t\t\tconnectionMap.get( fromID ).parents.push( parentRelationship );\n\n\t\t\t\tif ( ! connectionMap.has( toID ) ) {\n\n\t\t\t\t\tconnectionMap.set( toID, {\n\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tconst childRelationship = { ID: fromID, relationship: relationship };\n\t\t\t\tconnectionMap.get( toID ).children.push( childRelationship );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn connectionMap;\n\n\t}\n\n\t// Parse FBXTree.Objects.Video for embedded image data\n\t// These images are connected to textures in FBXTree.Objects.Textures\n\t// via FBXTree.Connections.\n\tparseImages() {\n\n\t\tconst images = {};\n\t\tconst blobs = {};\n\n\t\tif ( 'Video' in fbxTree.Objects ) {\n\n\t\t\tconst videoNodes = fbxTree.Objects.Video;\n\n\t\t\tfor ( const nodeID in videoNodes ) {\n\n\t\t\t\tconst videoNode = videoNodes[ nodeID ];\n\n\t\t\t\tconst id = parseInt( nodeID );\n\n\t\t\t\timages[ id ] = videoNode.RelativeFilename || videoNode.Filename;\n\n\t\t\t\t// raw image data is in videoNode.Content\n\t\t\t\tif ( 'Content' in videoNode ) {\n\n\t\t\t\t\tconst arrayBufferContent = ( videoNode.Content instanceof ArrayBuffer ) && ( videoNode.Content.byteLength > 0 );\n\t\t\t\t\tconst base64Content = ( typeof videoNode.Content === 'string' ) && ( videoNode.Content !== '' );\n\n\t\t\t\t\tif ( arrayBufferContent || base64Content ) {\n\n\t\t\t\t\t\tconst image = this.parseImage( videoNodes[ nodeID ] );\n\n\t\t\t\t\t\tblobs[ videoNode.RelativeFilename || videoNode.Filename ] = image;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( const id in images ) {\n\n\t\t\tconst filename = images[ id ];\n\n\t\t\tif ( blobs[ filename ] !== undefined ) images[ id ] = blobs[ filename ];\n\t\t\telse images[ id ] = images[ id ].split( '\\\\' ).pop();\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\t// Parse embedded image data in FBXTree.Video.Content\n\tparseImage( videoNode ) {\n\n\t\tconst content = videoNode.Content;\n\t\tconst fileName = videoNode.RelativeFilename || videoNode.Filename;\n\t\tconst extension = fileName.slice( fileName.lastIndexOf( '.' ) + 1 ).toLowerCase();\n\n\t\tlet type;\n\n\t\tswitch ( extension ) {\n\n\t\t\tcase 'bmp':\n\n\t\t\t\ttype = 'image/bmp';\n\t\t\t\tbreak;\n\n\t\t\tcase 'jpg':\n\t\t\tcase 'jpeg':\n\n\t\t\t\ttype = 'image/jpeg';\n\t\t\t\tbreak;\n\n\t\t\tcase 'png':\n\n\t\t\t\ttype = 'image/png';\n\t\t\t\tbreak;\n\n\t\t\tcase 'tif':\n\n\t\t\t\ttype = 'image/tiff';\n\t\t\t\tbreak;\n\n\t\t\tcase 'tga':\n\n\t\t\t\tif ( this.manager.getHandler( '.tga' ) === null ) {\n\n\t\t\t\t\tconsole.warn( 'FBXLoader: TGA loader not found, skipping ', fileName );\n\n\t\t\t\t}\n\n\t\t\t\ttype = 'image/tga';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'FBXLoader: Image type \"' + extension + '\" is not supported.' );\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( typeof content === 'string' ) { // ASCII format\n\n\t\t\treturn 'data:' + type + ';base64,' + content;\n\n\t\t} else { // Binary Format\n\n\t\t\tconst array = new Uint8Array( content );\n\t\t\treturn window.URL.createObjectURL( new Blob( [ array ], { type: type } ) );\n\n\t\t}\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Texture\n\t// These contain details such as UV scaling, cropping, rotation etc and are connected\n\t// to images in FBXTree.Objects.Video\n\tparseTextures( images ) {\n\n\t\tconst textureMap = new Map();\n\n\t\tif ( 'Texture' in fbxTree.Objects ) {\n\n\t\t\tconst textureNodes = fbxTree.Objects.Texture;\n\t\t\tfor ( const nodeID in textureNodes ) {\n\n\t\t\t\tconst texture = this.parseTexture( textureNodes[ nodeID ], images );\n\t\t\t\ttextureMap.set( parseInt( nodeID ), texture );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textureMap;\n\n\t}\n\n\t// Parse individual node in FBXTree.Objects.Texture\n\tparseTexture( textureNode, images ) {\n\n\t\tconst texture = this.loadTexture( textureNode, images );\n\n\t\ttexture.ID = textureNode.id;\n\n\t\ttexture.name = textureNode.attrName;\n\n\t\tconst wrapModeU = textureNode.WrapModeU;\n\t\tconst wrapModeV = textureNode.WrapModeV;\n\n\t\tconst valueU = wrapModeU !== undefined ? wrapModeU.value : 0;\n\t\tconst valueV = wrapModeV !== undefined ? wrapModeV.value : 0;\n\n\t\t// http://download.autodesk.com/us/fbx/SDKdocs/FBX_SDK_Help/files/fbxsdkref/class_k_fbx_texture.html#889640e63e2e681259ea81061b85143a\n\t\t// 0: repeat(default), 1: clamp\n\n\t\ttexture.wrapS = valueU === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\t\ttexture.wrapT = valueV === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\tif ( 'Scaling' in textureNode ) {\n\n\t\t\tconst values = textureNode.Scaling.value;\n\n\t\t\ttexture.repeat.x = values[ 0 ];\n\t\t\ttexture.repeat.y = values[ 1 ];\n\n\t\t}\n\n\t\tif ( 'Translation' in textureNode ) {\n\n\t\t\tconst values = textureNode.Translation.value;\n\n\t\t\ttexture.offset.x = values[ 0 ];\n\t\t\ttexture.offset.y = values[ 1 ];\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t// load a texture specified as a blob or data URI, or via an external URL using TextureLoader\n\tloadTexture( textureNode, images ) {\n\n\t\tlet fileName;\n\n\t\tconst currentPath = this.textureLoader.path;\n\n\t\tconst children = connections.get( textureNode.id ).children;\n\n\t\tif ( children !== undefined && children.length > 0 && images[ children[ 0 ].ID ] !== undefined ) {\n\n\t\t\tfileName = images[ children[ 0 ].ID ];\n\n\t\t\tif ( fileName.indexOf( 'blob:' ) === 0 || fileName.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\tthis.textureLoader.setPath( undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet texture;\n\n\t\tconst extension = textureNode.FileName.slice( - 3 ).toLowerCase();\n\n\t\tif ( extension === 'tga' ) {\n\n\t\t\tconst loader = this.manager.getHandler( '.tga' );\n\n\t\t\tif ( loader === null ) {\n\n\t\t\t\tconsole.warn( 'FBXLoader: TGA loader not found, creating placeholder texture for', textureNode.RelativeFilename );\n\t\t\t\ttexture = new Texture();\n\n\t\t\t} else {\n\n\t\t\t\tloader.setPath( this.textureLoader.path );\n\t\t\t\ttexture = loader.load( fileName ); // todo - we should save the filename in userdata so the user can pick the file manually if it failed to load\n\n\t\t\t}\n\n\t\t} else if ( extension === 'dds' ) {\n\n\t\t\tconst loader = this.manager.getHandler( '.dds' );\n\n\t\t\tif ( loader === null ) {\n\n\t\t\t\tconsole.warn( 'FBXLoader: DDS loader not found, creating placeholder texture for', textureNode.RelativeFilename );\n\t\t\t\ttexture = new Texture();\n\n\t\t\t} else {\n\n\t\t\t\tloader.setPath( this.textureLoader.path );\n\t\t\t\ttexture = loader.load( fileName );\n\n\t\t\t}\n\n\t\t} else if ( extension === 'psd' ) {\n\n\t\t\tconsole.warn( 'FBXLoader: PSD textures are not supported, creating placeholder texture for', textureNode.RelativeFilename );\n\t\t\ttexture = new Texture();\n\n\t\t} else {\n\n\t\t\ttexture = this.textureLoader.load( fileName );\n\n\t\t}\n\n\t\tthis.textureLoader.setPath( currentPath );\n\n\t\treturn texture;\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Material\n\tparseMaterials( textureMap ) {\n\n\t\tconst materialMap = new Map();\n\n\t\tif ( 'Material' in fbxTree.Objects ) {\n\n\t\t\tconst materialNodes = fbxTree.Objects.Material;\n\n\t\t\tfor ( const nodeID in materialNodes ) {\n\n\t\t\t\tconst material = this.parseMaterial( materialNodes[ nodeID ], textureMap );\n\n\t\t\t\tif ( material !== null ) materialMap.set( parseInt( nodeID ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materialMap;\n\n\t}\n\n\t// Parse single node in FBXTree.Objects.Material\n\t// Materials are connected to texture maps in FBXTree.Objects.Textures\n\t// FBX format currently only supports Lambert and Phong shading models\n\tparseMaterial( materialNode, textureMap ) {\n\n\t\tconst ID = materialNode.id;\n\t\tconst name = materialNode.attrName;\n\t\tlet type = materialNode.ShadingModel;\n\n\t\t// Case where FBX wraps shading model in property object.\n\t\tif ( typeof type === 'object' ) {\n\n\t\t\ttype = type.value;\n\n\t\t}\n\n\t\t// Ignore unused materials which don't have any connections.\n\t\tif ( ! connections.has( ID ) ) return null;\n\n\t\tconst parameters = this.parseParameters( materialNode, textureMap, ID );\n\n\t\tlet material;\n\n\t\tswitch ( type.toLowerCase() ) {\n\n\t\t\tcase 'phong':\n\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\tbreak;\n\t\t\tcase 'lambert':\n\t\t\t\tmaterial = new MeshLambertMaterial();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: unknown material type \"%s\". Defaulting to MeshPhongMaterial.', type );\n\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tmaterial.setValues( parameters );\n\t\tmaterial.name = name;\n\n\t\treturn material;\n\n\t}\n\n\t// Parse FBX material and return parameters suitable for a three.js material\n\t// Also parse the texture map and return any textures associated with the material\n\tparseParameters( materialNode, textureMap, ID ) {\n\n\t\tconst parameters = {};\n\n\t\tif ( materialNode.BumpFactor ) {\n\n\t\t\tparameters.bumpScale = materialNode.BumpFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Diffuse ) {\n\n\t\t\tparameters.color = new Color().fromArray( materialNode.Diffuse.value ).convertSRGBToLinear();\n\n\t\t} else if ( materialNode.DiffuseColor && ( materialNode.DiffuseColor.type === 'Color' || materialNode.DiffuseColor.type === 'ColorRGB' ) ) {\n\n\t\t\t// The blender exporter exports diffuse here instead of in materialNode.Diffuse\n\t\t\tparameters.color = new Color().fromArray( materialNode.DiffuseColor.value ).convertSRGBToLinear();\n\n\t\t}\n\n\t\tif ( materialNode.DisplacementFactor ) {\n\n\t\t\tparameters.displacementScale = materialNode.DisplacementFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Emissive ) {\n\n\t\t\tparameters.emissive = new Color().fromArray( materialNode.Emissive.value ).convertSRGBToLinear();\n\n\t\t} else if ( materialNode.EmissiveColor && ( materialNode.EmissiveColor.type === 'Color' || materialNode.EmissiveColor.type === 'ColorRGB' ) ) {\n\n\t\t\t// The blender exporter exports emissive color here instead of in materialNode.Emissive\n\t\t\tparameters.emissive = new Color().fromArray( materialNode.EmissiveColor.value ).convertSRGBToLinear();\n\n\t\t}\n\n\t\tif ( materialNode.EmissiveFactor ) {\n\n\t\t\tparameters.emissiveIntensity = parseFloat( materialNode.EmissiveFactor.value );\n\n\t\t}\n\n\t\tif ( materialNode.Opacity ) {\n\n\t\t\tparameters.opacity = parseFloat( materialNode.Opacity.value );\n\n\t\t}\n\n\t\tif ( parameters.opacity < 1.0 ) {\n\n\t\t\tparameters.transparent = true;\n\n\t\t}\n\n\t\tif ( materialNode.ReflectionFactor ) {\n\n\t\t\tparameters.reflectivity = materialNode.ReflectionFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Shininess ) {\n\n\t\t\tparameters.shininess = materialNode.Shininess.value;\n\n\t\t}\n\n\t\tif ( materialNode.Specular ) {\n\n\t\t\tparameters.specular = new Color().fromArray( materialNode.Specular.value ).convertSRGBToLinear();\n\n\t\t} else if ( materialNode.SpecularColor && materialNode.SpecularColor.type === 'Color' ) {\n\n\t\t\t// The blender exporter exports specular color here instead of in materialNode.Specular\n\t\t\tparameters.specular = new Color().fromArray( materialNode.SpecularColor.value ).convertSRGBToLinear();\n\n\t\t}\n\n\t\tconst scope = this;\n\t\tconnections.get( ID ).children.forEach( function ( child ) {\n\n\t\t\tconst type = child.relationship;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'Bump':\n\t\t\t\t\tparameters.bumpMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Maya|TEX_ao_map':\n\t\t\t\t\tparameters.aoMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DiffuseColor':\n\t\t\t\tcase 'Maya|TEX_color_map':\n\t\t\t\t\tparameters.map = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.map !== undefined ) {\n\n\t\t\t\t\t\tparameters.map.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DisplacementColor':\n\t\t\t\t\tparameters.displacementMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EmissiveColor':\n\t\t\t\t\tparameters.emissiveMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.emissiveMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.emissiveMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'NormalMap':\n\t\t\t\tcase 'Maya|TEX_normal_map':\n\t\t\t\t\tparameters.normalMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ReflectionColor':\n\t\t\t\t\tparameters.envMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.envMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.envMap.mapping = EquirectangularReflectionMapping;\n\t\t\t\t\t\tparameters.envMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpecularColor':\n\t\t\t\t\tparameters.specularMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.specularMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.specularMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'TransparentColor':\n\t\t\t\tcase 'TransparencyFactor':\n\t\t\t\t\tparameters.alphaMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tparameters.transparent = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'AmbientColor':\n\t\t\t\tcase 'ShininessExponent': // AKA glossiness map\n\t\t\t\tcase 'SpecularFactor': // AKA specularLevel\n\t\t\t\tcase 'VectorDisplacementColor': // NOTE: Seems to be a copy of DisplacementColor\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: %s map is not supported in three.js, skipping texture.', type );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn parameters;\n\n\t}\n\n\t// get a texture from the textureMap for use by a material.\n\tgetTexture( textureMap, id ) {\n\n\t\t// if the texture is a layered texture, just use the first layer and issue a warning\n\t\tif ( 'LayeredTexture' in fbxTree.Objects && id in fbxTree.Objects.LayeredTexture ) {\n\n\t\t\tconsole.warn( 'THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer.' );\n\t\t\tid = connections.get( id ).children[ 0 ].ID;\n\n\t\t}\n\n\t\treturn textureMap.get( id );\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Deformer\n\t// Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here\n\t// Generates map of Skeleton-like objects for use later when generating and binding skeletons.\n\tparseDeformers() {\n\n\t\tconst skeletons = {};\n\t\tconst morphTargets = {};\n\n\t\tif ( 'Deformer' in fbxTree.Objects ) {\n\n\t\t\tconst DeformerNodes = fbxTree.Objects.Deformer;\n\n\t\t\tfor ( const nodeID in DeformerNodes ) {\n\n\t\t\t\tconst deformerNode = DeformerNodes[ nodeID ];\n\n\t\t\t\tconst relationships = connections.get( parseInt( nodeID ) );\n\n\t\t\t\tif ( deformerNode.attrType === 'Skin' ) {\n\n\t\t\t\t\tconst skeleton = this.parseSkeleton( relationships, DeformerNodes );\n\t\t\t\t\tskeleton.ID = nodeID;\n\n\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: skeleton attached to more than one geometry is not supported.' );\n\t\t\t\t\tskeleton.geometryID = relationships.parents[ 0 ].ID;\n\n\t\t\t\t\tskeletons[ nodeID ] = skeleton;\n\n\t\t\t\t} else if ( deformerNode.attrType === 'BlendShape' ) {\n\n\t\t\t\t\tconst morphTarget = {\n\t\t\t\t\t\tid: nodeID,\n\t\t\t\t\t};\n\n\t\t\t\t\tmorphTarget.rawTargets = this.parseMorphTargets( relationships, DeformerNodes );\n\t\t\t\t\tmorphTarget.id = nodeID;\n\n\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: morph target attached to more than one geometry is not supported.' );\n\n\t\t\t\t\tmorphTargets[ nodeID ] = morphTarget;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tskeletons: skeletons,\n\t\t\tmorphTargets: morphTargets,\n\n\t\t};\n\n\t}\n\n\t// Parse single nodes in FBXTree.Objects.Deformer\n\t// The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster'\n\t// Each skin node represents a skeleton and each cluster node represents a bone\n\tparseSkeleton( relationships, deformerNodes ) {\n\n\t\tconst rawBones = [];\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst boneNode = deformerNodes[ child.ID ];\n\n\t\t\tif ( boneNode.attrType !== 'Cluster' ) return;\n\n\t\t\tconst rawBone = {\n\n\t\t\t\tID: child.ID,\n\t\t\t\tindices: [],\n\t\t\t\tweights: [],\n\t\t\t\ttransformLink: new Matrix4().fromArray( boneNode.TransformLink.a ),\n\t\t\t\t// transform: new Matrix4().fromArray( boneNode.Transform.a ),\n\t\t\t\t// linkMode: boneNode.Mode,\n\n\t\t\t};\n\n\t\t\tif ( 'Indexes' in boneNode ) {\n\n\t\t\t\trawBone.indices = boneNode.Indexes.a;\n\t\t\t\trawBone.weights = boneNode.Weights.a;\n\n\t\t\t}\n\n\t\t\trawBones.push( rawBone );\n\n\t\t} );\n\n\t\treturn {\n\n\t\t\trawBones: rawBones,\n\t\t\tbones: []\n\n\t\t};\n\n\t}\n\n\t// The top level morph deformer node has type \"BlendShape\" and sub nodes have type \"BlendShapeChannel\"\n\tparseMorphTargets( relationships, deformerNodes ) {\n\n\t\tconst rawMorphTargets = [];\n\n\t\tfor ( let i = 0; i < relationships.children.length; i ++ ) {\n\n\t\t\tconst child = relationships.children[ i ];\n\n\t\t\tconst morphTargetNode = deformerNodes[ child.ID ];\n\n\t\t\tconst rawMorphTarget = {\n\n\t\t\t\tname: morphTargetNode.attrName,\n\t\t\t\tinitialWeight: morphTargetNode.DeformPercent,\n\t\t\t\tid: morphTargetNode.id,\n\t\t\t\tfullWeights: morphTargetNode.FullWeights.a\n\n\t\t\t};\n\n\t\t\tif ( morphTargetNode.attrType !== 'BlendShapeChannel' ) return;\n\n\t\t\trawMorphTarget.geoID = connections.get( parseInt( child.ID ) ).children.filter( function ( child ) {\n\n\t\t\t\treturn child.relationship === undefined;\n\n\t\t\t} )[ 0 ].ID;\n\n\t\t\trawMorphTargets.push( rawMorphTarget );\n\n\t\t}\n\n\t\treturn rawMorphTargets;\n\n\t}\n\n\t// create the main Group() to be returned by the loader\n\tparseScene( deformers, geometryMap, materialMap ) {\n\n\t\tsceneGraph = new Group();\n\n\t\tconst modelMap = this.parseModels( deformers.skeletons, geometryMap, materialMap );\n\n\t\tconst modelNodes = fbxTree.Objects.Model;\n\n\t\tconst scope = this;\n\t\tmodelMap.forEach( function ( model ) {\n\n\t\t\tconst modelNode = modelNodes[ model.ID ];\n\t\t\tscope.setLookAtProperties( model, modelNode );\n\n\t\t\tconst parentConnections = connections.get( model.ID ).parents;\n\n\t\t\tparentConnections.forEach( function ( connection ) {\n\n\t\t\t\tconst parent = modelMap.get( connection.ID );\n\t\t\t\tif ( parent !== undefined ) parent.add( model );\n\n\t\t\t} );\n\n\t\t\tif ( model.parent === null ) {\n\n\t\t\t\tsceneGraph.add( model );\n\n\t\t\t}\n\n\n\t\t} );\n\n\t\tthis.bindSkeleton( deformers.skeletons, geometryMap, modelMap );\n\n\t\tthis.addGlobalSceneSettings();\n\n\t\tsceneGraph.traverse( function ( node ) {\n\n\t\t\tif ( node.userData.transformData ) {\n\n\t\t\t\tif ( node.parent ) {\n\n\t\t\t\t\tnode.userData.transformData.parentMatrix = node.parent.matrix;\n\t\t\t\t\tnode.userData.transformData.parentMatrixWorld = node.parent.matrixWorld;\n\n\t\t\t\t}\n\n\t\t\t\tconst transform = generateTransform( node.userData.transformData );\n\n\t\t\t\tnode.applyMatrix4( transform );\n\t\t\t\tnode.updateWorldMatrix();\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst animations = new AnimationParser().parse();\n\n\t\t// if all the models where already combined in a single group, just return that\n\t\tif ( sceneGraph.children.length === 1 && sceneGraph.children[ 0 ].isGroup ) {\n\n\t\t\tsceneGraph.children[ 0 ].animations = animations;\n\t\t\tsceneGraph = sceneGraph.children[ 0 ];\n\n\t\t}\n\n\t\tsceneGraph.animations = animations;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.Model\n\tparseModels( skeletons, geometryMap, materialMap ) {\n\n\t\tconst modelMap = new Map();\n\t\tconst modelNodes = fbxTree.Objects.Model;\n\n\t\tfor ( const nodeID in modelNodes ) {\n\n\t\t\tconst id = parseInt( nodeID );\n\t\t\tconst node = modelNodes[ nodeID ];\n\t\t\tconst relationships = connections.get( id );\n\n\t\t\tlet model = this.buildSkeleton( relationships, skeletons, id, node.attrName );\n\n\t\t\tif ( ! model ) {\n\n\t\t\t\tswitch ( node.attrType ) {\n\n\t\t\t\t\tcase 'Camera':\n\t\t\t\t\t\tmodel = this.createCamera( relationships );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Light':\n\t\t\t\t\t\tmodel = this.createLight( relationships );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Mesh':\n\t\t\t\t\t\tmodel = this.createMesh( relationships, geometryMap, materialMap );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'NurbsCurve':\n\t\t\t\t\t\tmodel = this.createCurve( relationships, geometryMap );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'LimbNode':\n\t\t\t\t\tcase 'Root':\n\t\t\t\t\t\tmodel = new Bone();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Null':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmodel = new Group();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tmodel.name = node.attrName ? PropertyBinding.sanitizeNodeName( node.attrName ) : '';\n\t\t\t\tmodel.userData.originalName = node.attrName;\n\n\t\t\t\tmodel.ID = id;\n\n\t\t\t}\n\n\t\t\tthis.getTransformData( model, node );\n\t\t\tmodelMap.set( id, model );\n\n\t\t}\n\n\t\treturn modelMap;\n\n\t}\n\n\tbuildSkeleton( relationships, skeletons, id, name ) {\n\n\t\tlet bone = null;\n\n\t\trelationships.parents.forEach( function ( parent ) {\n\n\t\t\tfor ( const ID in skeletons ) {\n\n\t\t\t\tconst skeleton = skeletons[ ID ];\n\n\t\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t\tif ( rawBone.ID === parent.ID ) {\n\n\t\t\t\t\t\tconst subBone = bone;\n\t\t\t\t\t\tbone = new Bone();\n\n\t\t\t\t\t\tbone.matrixWorld.copy( rawBone.transformLink );\n\n\t\t\t\t\t\t// set name and id here - otherwise in cases where \"subBone\" is created it will not have a name / id\n\n\t\t\t\t\t\tbone.name = name ? PropertyBinding.sanitizeNodeName( name ) : '';\n\t\t\t\t\t\tbone.userData.originalName = name;\n\t\t\t\t\t\tbone.ID = id;\n\n\t\t\t\t\t\tskeleton.bones[ i ] = bone;\n\n\t\t\t\t\t\t// In cases where a bone is shared between multiple meshes\n\t\t\t\t\t\t// duplicate the bone here and and it as a child of the first bone\n\t\t\t\t\t\tif ( subBone !== null ) {\n\n\t\t\t\t\t\t\tbone.add( subBone );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn bone;\n\n\t}\n\n\t// create a PerspectiveCamera or OrthographicCamera\n\tcreateCamera( relationships ) {\n\n\t\tlet model;\n\t\tlet cameraAttribute;\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\tcameraAttribute = attr;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( cameraAttribute === undefined ) {\n\n\t\t\tmodel = new Object3D();\n\n\t\t} else {\n\n\t\t\tlet type = 0;\n\t\t\tif ( cameraAttribute.CameraProjectionType !== undefined && cameraAttribute.CameraProjectionType.value === 1 ) {\n\n\t\t\t\ttype = 1;\n\n\t\t\t}\n\n\t\t\tlet nearClippingPlane = 1;\n\t\t\tif ( cameraAttribute.NearPlane !== undefined ) {\n\n\t\t\t\tnearClippingPlane = cameraAttribute.NearPlane.value / 1000;\n\n\t\t\t}\n\n\t\t\tlet farClippingPlane = 1000;\n\t\t\tif ( cameraAttribute.FarPlane !== undefined ) {\n\n\t\t\t\tfarClippingPlane = cameraAttribute.FarPlane.value / 1000;\n\n\t\t\t}\n\n\n\t\t\tlet width = window.innerWidth;\n\t\t\tlet height = window.innerHeight;\n\n\t\t\tif ( cameraAttribute.AspectWidth !== undefined && cameraAttribute.AspectHeight !== undefined ) {\n\n\t\t\t\twidth = cameraAttribute.AspectWidth.value;\n\t\t\t\theight = cameraAttribute.AspectHeight.value;\n\n\t\t\t}\n\n\t\t\tconst aspect = width / height;\n\n\t\t\tlet fov = 45;\n\t\t\tif ( cameraAttribute.FieldOfView !== undefined ) {\n\n\t\t\t\tfov = cameraAttribute.FieldOfView.value;\n\n\t\t\t}\n\n\t\t\tconst focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 0: // Perspective\n\t\t\t\t\tmodel = new PerspectiveCamera( fov, aspect, nearClippingPlane, farClippingPlane );\n\t\t\t\t\tif ( focalLength !== null ) model.setFocalLength( focalLength );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // Orthographic\n\t\t\t\t\tmodel = new OrthographicCamera( - width / 2, width / 2, height / 2, - height / 2, nearClippingPlane, farClippingPlane );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown camera type ' + type + '.' );\n\t\t\t\t\tmodel = new Object3D();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\t// Create a DirectionalLight, PointLight or SpotLight\n\tcreateLight( relationships ) {\n\n\t\tlet model;\n\t\tlet lightAttribute;\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\tlightAttribute = attr;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( lightAttribute === undefined ) {\n\n\t\t\tmodel = new Object3D();\n\n\t\t} else {\n\n\t\t\tlet type;\n\n\t\t\t// LightType can be undefined for Point lights\n\t\t\tif ( lightAttribute.LightType === undefined ) {\n\n\t\t\t\ttype = 0;\n\n\t\t\t} else {\n\n\t\t\t\ttype = lightAttribute.LightType.value;\n\n\t\t\t}\n\n\t\t\tlet color = 0xffffff;\n\n\t\t\tif ( lightAttribute.Color !== undefined ) {\n\n\t\t\t\tcolor = new Color().fromArray( lightAttribute.Color.value ).convertSRGBToLinear();\n\n\t\t\t}\n\n\t\t\tlet intensity = ( lightAttribute.Intensity === undefined ) ? 1 : lightAttribute.Intensity.value / 100;\n\n\t\t\t// light disabled\n\t\t\tif ( lightAttribute.CastLightOnObject !== undefined && lightAttribute.CastLightOnObject.value === 0 ) {\n\n\t\t\t\tintensity = 0;\n\n\t\t\t}\n\n\t\t\tlet distance = 0;\n\t\t\tif ( lightAttribute.FarAttenuationEnd !== undefined ) {\n\n\t\t\t\tif ( lightAttribute.EnableFarAttenuation !== undefined && lightAttribute.EnableFarAttenuation.value === 0 ) {\n\n\t\t\t\t\tdistance = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdistance = lightAttribute.FarAttenuationEnd.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// TODO: could this be calculated linearly from FarAttenuationStart to FarAttenuationEnd?\n\t\t\tconst decay = 1;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 0: // Point\n\t\t\t\t\tmodel = new PointLight( color, intensity, distance, decay );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // Directional\n\t\t\t\t\tmodel = new DirectionalLight( color, intensity );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // Spot\n\t\t\t\t\tlet angle = Math.PI / 3;\n\n\t\t\t\t\tif ( lightAttribute.InnerAngle !== undefined ) {\n\n\t\t\t\t\t\tangle = MathUtils.degToRad( lightAttribute.InnerAngle.value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet penumbra = 0;\n\t\t\t\t\tif ( lightAttribute.OuterAngle !== undefined ) {\n\n\t\t\t\t\t\t// TODO: this is not correct - FBX calculates outer and inner angle in degrees\n\t\t\t\t\t\t// with OuterAngle > InnerAngle && OuterAngle <= Math.PI\n\t\t\t\t\t\t// while three.js uses a penumbra between (0, 1) to attenuate the inner angle\n\t\t\t\t\t\tpenumbra = MathUtils.degToRad( lightAttribute.OuterAngle.value );\n\t\t\t\t\t\tpenumbra = Math.max( penumbra, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmodel = new SpotLight( color, intensity, distance, angle, penumbra, decay );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown light type ' + lightAttribute.LightType.value + ', defaulting to a PointLight.' );\n\t\t\t\t\tmodel = new PointLight( color, intensity );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( lightAttribute.CastShadows !== undefined && lightAttribute.CastShadows.value === 1 ) {\n\n\t\t\t\tmodel.castShadow = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\tcreateMesh( relationships, geometryMap, materialMap ) {\n\n\t\tlet model;\n\t\tlet geometry = null;\n\t\tlet material = null;\n\t\tconst materials = [];\n\n\t\t// get geometry and materials(s) from connections\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tif ( geometryMap.has( child.ID ) ) {\n\n\t\t\t\tgeometry = geometryMap.get( child.ID );\n\n\t\t\t}\n\n\t\t\tif ( materialMap.has( child.ID ) ) {\n\n\t\t\t\tmaterials.push( materialMap.get( child.ID ) );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( materials.length > 1 ) {\n\n\t\t\tmaterial = materials;\n\n\t\t} else if ( materials.length > 0 ) {\n\n\t\t\tmaterial = materials[ 0 ];\n\n\t\t} else {\n\n\t\t\tmaterial = new MeshPhongMaterial( {\n\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\tcolor: 0xcccccc\n\t\t\t} );\n\t\t\tmaterials.push( material );\n\n\t\t}\n\n\t\tif ( 'color' in geometry.attributes ) {\n\n\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( geometry.FBX_Deformer ) {\n\n\t\t\tmodel = new SkinnedMesh( geometry, material );\n\t\t\tmodel.normalizeSkinWeights();\n\n\t\t} else {\n\n\t\t\tmodel = new Mesh( geometry, material );\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\tcreateCurve( relationships, geometryMap ) {\n\n\t\tconst geometry = relationships.children.reduce( function ( geo, child ) {\n\n\t\t\tif ( geometryMap.has( child.ID ) ) geo = geometryMap.get( child.ID );\n\n\t\t\treturn geo;\n\n\t\t}, null );\n\n\t\t// FBX does not list materials for Nurbs lines, so we'll just put our own in here.\n\t\tconst material = new LineBasicMaterial( {\n\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\tcolor: 0x3300ff,\n\t\t\tlinewidth: 1\n\t\t} );\n\t\treturn new Line( geometry, material );\n\n\t}\n\n\t// parse the model node for transform data\n\tgetTransformData( model, modelNode ) {\n\n\t\tconst transformData = {};\n\n\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\telse transformData.eulerOrder = 'ZYX';\n\n\t\tif ( 'Lcl_Translation' in modelNode ) transformData.translation = modelNode.Lcl_Translation.value;\n\n\t\tif ( 'PreRotation' in modelNode ) transformData.preRotation = modelNode.PreRotation.value;\n\t\tif ( 'Lcl_Rotation' in modelNode ) transformData.rotation = modelNode.Lcl_Rotation.value;\n\t\tif ( 'PostRotation' in modelNode ) transformData.postRotation = modelNode.PostRotation.value;\n\n\t\tif ( 'Lcl_Scaling' in modelNode ) transformData.scale = modelNode.Lcl_Scaling.value;\n\n\t\tif ( 'ScalingOffset' in modelNode ) transformData.scalingOffset = modelNode.ScalingOffset.value;\n\t\tif ( 'ScalingPivot' in modelNode ) transformData.scalingPivot = modelNode.ScalingPivot.value;\n\n\t\tif ( 'RotationOffset' in modelNode ) transformData.rotationOffset = modelNode.RotationOffset.value;\n\t\tif ( 'RotationPivot' in modelNode ) transformData.rotationPivot = modelNode.RotationPivot.value;\n\n\t\tmodel.userData.transformData = transformData;\n\n\t}\n\n\tsetLookAtProperties( model, modelNode ) {\n\n\t\tif ( 'LookAtProperty' in modelNode ) {\n\n\t\t\tconst children = connections.get( model.ID ).children;\n\n\t\t\tchildren.forEach( function ( child ) {\n\n\t\t\t\tif ( child.relationship === 'LookAtProperty' ) {\n\n\t\t\t\t\tconst lookAtTarget = fbxTree.Objects.Model[ child.ID ];\n\n\t\t\t\t\tif ( 'Lcl_Translation' in lookAtTarget ) {\n\n\t\t\t\t\t\tconst pos = lookAtTarget.Lcl_Translation.value;\n\n\t\t\t\t\t\t// DirectionalLight, SpotLight\n\t\t\t\t\t\tif ( model.target !== undefined ) {\n\n\t\t\t\t\t\t\tmodel.target.position.fromArray( pos );\n\t\t\t\t\t\t\tsceneGraph.add( model.target );\n\n\t\t\t\t\t\t} else { // Cameras and other Object3Ds\n\n\t\t\t\t\t\t\tmodel.lookAt( new Vector3().fromArray( pos ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tbindSkeleton( skeletons, geometryMap, modelMap ) {\n\n\t\tconst bindMatrices = this.parsePoseNodes();\n\n\t\tfor ( const ID in skeletons ) {\n\n\t\t\tconst skeleton = skeletons[ ID ];\n\n\t\t\tconst parents = connections.get( parseInt( skeleton.ID ) ).parents;\n\n\t\t\tparents.forEach( function ( parent ) {\n\n\t\t\t\tif ( geometryMap.has( parent.ID ) ) {\n\n\t\t\t\t\tconst geoID = parent.ID;\n\t\t\t\t\tconst geoRelationships = connections.get( geoID );\n\n\t\t\t\t\tgeoRelationships.parents.forEach( function ( geoConnParent ) {\n\n\t\t\t\t\t\tif ( modelMap.has( geoConnParent.ID ) ) {\n\n\t\t\t\t\t\t\tconst model = modelMap.get( geoConnParent.ID );\n\n\t\t\t\t\t\t\tmodel.bind( new Skeleton( skeleton.bones ), bindMatrices[ geoConnParent.ID ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tparsePoseNodes() {\n\n\t\tconst bindMatrices = {};\n\n\t\tif ( 'Pose' in fbxTree.Objects ) {\n\n\t\t\tconst BindPoseNode = fbxTree.Objects.Pose;\n\n\t\t\tfor ( const nodeID in BindPoseNode ) {\n\n\t\t\t\tif ( BindPoseNode[ nodeID ].attrType === 'BindPose' && BindPoseNode[ nodeID ].NbPoseNodes > 0 ) {\n\n\t\t\t\t\tconst poseNodes = BindPoseNode[ nodeID ].PoseNode;\n\n\t\t\t\t\tif ( Array.isArray( poseNodes ) ) {\n\n\t\t\t\t\t\tposeNodes.forEach( function ( poseNode ) {\n\n\t\t\t\t\t\t\tbindMatrices[ poseNode.Node ] = new Matrix4().fromArray( poseNode.Matrix.a );\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbindMatrices[ poseNodes.Node ] = new Matrix4().fromArray( poseNodes.Matrix.a );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bindMatrices;\n\n\t}\n\n\taddGlobalSceneSettings() {\n\n\t\tif ( 'GlobalSettings' in fbxTree ) {\n\n\t\t\tif ( 'AmbientColor' in fbxTree.GlobalSettings ) {\n\n\t\t\t\t// Parse ambient color - if it's not set to black (default), create an ambient light\n\n\t\t\t\tconst ambientColor = fbxTree.GlobalSettings.AmbientColor.value;\n\t\t\t\tconst r = ambientColor[ 0 ];\n\t\t\t\tconst g = ambientColor[ 1 ];\n\t\t\t\tconst b = ambientColor[ 2 ];\n\n\t\t\t\tif ( r !== 0 || g !== 0 || b !== 0 ) {\n\n\t\t\t\t\tconst color = new Color( r, g, b ).convertSRGBToLinear();\n\t\t\t\t\tsceneGraph.add( new AmbientLight( color, 1 ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( 'UnitScaleFactor' in fbxTree.GlobalSettings ) {\n\n\t\t\t\tsceneGraph.userData.unitScaleFactor = fbxTree.GlobalSettings.UnitScaleFactor.value;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n// parse Geometry data from FBXTree and return map of BufferGeometries\nclass GeometryParser {\n\n\tconstructor() {\n\n\t\tthis.negativeMaterialIndices = false;\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Geometry\n\tparse( deformers ) {\n\n\t\tconst geometryMap = new Map();\n\n\t\tif ( 'Geometry' in fbxTree.Objects ) {\n\n\t\t\tconst geoNodes = fbxTree.Objects.Geometry;\n\n\t\t\tfor ( const nodeID in geoNodes ) {\n\n\t\t\t\tconst relationships = connections.get( parseInt( nodeID ) );\n\t\t\t\tconst geo = this.parseGeometry( relationships, geoNodes[ nodeID ], deformers );\n\n\t\t\t\tgeometryMap.set( parseInt( nodeID ), geo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// report warnings\n\n\t\tif ( this.negativeMaterialIndices === true ) {\n\n\t\t\tconsole.warn( 'THREE.FBXLoader: The FBX file contains invalid (negative) material indices. The asset might not render as expected.' );\n\n\t\t}\n\n\t\treturn geometryMap;\n\n\t}\n\n\t// Parse single node in FBXTree.Objects.Geometry\n\tparseGeometry( relationships, geoNode, deformers ) {\n\n\t\tswitch ( geoNode.attrType ) {\n\n\t\t\tcase 'Mesh':\n\t\t\t\treturn this.parseMeshGeometry( relationships, geoNode, deformers );\n\t\t\t\tbreak;\n\n\t\t\tcase 'NurbsCurve':\n\t\t\t\treturn this.parseNurbsGeometry( geoNode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t// Parse single node mesh geometry in FBXTree.Objects.Geometry\n\tparseMeshGeometry( relationships, geoNode, deformers ) {\n\n\t\tconst skeletons = deformers.skeletons;\n\t\tconst morphTargets = [];\n\n\t\tconst modelNodes = relationships.parents.map( function ( parent ) {\n\n\t\t\treturn fbxTree.Objects.Model[ parent.ID ];\n\n\t\t} );\n\n\t\t// don't create geometry if it is not associated with any models\n\t\tif ( modelNodes.length === 0 ) return;\n\n\t\tconst skeleton = relationships.children.reduce( function ( skeleton, child ) {\n\n\t\t\tif ( skeletons[ child.ID ] !== undefined ) skeleton = skeletons[ child.ID ];\n\n\t\t\treturn skeleton;\n\n\t\t}, null );\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tif ( deformers.morphTargets[ child.ID ] !== undefined ) {\n\n\t\t\t\tmorphTargets.push( deformers.morphTargets[ child.ID ] );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// Assume one model and get the preRotation from that\n\t\t// if there is more than one model associated with the geometry this may cause problems\n\t\tconst modelNode = modelNodes[ 0 ];\n\n\t\tconst transformData = {};\n\n\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\tif ( 'GeometricTranslation' in modelNode ) transformData.translation = modelNode.GeometricTranslation.value;\n\t\tif ( 'GeometricRotation' in modelNode ) transformData.rotation = modelNode.GeometricRotation.value;\n\t\tif ( 'GeometricScaling' in modelNode ) transformData.scale = modelNode.GeometricScaling.value;\n\n\t\tconst transform = generateTransform( transformData );\n\n\t\treturn this.genGeometry( geoNode, skeleton, morphTargets, transform );\n\n\t}\n\n\t// Generate a BufferGeometry from a node in FBXTree.Objects.Geometry\n\tgenGeometry( geoNode, skeleton, morphTargets, preTransform ) {\n\n\t\tconst geo = new BufferGeometry();\n\t\tif ( geoNode.attrName ) geo.name = geoNode.attrName;\n\n\t\tconst geoInfo = this.parseGeoNode( geoNode, skeleton );\n\t\tconst buffers = this.genBuffers( geoInfo );\n\n\t\tconst positionAttribute = new Float32BufferAttribute( buffers.vertex, 3 );\n\n\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\tgeo.setAttribute( 'position', positionAttribute );\n\n\t\tif ( buffers.colors.length > 0 ) {\n\n\t\t\tgeo.setAttribute( 'color', new Float32BufferAttribute( buffers.colors, 3 ) );\n\n\t\t}\n\n\t\tif ( skeleton ) {\n\n\t\t\tgeo.setAttribute( 'skinIndex', new Uint16BufferAttribute( buffers.weightsIndices, 4 ) );\n\n\t\t\tgeo.setAttribute( 'skinWeight', new Float32BufferAttribute( buffers.vertexWeights, 4 ) );\n\n\t\t\t// used later to bind the skeleton to the model\n\t\t\tgeo.FBX_Deformer = skeleton;\n\n\t\t}\n\n\t\tif ( buffers.normal.length > 0 ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( preTransform );\n\n\t\t\tconst normalAttribute = new Float32BufferAttribute( buffers.normal, 3 );\n\t\t\tnormalAttribute.applyNormalMatrix( normalMatrix );\n\n\t\t\tgeo.setAttribute( 'normal', normalAttribute );\n\n\t\t}\n\n\t\tbuffers.uvs.forEach( function ( uvBuffer, i ) {\n\n\t\t\tconst name = i === 0 ? 'uv' : `uv${ i }`;\n\n\t\t\tgeo.setAttribute( name, new Float32BufferAttribute( buffers.uvs[ i ], 2 ) );\n\n\t\t} );\n\n\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t// Convert the material indices of each vertex into rendering groups on the geometry.\n\t\t\tlet prevMaterialIndex = buffers.materialIndex[ 0 ];\n\t\t\tlet startIndex = 0;\n\n\t\t\tbuffers.materialIndex.forEach( function ( currentIndex, i ) {\n\n\t\t\t\tif ( currentIndex !== prevMaterialIndex ) {\n\n\t\t\t\t\tgeo.addGroup( startIndex, i - startIndex, prevMaterialIndex );\n\n\t\t\t\t\tprevMaterialIndex = currentIndex;\n\t\t\t\t\tstartIndex = i;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t// the loop above doesn't add the last group, do that here.\n\t\t\tif ( geo.groups.length > 0 ) {\n\n\t\t\t\tconst lastGroup = geo.groups[ geo.groups.length - 1 ];\n\t\t\t\tconst lastIndex = lastGroup.start + lastGroup.count;\n\n\t\t\t\tif ( lastIndex !== buffers.materialIndex.length ) {\n\n\t\t\t\t\tgeo.addGroup( lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// case where there are multiple materials but the whole geometry is only\n\t\t\t// using one of them\n\t\t\tif ( geo.groups.length === 0 ) {\n\n\t\t\t\tgeo.addGroup( 0, buffers.materialIndex.length, buffers.materialIndex[ 0 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addMorphTargets( geo, geoNode, morphTargets, preTransform );\n\n\t\treturn geo;\n\n\t}\n\n\tparseGeoNode( geoNode, skeleton ) {\n\n\t\tconst geoInfo = {};\n\n\t\tgeoInfo.vertexPositions = ( geoNode.Vertices !== undefined ) ? geoNode.Vertices.a : [];\n\t\tgeoInfo.vertexIndices = ( geoNode.PolygonVertexIndex !== undefined ) ? geoNode.PolygonVertexIndex.a : [];\n\n\t\tif ( geoNode.LayerElementColor ) {\n\n\t\t\tgeoInfo.color = this.parseVertexColors( geoNode.LayerElementColor[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementMaterial ) {\n\n\t\t\tgeoInfo.material = this.parseMaterialIndices( geoNode.LayerElementMaterial[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementNormal ) {\n\n\t\t\tgeoInfo.normal = this.parseNormals( geoNode.LayerElementNormal[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementUV ) {\n\n\t\t\tgeoInfo.uv = [];\n\n\t\t\tlet i = 0;\n\t\t\twhile ( geoNode.LayerElementUV[ i ] ) {\n\n\t\t\t\tif ( geoNode.LayerElementUV[ i ].UV ) {\n\n\t\t\t\t\tgeoInfo.uv.push( this.parseUVs( geoNode.LayerElementUV[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeoInfo.weightTable = {};\n\n\t\tif ( skeleton !== null ) {\n\n\t\t\tgeoInfo.skeleton = skeleton;\n\n\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t// loop over the bone's vertex indices and weights\n\t\t\t\trawBone.indices.forEach( function ( index, j ) {\n\n\t\t\t\t\tif ( geoInfo.weightTable[ index ] === undefined ) geoInfo.weightTable[ index ] = [];\n\n\t\t\t\t\tgeoInfo.weightTable[ index ].push( {\n\n\t\t\t\t\t\tid: i,\n\t\t\t\t\t\tweight: rawBone.weights[ j ],\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn geoInfo;\n\n\t}\n\n\tgenBuffers( geoInfo ) {\n\n\t\tconst buffers = {\n\t\t\tvertex: [],\n\t\t\tnormal: [],\n\t\t\tcolors: [],\n\t\t\tuvs: [],\n\t\t\tmaterialIndex: [],\n\t\t\tvertexWeights: [],\n\t\t\tweightsIndices: [],\n\t\t};\n\n\t\tlet polygonIndex = 0;\n\t\tlet faceLength = 0;\n\t\tlet displayedWeightsWarning = false;\n\n\t\t// these will hold data for a single face\n\t\tlet facePositionIndexes = [];\n\t\tlet faceNormals = [];\n\t\tlet faceColors = [];\n\t\tlet faceUVs = [];\n\t\tlet faceWeights = [];\n\t\tlet faceWeightIndices = [];\n\n\t\tconst scope = this;\n\t\tgeoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {\n\n\t\t\tlet materialIndex;\n\t\t\tlet endOfFace = false;\n\n\t\t\t// Face index and vertex index arrays are combined in a single array\n\t\t\t// A cube with quad faces looks like this:\n\t\t\t// PolygonVertexIndex: *24 {\n\t\t\t//  a: 0, 1, 3, -3, 2, 3, 5, -5, 4, 5, 7, -7, 6, 7, 1, -1, 1, 7, 5, -4, 6, 0, 2, -5\n\t\t\t//  }\n\t\t\t// Negative numbers mark the end of a face - first face here is 0, 1, 3, -3\n\t\t\t// to find index of last vertex bit shift the index: ^ - 1\n\t\t\tif ( vertexIndex < 0 ) {\n\n\t\t\t\tvertexIndex = vertexIndex ^ - 1; // equivalent to ( x * -1 ) - 1\n\t\t\t\tendOfFace = true;\n\n\t\t\t}\n\n\t\t\tlet weightIndices = [];\n\t\t\tlet weights = [];\n\n\t\t\tfacePositionIndexes.push( vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2 );\n\n\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color );\n\n\t\t\t\tfaceColors.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\tif ( geoInfo.weightTable[ vertexIndex ] !== undefined ) {\n\n\t\t\t\t\tgeoInfo.weightTable[ vertexIndex ].forEach( function ( wt ) {\n\n\t\t\t\t\t\tweights.push( wt.weight );\n\t\t\t\t\t\tweightIndices.push( wt.id );\n\n\t\t\t\t\t} );\n\n\n\t\t\t\t}\n\n\t\t\t\tif ( weights.length > 4 ) {\n\n\t\t\t\t\tif ( ! displayedWeightsWarning ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights.' );\n\t\t\t\t\t\tdisplayedWeightsWarning = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst wIndex = [ 0, 0, 0, 0 ];\n\t\t\t\t\tconst Weight = [ 0, 0, 0, 0 ];\n\n\t\t\t\t\tweights.forEach( function ( weight, weightIndex ) {\n\n\t\t\t\t\t\tlet currentWeight = weight;\n\t\t\t\t\t\tlet currentIndex = weightIndices[ weightIndex ];\n\n\t\t\t\t\t\tWeight.forEach( function ( comparedWeight, comparedWeightIndex, comparedWeightArray ) {\n\n\t\t\t\t\t\t\tif ( currentWeight > comparedWeight ) {\n\n\t\t\t\t\t\t\t\tcomparedWeightArray[ comparedWeightIndex ] = currentWeight;\n\t\t\t\t\t\t\t\tcurrentWeight = comparedWeight;\n\n\t\t\t\t\t\t\t\tconst tmp = wIndex[ comparedWeightIndex ];\n\t\t\t\t\t\t\t\twIndex[ comparedWeightIndex ] = currentIndex;\n\t\t\t\t\t\t\t\tcurrentIndex = tmp;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tweightIndices = wIndex;\n\t\t\t\t\tweights = Weight;\n\n\t\t\t\t}\n\n\t\t\t\t// if the weight array is shorter than 4 pad with 0s\n\t\t\t\twhile ( weights.length < 4 ) {\n\n\t\t\t\t\tweights.push( 0 );\n\t\t\t\t\tweightIndices.push( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 4; ++ i ) {\n\n\t\t\t\t\tfaceWeights.push( weights[ i ] );\n\t\t\t\t\tfaceWeightIndices.push( weightIndices[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal );\n\n\t\t\t\tfaceNormals.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\tmaterialIndex = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material )[ 0 ];\n\n\t\t\t\tif ( materialIndex < 0 ) {\n\n\t\t\t\t\tscope.negativeMaterialIndices = true;\n\t\t\t\t\tmaterialIndex = 0; // fallback\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\tgeoInfo.uv.forEach( function ( uv, i ) {\n\n\t\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, uv );\n\n\t\t\t\t\tif ( faceUVs[ i ] === undefined ) {\n\n\t\t\t\t\t\tfaceUVs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceUVs[ i ].push( data[ 0 ] );\n\t\t\t\t\tfaceUVs[ i ].push( data[ 1 ] );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfaceLength ++;\n\n\t\t\tif ( endOfFace ) {\n\n\t\t\t\tscope.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );\n\n\t\t\t\tpolygonIndex ++;\n\t\t\t\tfaceLength = 0;\n\n\t\t\t\t// reset arrays for the next face\n\t\t\t\tfacePositionIndexes = [];\n\t\t\t\tfaceNormals = [];\n\t\t\t\tfaceColors = [];\n\t\t\t\tfaceUVs = [];\n\t\t\t\tfaceWeights = [];\n\t\t\t\tfaceWeightIndices = [];\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn buffers;\n\n\t}\n\n\t// See https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal\n\tgetNormalNewell( vertices ) {\n\n\t\tconst normal = new Vector3( 0.0, 0.0, 0.0 );\n\n\t\tfor ( let i = 0; i < vertices.length; i ++ ) {\n\n\t\t\tconst current = vertices[ i ];\n\t\t\tconst next = vertices[ ( i + 1 ) % vertices.length ];\n\n\t\t\tnormal.x += ( current.y - next.y ) * ( current.z + next.z );\n\t\t\tnormal.y += ( current.z - next.z ) * ( current.x + next.x );\n\t\t\tnormal.z += ( current.x - next.x ) * ( current.y + next.y );\n\n\t\t}\n\n\t\tnormal.normalize();\n\n\t\treturn normal;\n\n\t}\n\n\tgetNormalTangentAndBitangent( vertices ) {\n\n\t\tconst normalVector = this.getNormalNewell( vertices );\n\t\t// Avoid up being equal or almost equal to normalVector\n\t\tconst up = Math.abs( normalVector.z ) > 0.5 ? new Vector3( 0.0, 1.0, 0.0 ) : new Vector3( 0.0, 0.0, 1.0 );\n\t\tconst tangent = up.cross( normalVector ).normalize();\n\t\tconst bitangent = normalVector.clone().cross( tangent ).normalize();\n\n\t\treturn {\n\t\t\tnormal: normalVector,\n\t\t\ttangent: tangent,\n\t\t\tbitangent: bitangent\n\t\t};\n\n\t}\n\n\tflattenVertex( vertex, normalTangent, normalBitangent ) {\n\n\t\treturn new Vector2(\n\t\t\tvertex.dot( normalTangent ),\n\t\t\tvertex.dot( normalBitangent )\n\t\t);\n\n\t}\n\n\t// Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris\n\tgenFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength ) {\n\n\t\tlet triangles;\n\n\t\tif ( faceLength > 3 ) {\n\n\t\t\t// Triangulate n-gon using earcut\n\n\t\t\tconst vertices = [];\n\n\t\t\tfor ( let i = 0; i < facePositionIndexes.length; i += 3 ) {\n\n\t\t\t\tvertices.push( new Vector3(\n\t\t\t\t\tgeoInfo.vertexPositions[ facePositionIndexes[ i ] ],\n\t\t\t\t\tgeoInfo.vertexPositions[ facePositionIndexes[ i + 1 ] ],\n\t\t\t\t\tgeoInfo.vertexPositions[ facePositionIndexes[ i + 2 ] ]\n\t\t\t\t) );\n\n\t\t\t}\n\n\t\t\tconst { tangent, bitangent } = this.getNormalTangentAndBitangent( vertices );\n\t\t\tconst triangulationInput = [];\n\n\t\t\tfor ( const vertex of vertices ) {\n\n\t\t\t\ttriangulationInput.push( this.flattenVertex( vertex, tangent, bitangent ) );\n\n\t\t\t}\n\n\t\t\ttriangles = ShapeUtils.triangulateShape( triangulationInput, [] );\n\n\t\t} else {\n\n\t\t\t// Regular triangle, skip earcut triangulation step\n\t\t\ttriangles = [[ 0, 1, 2 ]];\n\n\t\t}\n\n\t\tfor ( const [ i0, i1, i2 ] of triangles ) {\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 + 2 ] ] );\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 + 2 ] ] );\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 + 2 ] ] );\n\n\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 3 ] );\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 3 ] );\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 3 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 + 2 ] );\n\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 + 2 ] );\n\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 + 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 + 2 ] );\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 + 2 ] );\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 + 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\tgeoInfo.uv.forEach( function ( uv, j ) {\n\n\t\t\t\t\tif ( buffers.uvs[ j ] === undefined ) buffers.uvs[ j ] = [];\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i0 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i0 * 2 + 1 ] );\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i1 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i1 * 2 + 1 ] );\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i2 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i2 * 2 + 1 ] );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\taddMorphTargets( parentGeo, parentGeoNode, morphTargets, preTransform ) {\n\n\t\tif ( morphTargets.length === 0 ) return;\n\n\t\tparentGeo.morphTargetsRelative = true;\n\n\t\tparentGeo.morphAttributes.position = [];\n\t\t// parentGeo.morphAttributes.normal = []; // not implemented\n\n\t\tconst scope = this;\n\t\tmorphTargets.forEach( function ( morphTarget ) {\n\n\t\t\tmorphTarget.rawTargets.forEach( function ( rawTarget ) {\n\n\t\t\t\tconst morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];\n\n\t\t\t\tif ( morphGeoNode !== undefined ) {\n\n\t\t\t\t\tscope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t// a morph geometry node is similar to a standard  node, and the node is also contained\n\t// in FBXTree.Objects.Geometry, however it can only have attributes for position, normal\n\t// and a special attribute Index defining which vertices of the original geometry are affected\n\t// Normal and position attributes only have data for the vertices that are affected by the morph\n\tgenMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, name ) {\n\n\t\tconst vertexIndices = ( parentGeoNode.PolygonVertexIndex !== undefined ) ? parentGeoNode.PolygonVertexIndex.a : [];\n\n\t\tconst morphPositionsSparse = ( morphGeoNode.Vertices !== undefined ) ? morphGeoNode.Vertices.a : [];\n\t\tconst indices = ( morphGeoNode.Indexes !== undefined ) ? morphGeoNode.Indexes.a : [];\n\n\t\tconst length = parentGeo.attributes.position.count * 3;\n\t\tconst morphPositions = new Float32Array( length );\n\n\t\tfor ( let i = 0; i < indices.length; i ++ ) {\n\n\t\t\tconst morphIndex = indices[ i ] * 3;\n\n\t\t\tmorphPositions[ morphIndex ] = morphPositionsSparse[ i * 3 ];\n\t\t\tmorphPositions[ morphIndex + 1 ] = morphPositionsSparse[ i * 3 + 1 ];\n\t\t\tmorphPositions[ morphIndex + 2 ] = morphPositionsSparse[ i * 3 + 2 ];\n\n\t\t}\n\n\t\t// TODO: add morph normal support\n\t\tconst morphGeoInfo = {\n\t\t\tvertexIndices: vertexIndices,\n\t\t\tvertexPositions: morphPositions,\n\n\t\t};\n\n\t\tconst morphBuffers = this.genBuffers( morphGeoInfo );\n\n\t\tconst positionAttribute = new Float32BufferAttribute( morphBuffers.vertex, 3 );\n\t\tpositionAttribute.name = name || morphGeoNode.attrName;\n\n\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\tparentGeo.morphAttributes.position.push( positionAttribute );\n\n\t}\n\n\t// Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists\n\tparseNormals( NormalNode ) {\n\n\t\tconst mappingType = NormalNode.MappingInformationType;\n\t\tconst referenceType = NormalNode.ReferenceInformationType;\n\t\tconst buffer = NormalNode.Normals.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tif ( 'NormalIndex' in NormalNode ) {\n\n\t\t\t\tindexBuffer = NormalNode.NormalIndex.a;\n\n\t\t\t} else if ( 'NormalsIndex' in NormalNode ) {\n\n\t\t\t\tindexBuffer = NormalNode.NormalsIndex.a;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 3,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists\n\tparseUVs( UVNode ) {\n\n\t\tconst mappingType = UVNode.MappingInformationType;\n\t\tconst referenceType = UVNode.ReferenceInformationType;\n\t\tconst buffer = UVNode.UV.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tindexBuffer = UVNode.UVIndex.a;\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 2,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists\n\tparseVertexColors( ColorNode ) {\n\n\t\tconst mappingType = ColorNode.MappingInformationType;\n\t\tconst referenceType = ColorNode.ReferenceInformationType;\n\t\tconst buffer = ColorNode.Colors.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tindexBuffer = ColorNode.ColorIndex.a;\n\n\t\t}\n\n\t\tfor ( let i = 0, c = new Color(); i < buffer.length; i += 4 ) {\n\n\t\t\tc.fromArray( buffer, i ).convertSRGBToLinear().toArray( buffer, i );\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 4,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists\n\tparseMaterialIndices( MaterialNode ) {\n\n\t\tconst mappingType = MaterialNode.MappingInformationType;\n\t\tconst referenceType = MaterialNode.ReferenceInformationType;\n\n\t\tif ( mappingType === 'NoMappingInformation' ) {\n\n\t\t\treturn {\n\t\t\t\tdataSize: 1,\n\t\t\t\tbuffer: [ 0 ],\n\t\t\t\tindices: [ 0 ],\n\t\t\t\tmappingType: 'AllSame',\n\t\t\t\treferenceType: referenceType\n\t\t\t};\n\n\t\t}\n\n\t\tconst materialIndexBuffer = MaterialNode.Materials.a;\n\n\t\t// Since materials are stored as indices, there's a bit of a mismatch between FBX and what\n\t\t// we expect.So we create an intermediate buffer that points to the index in the buffer,\n\t\t// for conforming with the other functions we've written for other data.\n\t\tconst materialIndices = [];\n\n\t\tfor ( let i = 0; i < materialIndexBuffer.length; ++ i ) {\n\n\t\t\tmaterialIndices.push( i );\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 1,\n\t\t\tbuffer: materialIndexBuffer,\n\t\t\tindices: materialIndices,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Generate a NurbGeometry from a node in FBXTree.Objects.Geometry\n\tparseNurbsGeometry( geoNode ) {\n\n\t\tconst order = parseInt( geoNode.Order );\n\n\t\tif ( isNaN( order ) ) {\n\n\t\t\tconsole.error( 'THREE.FBXLoader: Invalid Order %s given for geometry ID: %s', geoNode.Order, geoNode.id );\n\t\t\treturn new BufferGeometry();\n\n\t\t}\n\n\t\tconst degree = order - 1;\n\n\t\tconst knots = geoNode.KnotVector.a;\n\t\tconst controlPoints = [];\n\t\tconst pointsValues = geoNode.Points.a;\n\n\t\tfor ( let i = 0, l = pointsValues.length; i < l; i += 4 ) {\n\n\t\t\tcontrolPoints.push( new Vector4().fromArray( pointsValues, i ) );\n\n\t\t}\n\n\t\tlet startKnot, endKnot;\n\n\t\tif ( geoNode.Form === 'Closed' ) {\n\n\t\t\tcontrolPoints.push( controlPoints[ 0 ] );\n\n\t\t} else if ( geoNode.Form === 'Periodic' ) {\n\n\t\t\tstartKnot = degree;\n\t\t\tendKnot = knots.length - 1 - startKnot;\n\n\t\t\tfor ( let i = 0; i < degree; ++ i ) {\n\n\t\t\t\tcontrolPoints.push( controlPoints[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst curve = new NURBSCurve( degree, knots, controlPoints, startKnot, endKnot );\n\t\tconst points = curve.getPoints( controlPoints.length * 12 );\n\n\t\treturn new BufferGeometry().setFromPoints( points );\n\n\t}\n\n}\n\n// parse animation data from FBXTree\nclass AnimationParser {\n\n\t// take raw animation clips and turn them into three.js animation clips\n\tparse() {\n\n\t\tconst animationClips = [];\n\n\t\tconst rawClips = this.parseClips();\n\n\t\tif ( rawClips !== undefined ) {\n\n\t\t\tfor ( const key in rawClips ) {\n\n\t\t\t\tconst rawClip = rawClips[ key ];\n\n\t\t\t\tconst clip = this.addClip( rawClip );\n\n\t\t\t\tanimationClips.push( clip );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animationClips;\n\n\t}\n\n\tparseClips() {\n\n\t\t// since the actual transformation data is stored in FBXTree.Objects.AnimationCurve,\n\t\t// if this is undefined we can safely assume there are no animations\n\t\tif ( fbxTree.Objects.AnimationCurve === undefined ) return undefined;\n\n\t\tconst curveNodesMap = this.parseAnimationCurveNodes();\n\n\t\tthis.parseAnimationCurves( curveNodesMap );\n\n\t\tconst layersMap = this.parseAnimationLayers( curveNodesMap );\n\t\tconst rawClips = this.parseAnimStacks( layersMap );\n\n\t\treturn rawClips;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationCurveNode\n\t// each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation )\n\t// and is referenced by an AnimationLayer\n\tparseAnimationCurveNodes() {\n\n\t\tconst rawCurveNodes = fbxTree.Objects.AnimationCurveNode;\n\n\t\tconst curveNodesMap = new Map();\n\n\t\tfor ( const nodeID in rawCurveNodes ) {\n\n\t\t\tconst rawCurveNode = rawCurveNodes[ nodeID ];\n\n\t\t\tif ( rawCurveNode.attrName.match( /S|R|T|DeformPercent/ ) !== null ) {\n\n\t\t\t\tconst curveNode = {\n\n\t\t\t\t\tid: rawCurveNode.id,\n\t\t\t\t\tattr: rawCurveNode.attrName,\n\t\t\t\t\tcurves: {},\n\n\t\t\t\t};\n\n\t\t\t\tcurveNodesMap.set( curveNode.id, curveNode );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn curveNodesMap;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationCurve and connect them up to\n\t// previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated\n\t// axis ( e.g. times and values of x rotation)\n\tparseAnimationCurves( curveNodesMap ) {\n\n\t\tconst rawCurves = fbxTree.Objects.AnimationCurve;\n\n\t\t// TODO: Many values are identical up to roundoff error, but won't be optimised\n\t\t// e.g. position times: [0, 0.4, 0. 8]\n\t\t// position values: [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.235384487103147e-7, 93.67520904541016, -0.9982695579528809]\n\t\t// clearly, this should be optimised to\n\t\t// times: [0], positions [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809]\n\t\t// this shows up in nearly every FBX file, and generally time array is length > 100\n\n\t\tfor ( const nodeID in rawCurves ) {\n\n\t\t\tconst animationCurve = {\n\n\t\t\t\tid: rawCurves[ nodeID ].id,\n\t\t\t\ttimes: rawCurves[ nodeID ].KeyTime.a.map( convertFBXTimeToSeconds ),\n\t\t\t\tvalues: rawCurves[ nodeID ].KeyValueFloat.a,\n\n\t\t\t};\n\n\t\t\tconst relationships = connections.get( animationCurve.id );\n\n\t\t\tif ( relationships !== undefined ) {\n\n\t\t\t\tconst animationCurveID = relationships.parents[ 0 ].ID;\n\t\t\t\tconst animationCurveRelationship = relationships.parents[ 0 ].relationship;\n\n\t\t\t\tif ( animationCurveRelationship.match( /X/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'x' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /Y/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'y' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /Z/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'z' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /DeformPercent/ ) && curveNodesMap.has( animationCurveID ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'morph' ] = animationCurve;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references\n\t// to various AnimationCurveNodes and is referenced by an AnimationStack node\n\t// note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack\n\tparseAnimationLayers( curveNodesMap ) {\n\n\t\tconst rawLayers = fbxTree.Objects.AnimationLayer;\n\n\t\tconst layersMap = new Map();\n\n\t\tfor ( const nodeID in rawLayers ) {\n\n\t\t\tconst layerCurveNodes = [];\n\n\t\t\tconst connection = connections.get( parseInt( nodeID ) );\n\n\t\t\tif ( connection !== undefined ) {\n\n\t\t\t\t// all the animationCurveNodes used in the layer\n\t\t\t\tconst children = connection.children;\n\n\t\t\t\tchildren.forEach( function ( child, i ) {\n\n\t\t\t\t\tif ( curveNodesMap.has( child.ID ) ) {\n\n\t\t\t\t\t\tconst curveNode = curveNodesMap.get( child.ID );\n\n\t\t\t\t\t\t// check that the curves are defined for at least one axis, otherwise ignore the curveNode\n\t\t\t\t\t\tif ( curveNode.curves.x !== undefined || curveNode.curves.y !== undefined || curveNode.curves.z !== undefined ) {\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconst modelID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tif ( modelID !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tconst rawModel = fbxTree.Objects.Model[ modelID.toString() ];\n\n\t\t\t\t\t\t\t\t\tif ( rawModel === undefined ) {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered a unused curve.', child );\n\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst node = {\n\n\t\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\t\tID: rawModel.id,\n\t\t\t\t\t\t\t\t\t\tinitialPosition: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\tinitialRotation: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\tinitialScale: [ 1, 1, 1 ],\n\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\tsceneGraph.traverse( function ( child ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( child.ID === rawModel.id ) {\n\n\t\t\t\t\t\t\t\t\t\t\tnode.transform = child.matrix;\n\n\t\t\t\t\t\t\t\t\t\t\tif ( child.userData.transformData ) node.eulerOrder = child.userData.transformData.eulerOrder;\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t\tif ( ! node.transform ) node.transform = new Matrix4();\n\n\t\t\t\t\t\t\t\t\t// if the animated model is pre rotated, we'll have to apply the pre rotations to every\n\t\t\t\t\t\t\t\t\t// animation value as well\n\t\t\t\t\t\t\t\t\tif ( 'PreRotation' in rawModel ) node.preRotation = rawModel.PreRotation.value;\n\t\t\t\t\t\t\t\t\tif ( 'PostRotation' in rawModel ) node.postRotation = rawModel.PostRotation.value;\n\n\t\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] ) layerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t} else if ( curveNode.curves.morph !== undefined ) {\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconst deformerID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tconst morpherID = connections.get( deformerID ).parents[ 0 ].ID;\n\t\t\t\t\t\t\t\tconst geoID = connections.get( morpherID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\t// assuming geometry is not used in more than one model\n\t\t\t\t\t\t\t\tconst modelID = connections.get( geoID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tconst rawModel = fbxTree.Objects.Model[ modelID ];\n\n\t\t\t\t\t\t\t\tconst node = {\n\n\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\tmorphName: fbxTree.Objects.Deformer[ deformerID ].attrName,\n\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlayerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tlayersMap.set( parseInt( nodeID ), layerCurveNodes );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn layersMap;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation\n\t// hierarchy. Each Stack node will be used to create a AnimationClip\n\tparseAnimStacks( layersMap ) {\n\n\t\tconst rawStacks = fbxTree.Objects.AnimationStack;\n\n\t\t// connect the stacks (clips) up to the layers\n\t\tconst rawClips = {};\n\n\t\tfor ( const nodeID in rawStacks ) {\n\n\t\t\tconst children = connections.get( parseInt( nodeID ) ).children;\n\n\t\t\tif ( children.length > 1 ) {\n\n\t\t\t\t// it seems like stacks will always be associated with a single layer. But just in case there are files\n\t\t\t\t// where there are multiple layers per stack, we'll display a warning\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers.' );\n\n\t\t\t}\n\n\t\t\tconst layer = layersMap.get( children[ 0 ].ID );\n\n\t\t\trawClips[ nodeID ] = {\n\n\t\t\t\tname: rawStacks[ nodeID ].attrName,\n\t\t\t\tlayer: layer,\n\n\t\t\t};\n\n\t\t}\n\n\t\treturn rawClips;\n\n\t}\n\n\taddClip( rawClip ) {\n\n\t\tlet tracks = [];\n\n\t\tconst scope = this;\n\t\trawClip.layer.forEach( function ( rawTracks ) {\n\n\t\t\ttracks = tracks.concat( scope.generateTracks( rawTracks ) );\n\n\t\t} );\n\n\t\treturn new AnimationClip( rawClip.name, - 1, tracks );\n\n\t}\n\n\tgenerateTracks( rawTracks ) {\n\n\t\tconst tracks = [];\n\n\t\tlet initialPosition = new Vector3();\n\t\tlet initialScale = new Vector3();\n\n\t\tif ( rawTracks.transform ) rawTracks.transform.decompose( initialPosition, new Quaternion(), initialScale );\n\n\t\tinitialPosition = initialPosition.toArray();\n\t\tinitialScale = initialScale.toArray();\n\n\t\tif ( rawTracks.T !== undefined && Object.keys( rawTracks.T.curves ).length > 0 ) {\n\n\t\t\tconst positionTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.T.curves, initialPosition, 'position' );\n\t\t\tif ( positionTrack !== undefined ) tracks.push( positionTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.R !== undefined && Object.keys( rawTracks.R.curves ).length > 0 ) {\n\n\t\t\tconst rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder );\n\t\t\tif ( rotationTrack !== undefined ) tracks.push( rotationTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.S !== undefined && Object.keys( rawTracks.S.curves ).length > 0 ) {\n\n\t\t\tconst scaleTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.S.curves, initialScale, 'scale' );\n\t\t\tif ( scaleTrack !== undefined ) tracks.push( scaleTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.DeformPercent !== undefined ) {\n\n\t\t\tconst morphTrack = this.generateMorphTrack( rawTracks );\n\t\t\tif ( morphTrack !== undefined ) tracks.push( morphTrack );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\tgenerateVectorTrack( modelName, curves, initialValue, type ) {\n\n\t\tconst times = this.getTimesForAllAxes( curves );\n\t\tconst values = this.getKeyframeTrackValues( times, curves, initialValue );\n\n\t\treturn new VectorKeyframeTrack( modelName + '.' + type, times, values );\n\n\t}\n\n\tgenerateRotationTrack( modelName, curves, preRotation, postRotation, eulerOrder ) {\n\n\t\tlet times;\n\t\tlet values;\n\n\t\tif ( curves.x !== undefined && curves.y !== undefined && curves.z !== undefined ) {\n\n\t\t\tconst result = this.interpolateRotations( curves.x, curves.y, curves.z, eulerOrder );\n\n\t\t\ttimes = result[ 0 ];\n\t\t\tvalues = result[ 1 ];\n\n\t\t}\n\n\t\tif ( preRotation !== undefined ) {\n\n\t\t\tpreRotation = preRotation.map( MathUtils.degToRad );\n\t\t\tpreRotation.push( eulerOrder );\n\n\t\t\tpreRotation = new Euler().fromArray( preRotation );\n\t\t\tpreRotation = new Quaternion().setFromEuler( preRotation );\n\n\t\t}\n\n\t\tif ( postRotation !== undefined ) {\n\n\t\t\tpostRotation = postRotation.map( MathUtils.degToRad );\n\t\t\tpostRotation.push( eulerOrder );\n\n\t\t\tpostRotation = new Euler().fromArray( postRotation );\n\t\t\tpostRotation = new Quaternion().setFromEuler( postRotation ).invert();\n\n\t\t}\n\n\t\tconst quaternion = new Quaternion();\n\t\tconst euler = new Euler();\n\n\t\tconst quaternionValues = [];\n\n\t\tif ( ! values || ! times ) return new QuaternionKeyframeTrack( modelName + '.quaternion', [ 0 ], [ 0 ] );\n\n\t\tfor ( let i = 0; i < values.length; i += 3 ) {\n\n\t\t\teuler.set( values[ i ], values[ i + 1 ], values[ i + 2 ], eulerOrder );\n\t\t\tquaternion.setFromEuler( euler );\n\n\t\t\tif ( preRotation !== undefined ) quaternion.premultiply( preRotation );\n\t\t\tif ( postRotation !== undefined ) quaternion.multiply( postRotation );\n\n\t\t\t// Check unroll\n\t\t\tif ( i > 2 ) {\n\n\t\t\t\tconst prevQuat = new Quaternion().fromArray(\n\t\t\t\t\tquaternionValues,\n\t\t\t\t\t( ( i - 3 ) / 3 ) * 4\n\t\t\t\t);\n\n\t\t\t\tif ( prevQuat.dot( quaternion ) < 0 ) {\n\n\t\t\t\t\tquaternion.set( - quaternion.x, - quaternion.y, - quaternion.z, - quaternion.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tquaternion.toArray( quaternionValues, ( i / 3 ) * 4 );\n\n\t\t}\n\n\t\treturn new QuaternionKeyframeTrack( modelName + '.quaternion', times, quaternionValues );\n\n\t}\n\n\tgenerateMorphTrack( rawTracks ) {\n\n\t\tconst curves = rawTracks.DeformPercent.curves.morph;\n\t\tconst values = curves.values.map( function ( val ) {\n\n\t\t\treturn val / 100;\n\n\t\t} );\n\n\t\tconst morphNum = sceneGraph.getObjectByName( rawTracks.modelName ).morphTargetDictionary[ rawTracks.morphName ];\n\n\t\treturn new NumberKeyframeTrack( rawTracks.modelName + '.morphTargetInfluences[' + morphNum + ']', curves.times, values );\n\n\t}\n\n\t// For all animated objects, times are defined separately for each axis\n\t// Here we'll combine the times into one sorted array without duplicates\n\tgetTimesForAllAxes( curves ) {\n\n\t\tlet times = [];\n\n\t\t// first join together the times for each axis, if defined\n\t\tif ( curves.x !== undefined ) times = times.concat( curves.x.times );\n\t\tif ( curves.y !== undefined ) times = times.concat( curves.y.times );\n\t\tif ( curves.z !== undefined ) times = times.concat( curves.z.times );\n\n\t\t// then sort them\n\t\ttimes = times.sort( function ( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t} );\n\n\t\t// and remove duplicates\n\t\tif ( times.length > 1 ) {\n\n\t\t\tlet targetIndex = 1;\n\t\t\tlet lastValue = times[ 0 ];\n\t\t\tfor ( let i = 1; i < times.length; i ++ ) {\n\n\t\t\t\tconst currentValue = times[ i ];\n\t\t\t\tif ( currentValue !== lastValue ) {\n\n\t\t\t\t\ttimes[ targetIndex ] = currentValue;\n\t\t\t\t\tlastValue = currentValue;\n\t\t\t\t\ttargetIndex ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttimes = times.slice( 0, targetIndex );\n\n\t\t}\n\n\t\treturn times;\n\n\t}\n\n\tgetKeyframeTrackValues( times, curves, initialValue ) {\n\n\t\tconst prevValue = initialValue;\n\n\t\tconst values = [];\n\n\t\tlet xIndex = - 1;\n\t\tlet yIndex = - 1;\n\t\tlet zIndex = - 1;\n\n\t\ttimes.forEach( function ( time ) {\n\n\t\t\tif ( curves.x ) xIndex = curves.x.times.indexOf( time );\n\t\t\tif ( curves.y ) yIndex = curves.y.times.indexOf( time );\n\t\t\tif ( curves.z ) zIndex = curves.z.times.indexOf( time );\n\n\t\t\t// if there is an x value defined for this frame, use that\n\t\t\tif ( xIndex !== - 1 ) {\n\n\t\t\t\tconst xValue = curves.x.values[ xIndex ];\n\t\t\t\tvalues.push( xValue );\n\t\t\t\tprevValue[ 0 ] = xValue;\n\n\t\t\t} else {\n\n\t\t\t\t// otherwise use the x value from the previous frame\n\t\t\t\tvalues.push( prevValue[ 0 ] );\n\n\t\t\t}\n\n\t\t\tif ( yIndex !== - 1 ) {\n\n\t\t\t\tconst yValue = curves.y.values[ yIndex ];\n\t\t\t\tvalues.push( yValue );\n\t\t\t\tprevValue[ 1 ] = yValue;\n\n\t\t\t} else {\n\n\t\t\t\tvalues.push( prevValue[ 1 ] );\n\n\t\t\t}\n\n\t\t\tif ( zIndex !== - 1 ) {\n\n\t\t\t\tconst zValue = curves.z.values[ zIndex ];\n\t\t\t\tvalues.push( zValue );\n\t\t\t\tprevValue[ 2 ] = zValue;\n\n\t\t\t} else {\n\n\t\t\t\tvalues.push( prevValue[ 2 ] );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn values;\n\n\t}\n\n\t// Rotations are defined as Euler angles which can have values  of any size\n\t// These will be converted to quaternions which don't support values greater than\n\t// PI, so we'll interpolate large rotations\n\tinterpolateRotations( curvex, curvey, curvez, eulerOrder ) {\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\t// Add first frame\n\t\ttimes.push( curvex.times[ 0 ] );\n\t\tvalues.push( MathUtils.degToRad( curvex.values[ 0 ] ) );\n\t\tvalues.push( MathUtils.degToRad( curvey.values[ 0 ] ) );\n\t\tvalues.push( MathUtils.degToRad( curvez.values[ 0 ] ) );\n\n\t\tfor ( let i = 1; i < curvex.values.length; i ++ ) {\n\n\t\t\tconst initialValue = [\n\t\t\t\tcurvex.values[ i - 1 ],\n\t\t\t\tcurvey.values[ i - 1 ],\n\t\t\t\tcurvez.values[ i - 1 ],\n\t\t\t];\n\n\t\t\tif ( isNaN( initialValue[ 0 ] ) || isNaN( initialValue[ 1 ] ) || isNaN( initialValue[ 2 ] ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst initialValueRad = initialValue.map( MathUtils.degToRad );\n\n\t\t\tconst currentValue = [\n\t\t\t\tcurvex.values[ i ],\n\t\t\t\tcurvey.values[ i ],\n\t\t\t\tcurvez.values[ i ],\n\t\t\t];\n\n\t\t\tif ( isNaN( currentValue[ 0 ] ) || isNaN( currentValue[ 1 ] ) || isNaN( currentValue[ 2 ] ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValueRad = currentValue.map( MathUtils.degToRad );\n\n\t\t\tconst valuesSpan = [\n\t\t\t\tcurrentValue[ 0 ] - initialValue[ 0 ],\n\t\t\t\tcurrentValue[ 1 ] - initialValue[ 1 ],\n\t\t\t\tcurrentValue[ 2 ] - initialValue[ 2 ],\n\t\t\t];\n\n\t\t\tconst absoluteSpan = [\n\t\t\t\tMath.abs( valuesSpan[ 0 ] ),\n\t\t\t\tMath.abs( valuesSpan[ 1 ] ),\n\t\t\t\tMath.abs( valuesSpan[ 2 ] ),\n\t\t\t];\n\n\t\t\tif ( absoluteSpan[ 0 ] >= 180 || absoluteSpan[ 1 ] >= 180 || absoluteSpan[ 2 ] >= 180 ) {\n\n\t\t\t\tconst maxAbsSpan = Math.max( ...absoluteSpan );\n\n\t\t\t\tconst numSubIntervals = maxAbsSpan / 180;\n\n\t\t\t\tconst E1 = new Euler( ...initialValueRad, eulerOrder );\n\t\t\t\tconst E2 = new Euler( ...currentValueRad, eulerOrder );\n\n\t\t\t\tconst Q1 = new Quaternion().setFromEuler( E1 );\n\t\t\t\tconst Q2 = new Quaternion().setFromEuler( E2 );\n\n\t\t\t\t// Check unroll\n\t\t\t\tif ( Q1.dot( Q2 ) ) {\n\n\t\t\t\t\tQ2.set( - Q2.x, - Q2.y, - Q2.z, - Q2.w );\n\n\t\t\t\t}\n\n\t\t\t\t// Interpolate\n\t\t\t\tconst initialTime = curvex.times[ i - 1 ];\n\t\t\t\tconst timeSpan = curvex.times[ i ] - initialTime;\n\n\t\t\t\tconst Q = new Quaternion();\n\t\t\t\tconst E = new Euler();\n\t\t\t\tfor ( let t = 0; t < 1; t += 1 / numSubIntervals ) {\n\n\t\t\t\t\tQ.copy( Q1.clone().slerp( Q2.clone(), t ) );\n\n\t\t\t\t\ttimes.push( initialTime + t * timeSpan );\n\t\t\t\t\tE.setFromQuaternion( Q, eulerOrder );\n\n\t\t\t\t\tvalues.push( E.x );\n\t\t\t\t\tvalues.push( E.y );\n\t\t\t\t\tvalues.push( E.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttimes.push( curvex.times[ i ] );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvex.values[ i ] ) );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvey.values[ i ] ) );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvez.values[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn [ times, values ];\n\n\t}\n\n}\n\n// parse an FBX file in ASCII format\nclass TextParser {\n\n\tgetPrevNode() {\n\n\t\treturn this.nodeStack[ this.currentIndent - 2 ];\n\n\t}\n\n\tgetCurrentNode() {\n\n\t\treturn this.nodeStack[ this.currentIndent - 1 ];\n\n\t}\n\n\tgetCurrentProp() {\n\n\t\treturn this.currentProp;\n\n\t}\n\n\tpushStack( node ) {\n\n\t\tthis.nodeStack.push( node );\n\t\tthis.currentIndent += 1;\n\n\t}\n\n\tpopStack() {\n\n\t\tthis.nodeStack.pop();\n\t\tthis.currentIndent -= 1;\n\n\t}\n\n\tsetCurrentProp( val, name ) {\n\n\t\tthis.currentProp = val;\n\t\tthis.currentPropName = name;\n\n\t}\n\n\tparse( text ) {\n\n\t\tthis.currentIndent = 0;\n\n\t\tthis.allNodes = new FBXTree();\n\t\tthis.nodeStack = [];\n\t\tthis.currentProp = [];\n\t\tthis.currentPropName = '';\n\n\t\tconst scope = this;\n\n\t\tconst split = text.split( /[\\r\\n]+/ );\n\n\t\tsplit.forEach( function ( line, i ) {\n\n\t\t\tconst matchComment = line.match( /^[\\s\\t]*;/ );\n\t\t\tconst matchEmpty = line.match( /^[\\s\\t]*$/ );\n\n\t\t\tif ( matchComment || matchEmpty ) return;\n\n\t\t\tconst matchBeginning = line.match( '^\\\\t{' + scope.currentIndent + '}(\\\\w+):(.*){', '' );\n\t\t\tconst matchProperty = line.match( '^\\\\t{' + ( scope.currentIndent ) + '}(\\\\w+):[\\\\s\\\\t\\\\r\\\\n](.*)' );\n\t\t\tconst matchEnd = line.match( '^\\\\t{' + ( scope.currentIndent - 1 ) + '}}' );\n\n\t\t\tif ( matchBeginning ) {\n\n\t\t\t\tscope.parseNodeBegin( line, matchBeginning );\n\n\t\t\t} else if ( matchProperty ) {\n\n\t\t\t\tscope.parseNodeProperty( line, matchProperty, split[ ++ i ] );\n\n\t\t\t} else if ( matchEnd ) {\n\n\t\t\t\tscope.popStack();\n\n\t\t\t} else if ( line.match( /^[^\\s\\t}]/ ) ) {\n\n\t\t\t\t// large arrays are split over multiple lines terminated with a ',' character\n\t\t\t\t// if this is encountered the line needs to be joined to the previous line\n\t\t\t\tscope.parseNodePropertyContinued( line );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this.allNodes;\n\n\t}\n\n\tparseNodeBegin( line, property ) {\n\n\t\tconst nodeName = property[ 1 ].trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\tconst nodeAttrs = property[ 2 ].split( ',' ).map( function ( attr ) {\n\n\t\t\treturn attr.trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\t} );\n\n\t\tconst node = { name: nodeName };\n\t\tconst attrs = this.parseNodeAttr( nodeAttrs );\n\n\t\tconst currentNode = this.getCurrentNode();\n\n\t\t// a top node\n\t\tif ( this.currentIndent === 0 ) {\n\n\t\t\tthis.allNodes.add( nodeName, node );\n\n\t\t} else { // a subnode\n\n\t\t\t// if the subnode already exists, append it\n\t\t\tif ( nodeName in currentNode ) {\n\n\t\t\t\t// special case Pose needs PoseNodes as an array\n\t\t\t\tif ( nodeName === 'PoseNode' ) {\n\n\t\t\t\t\tcurrentNode.PoseNode.push( node );\n\n\t\t\t\t} else if ( currentNode[ nodeName ].id !== undefined ) {\n\n\t\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\t\tcurrentNode[ nodeName ][ currentNode[ nodeName ].id ] = currentNode[ nodeName ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( attrs.id !== '' ) currentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t} else if ( typeof attrs.id === 'number' ) {\n\n\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\tcurrentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t} else if ( nodeName !== 'Properties70' ) {\n\n\t\t\t\tif ( nodeName === 'PoseNode' )\tcurrentNode[ nodeName ] = [ node ];\n\t\t\t\telse currentNode[ nodeName ] = node;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( typeof attrs.id === 'number' ) node.id = attrs.id;\n\t\tif ( attrs.name !== '' ) node.attrName = attrs.name;\n\t\tif ( attrs.type !== '' ) node.attrType = attrs.type;\n\n\t\tthis.pushStack( node );\n\n\t}\n\n\tparseNodeAttr( attrs ) {\n\n\t\tlet id = attrs[ 0 ];\n\n\t\tif ( attrs[ 0 ] !== '' ) {\n\n\t\t\tid = parseInt( attrs[ 0 ] );\n\n\t\t\tif ( isNaN( id ) ) {\n\n\t\t\t\tid = attrs[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet name = '', type = '';\n\n\t\tif ( attrs.length > 1 ) {\n\n\t\t\tname = attrs[ 1 ].replace( /^(\\w+)::/, '' );\n\t\t\ttype = attrs[ 2 ];\n\n\t\t}\n\n\t\treturn { id: id, name: name, type: type };\n\n\t}\n\n\tparseNodeProperty( line, property, contentLine ) {\n\n\t\tlet propName = property[ 1 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\t\tlet propValue = property[ 2 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\n\t\t// for special case: base64 image data follows \"Content: ,\" line\n\t\t//\tContent: ,\n\t\t//\t \"/9j/4RDaRXhpZgAATU0A...\"\n\t\tif ( propName === 'Content' && propValue === ',' ) {\n\n\t\t\tpropValue = contentLine.replace( /\"/g, '' ).replace( /,$/, '' ).trim();\n\n\t\t}\n\n\t\tconst currentNode = this.getCurrentNode();\n\t\tconst parentName = currentNode.name;\n\n\t\tif ( parentName === 'Properties70' ) {\n\n\t\t\tthis.parseNodeSpecialProperty( line, propName, propValue );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Connections\n\t\tif ( propName === 'C' ) {\n\n\t\t\tconst connProps = propValue.split( ',' ).slice( 1 );\n\t\t\tconst from = parseInt( connProps[ 0 ] );\n\t\t\tconst to = parseInt( connProps[ 1 ] );\n\n\t\t\tlet rest = propValue.split( ',' ).slice( 3 );\n\n\t\t\trest = rest.map( function ( elem ) {\n\n\t\t\t\treturn elem.trim().replace( /^\"/, '' );\n\n\t\t\t} );\n\n\t\t\tpropName = 'connections';\n\t\t\tpropValue = [ from, to ];\n\t\t\tappend( propValue, rest );\n\n\t\t\tif ( currentNode[ propName ] === undefined ) {\n\n\t\t\t\tcurrentNode[ propName ] = [];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Node\n\t\tif ( propName === 'Node' ) currentNode.id = propValue;\n\n\t\t// connections\n\t\tif ( propName in currentNode && Array.isArray( currentNode[ propName ] ) ) {\n\n\t\t\tcurrentNode[ propName ].push( propValue );\n\n\t\t} else {\n\n\t\t\tif ( propName !== 'a' ) currentNode[ propName ] = propValue;\n\t\t\telse currentNode.a = propValue;\n\n\t\t}\n\n\t\tthis.setCurrentProp( currentNode, propName );\n\n\t\t// convert string to array, unless it ends in ',' in which case more will be added to it\n\t\tif ( propName === 'a' && propValue.slice( - 1 ) !== ',' ) {\n\n\t\t\tcurrentNode.a = parseNumberArray( propValue );\n\n\t\t}\n\n\t}\n\n\tparseNodePropertyContinued( line ) {\n\n\t\tconst currentNode = this.getCurrentNode();\n\n\t\tcurrentNode.a += line;\n\n\t\t// if the line doesn't end in ',' we have reached the end of the property value\n\t\t// so convert the string to an array\n\t\tif ( line.slice( - 1 ) !== ',' ) {\n\n\t\t\tcurrentNode.a = parseNumberArray( currentNode.a );\n\n\t\t}\n\n\t}\n\n\t// parse \"Property70\"\n\tparseNodeSpecialProperty( line, propName, propValue ) {\n\n\t\t// split this\n\t\t// P: \"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\",1,1,1\n\t\t// into array like below\n\t\t// [\"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\", \"1,1,1\" ]\n\t\tconst props = propValue.split( '\",' ).map( function ( prop ) {\n\n\t\t\treturn prop.trim().replace( /^\\\"/, '' ).replace( /\\s/, '_' );\n\n\t\t} );\n\n\t\tconst innerPropName = props[ 0 ];\n\t\tconst innerPropType1 = props[ 1 ];\n\t\tconst innerPropType2 = props[ 2 ];\n\t\tconst innerPropFlag = props[ 3 ];\n\t\tlet innerPropValue = props[ 4 ];\n\n\t\t// cast values where needed, otherwise leave as strings\n\t\tswitch ( innerPropType1 ) {\n\n\t\t\tcase 'int':\n\t\t\tcase 'enum':\n\t\t\tcase 'bool':\n\t\t\tcase 'ULongLong':\n\t\t\tcase 'double':\n\t\t\tcase 'Number':\n\t\t\tcase 'FieldOfView':\n\t\t\t\tinnerPropValue = parseFloat( innerPropValue );\n\t\t\t\tbreak;\n\n\t\t\tcase 'Color':\n\t\t\tcase 'ColorRGB':\n\t\t\tcase 'Vector3D':\n\t\t\tcase 'Lcl_Translation':\n\t\t\tcase 'Lcl_Rotation':\n\t\t\tcase 'Lcl_Scaling':\n\t\t\t\tinnerPropValue = parseNumberArray( innerPropValue );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// CAUTION: these props must append to parent's parent\n\t\tthis.getPrevNode()[ innerPropName ] = {\n\n\t\t\t'type': innerPropType1,\n\t\t\t'type2': innerPropType2,\n\t\t\t'flag': innerPropFlag,\n\t\t\t'value': innerPropValue\n\n\t\t};\n\n\t\tthis.setCurrentProp( this.getPrevNode(), innerPropName );\n\n\t}\n\n}\n\n// Parse an FBX file in Binary format\nclass BinaryParser {\n\n\tparse( buffer ) {\n\n\t\tconst reader = new BinaryReader( buffer );\n\t\treader.skip( 23 ); // skip magic 23 bytes\n\n\t\tconst version = reader.getUint32();\n\n\t\tif ( version < 6400 ) {\n\n\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + version );\n\n\t\t}\n\n\t\tconst allNodes = new FBXTree();\n\n\t\twhile ( ! this.endOfContent( reader ) ) {\n\n\t\t\tconst node = this.parseNode( reader, version );\n\t\t\tif ( node !== null ) allNodes.add( node.name, node );\n\n\t\t}\n\n\t\treturn allNodes;\n\n\t}\n\n\t// Check if reader has reached the end of content.\n\tendOfContent( reader ) {\n\n\t\t// footer size: 160bytes + 16-byte alignment padding\n\t\t// - 16bytes: magic\n\t\t// - padding til 16-byte alignment (at least 1byte?)\n\t\t//\t(seems like some exporters embed fixed 15 or 16bytes?)\n\t\t// - 4bytes: magic\n\t\t// - 4bytes: version\n\t\t// - 120bytes: zero\n\t\t// - 16bytes: magic\n\t\tif ( reader.size() % 16 === 0 ) {\n\n\t\t\treturn ( ( reader.getOffset() + 160 + 16 ) & ~ 0xf ) >= reader.size();\n\n\t\t} else {\n\n\t\t\treturn reader.getOffset() + 160 + 16 >= reader.size();\n\n\t\t}\n\n\t}\n\n\t// recursively parse nodes until the end of the file is reached\n\tparseNode( reader, version ) {\n\n\t\tconst node = {};\n\n\t\t// The first three data sizes depends on version.\n\t\tconst endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\t\tconst numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\n\t\t( version >= 7500 ) ? reader.getUint64() : reader.getUint32(); // the returned propertyListLen is not used\n\n\t\tconst nameLen = reader.getUint8();\n\t\tconst name = reader.getString( nameLen );\n\n\t\t// Regards this node as NULL-record if endOffset is zero\n\t\tif ( endOffset === 0 ) return null;\n\n\t\tconst propertyList = [];\n\n\t\tfor ( let i = 0; i < numProperties; i ++ ) {\n\n\t\t\tpropertyList.push( this.parseProperty( reader ) );\n\n\t\t}\n\n\t\t// Regards the first three elements in propertyList as id, attrName, and attrType\n\t\tconst id = propertyList.length > 0 ? propertyList[ 0 ] : '';\n\t\tconst attrName = propertyList.length > 1 ? propertyList[ 1 ] : '';\n\t\tconst attrType = propertyList.length > 2 ? propertyList[ 2 ] : '';\n\n\t\t// check if this node represents just a single property\n\t\t// like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]}\n\t\tnode.singleProperty = ( numProperties === 1 && reader.getOffset() === endOffset ) ? true : false;\n\n\t\twhile ( endOffset > reader.getOffset() ) {\n\n\t\t\tconst subNode = this.parseNode( reader, version );\n\n\t\t\tif ( subNode !== null ) this.parseSubNode( name, node, subNode );\n\n\t\t}\n\n\t\tnode.propertyList = propertyList; // raw property list used by parent\n\n\t\tif ( typeof id === 'number' ) node.id = id;\n\t\tif ( attrName !== '' ) node.attrName = attrName;\n\t\tif ( attrType !== '' ) node.attrType = attrType;\n\t\tif ( name !== '' ) node.name = name;\n\n\t\treturn node;\n\n\t}\n\n\tparseSubNode( name, node, subNode ) {\n\n\t\t// special case: child node is single property\n\t\tif ( subNode.singleProperty === true ) {\n\n\t\t\tconst value = subNode.propertyList[ 0 ];\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t\tsubNode.a = value;\n\n\t\t\t} else {\n\n\t\t\t\tnode[ subNode.name ] = value;\n\n\t\t\t}\n\n\t\t} else if ( name === 'Connections' && subNode.name === 'C' ) {\n\n\t\t\tconst array = [];\n\n\t\t\tsubNode.propertyList.forEach( function ( property, i ) {\n\n\t\t\t\t// first Connection is FBX type (OO, OP, etc.). We'll discard these\n\t\t\t\tif ( i !== 0 ) array.push( property );\n\n\t\t\t} );\n\n\t\t\tif ( node.connections === undefined ) {\n\n\t\t\t\tnode.connections = [];\n\n\t\t\t}\n\n\t\t\tnode.connections.push( array );\n\n\t\t} else if ( subNode.name === 'Properties70' ) {\n\n\t\t\tconst keys = Object.keys( subNode );\n\n\t\t\tkeys.forEach( function ( key ) {\n\n\t\t\t\tnode[ key ] = subNode[ key ];\n\n\t\t\t} );\n\n\t\t} else if ( name === 'Properties70' && subNode.name === 'P' ) {\n\n\t\t\tlet innerPropName = subNode.propertyList[ 0 ];\n\t\t\tlet innerPropType1 = subNode.propertyList[ 1 ];\n\t\t\tconst innerPropType2 = subNode.propertyList[ 2 ];\n\t\t\tconst innerPropFlag = subNode.propertyList[ 3 ];\n\t\t\tlet innerPropValue;\n\n\t\t\tif ( innerPropName.indexOf( 'Lcl ' ) === 0 ) innerPropName = innerPropName.replace( 'Lcl ', 'Lcl_' );\n\t\t\tif ( innerPropType1.indexOf( 'Lcl ' ) === 0 ) innerPropType1 = innerPropType1.replace( 'Lcl ', 'Lcl_' );\n\n\t\t\tif ( innerPropType1 === 'Color' || innerPropType1 === 'ColorRGB' || innerPropType1 === 'Vector' || innerPropType1 === 'Vector3D' || innerPropType1.indexOf( 'Lcl_' ) === 0 ) {\n\n\t\t\t\tinnerPropValue = [\n\t\t\t\t\tsubNode.propertyList[ 4 ],\n\t\t\t\t\tsubNode.propertyList[ 5 ],\n\t\t\t\t\tsubNode.propertyList[ 6 ]\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\tinnerPropValue = subNode.propertyList[ 4 ];\n\n\t\t\t}\n\n\t\t\t// this will be copied to parent, see above\n\t\t\tnode[ innerPropName ] = {\n\n\t\t\t\t'type': innerPropType1,\n\t\t\t\t'type2': innerPropType2,\n\t\t\t\t'flag': innerPropFlag,\n\t\t\t\t'value': innerPropValue\n\n\t\t\t};\n\n\t\t} else if ( node[ subNode.name ] === undefined ) {\n\n\t\t\tif ( typeof subNode.id === 'number' ) {\n\n\t\t\t\tnode[ subNode.name ] = {};\n\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t} else {\n\n\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( subNode.name === 'PoseNode' ) {\n\n\t\t\t\tif ( ! Array.isArray( node[ subNode.name ] ) ) {\n\n\t\t\t\t\tnode[ subNode.name ] = [ node[ subNode.name ] ];\n\n\t\t\t\t}\n\n\t\t\t\tnode[ subNode.name ].push( subNode );\n\n\t\t\t} else if ( node[ subNode.name ][ subNode.id ] === undefined ) {\n\n\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tparseProperty( reader ) {\n\n\t\tconst type = reader.getString( 1 );\n\t\tlet length;\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 'C':\n\t\t\t\treturn reader.getBoolean();\n\n\t\t\tcase 'D':\n\t\t\t\treturn reader.getFloat64();\n\n\t\t\tcase 'F':\n\t\t\t\treturn reader.getFloat32();\n\n\t\t\tcase 'I':\n\t\t\t\treturn reader.getInt32();\n\n\t\t\tcase 'L':\n\t\t\t\treturn reader.getInt64();\n\n\t\t\tcase 'R':\n\t\t\t\tlength = reader.getUint32();\n\t\t\t\treturn reader.getArrayBuffer( length );\n\n\t\t\tcase 'S':\n\t\t\t\tlength = reader.getUint32();\n\t\t\t\treturn reader.getString( length );\n\n\t\t\tcase 'Y':\n\t\t\t\treturn reader.getInt16();\n\n\t\t\tcase 'b':\n\t\t\tcase 'c':\n\t\t\tcase 'd':\n\t\t\tcase 'f':\n\t\t\tcase 'i':\n\t\t\tcase 'l':\n\n\t\t\t\tconst arrayLength = reader.getUint32();\n\t\t\t\tconst encoding = reader.getUint32(); // 0: non-compressed, 1: compressed\n\t\t\t\tconst compressedLength = reader.getUint32();\n\n\t\t\t\tif ( encoding === 0 ) {\n\n\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'c':\n\t\t\t\t\t\t\treturn reader.getBooleanArray( arrayLength );\n\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\treturn reader.getFloat64Array( arrayLength );\n\n\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\t\treturn reader.getFloat32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'i':\n\t\t\t\t\t\t\treturn reader.getInt32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'l':\n\t\t\t\t\t\t\treturn reader.getInt64Array( arrayLength );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst data = fflate.unzlibSync( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) );\n\t\t\t\tconst reader2 = new BinaryReader( data.buffer );\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'b':\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\treturn reader2.getBooleanArray( arrayLength );\n\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\treturn reader2.getFloat64Array( arrayLength );\n\n\t\t\t\t\tcase 'f':\n\t\t\t\t\t\treturn reader2.getFloat32Array( arrayLength );\n\n\t\t\t\t\tcase 'i':\n\t\t\t\t\t\treturn reader2.getInt32Array( arrayLength );\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\treturn reader2.getInt64Array( arrayLength );\n\n\t\t\t\t}\n\n\t\t\t\tbreak; // cannot happen but is required by the DeepScan\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown property type ' + type );\n\n\t\t}\n\n\t}\n\n}\n\nclass BinaryReader {\n\n\tconstructor( buffer, littleEndian ) {\n\n\t\tthis.dv = new DataView( buffer );\n\t\tthis.offset = 0;\n\t\tthis.littleEndian = ( littleEndian !== undefined ) ? littleEndian : true;\n\t\tthis._textDecoder = new TextDecoder();\n\n\t}\n\n\tgetOffset() {\n\n\t\treturn this.offset;\n\n\t}\n\n\tsize() {\n\n\t\treturn this.dv.buffer.byteLength;\n\n\t}\n\n\tskip( length ) {\n\n\t\tthis.offset += length;\n\n\t}\n\n\t// seems like true/false representation depends on exporter.\n\t// true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54)\n\t// then sees LSB.\n\tgetBoolean() {\n\n\t\treturn ( this.getUint8() & 1 ) === 1;\n\n\t}\n\n\tgetBooleanArray( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getBoolean() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetUint8() {\n\n\t\tconst value = this.dv.getUint8( this.offset );\n\t\tthis.offset += 1;\n\t\treturn value;\n\n\t}\n\n\tgetInt16() {\n\n\t\tconst value = this.dv.getInt16( this.offset, this.littleEndian );\n\t\tthis.offset += 2;\n\t\treturn value;\n\n\t}\n\n\tgetInt32() {\n\n\t\tconst value = this.dv.getInt32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\tgetInt32Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetUint32() {\n\n\t\tconst value = this.dv.getUint32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\t// JavaScript doesn't support 64-bit integer so calculate this here\n\t// 1 << 32 will return 1 so using multiply operation instead here.\n\t// There's a possibility that this method returns wrong value if the value\n\t// is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER.\n\t// TODO: safely handle 64-bit integer\n\tgetInt64() {\n\n\t\tlet low, high;\n\n\t\tif ( this.littleEndian ) {\n\n\t\t\tlow = this.getUint32();\n\t\t\thigh = this.getUint32();\n\n\t\t} else {\n\n\t\t\thigh = this.getUint32();\n\t\t\tlow = this.getUint32();\n\n\t\t}\n\n\t\t// calculate negative value\n\t\tif ( high & 0x80000000 ) {\n\n\t\t\thigh = ~ high & 0xFFFFFFFF;\n\t\t\tlow = ~ low & 0xFFFFFFFF;\n\n\t\t\tif ( low === 0xFFFFFFFF ) high = ( high + 1 ) & 0xFFFFFFFF;\n\n\t\t\tlow = ( low + 1 ) & 0xFFFFFFFF;\n\n\t\t\treturn - ( high * 0x100000000 + low );\n\n\t\t}\n\n\t\treturn high * 0x100000000 + low;\n\n\t}\n\n\tgetInt64Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt64() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\t// Note: see getInt64() comment\n\tgetUint64() {\n\n\t\tlet low, high;\n\n\t\tif ( this.littleEndian ) {\n\n\t\t\tlow = this.getUint32();\n\t\t\thigh = this.getUint32();\n\n\t\t} else {\n\n\t\t\thigh = this.getUint32();\n\t\t\tlow = this.getUint32();\n\n\t\t}\n\n\t\treturn high * 0x100000000 + low;\n\n\t}\n\n\tgetFloat32() {\n\n\t\tconst value = this.dv.getFloat32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\tgetFloat32Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetFloat64() {\n\n\t\tconst value = this.dv.getFloat64( this.offset, this.littleEndian );\n\t\tthis.offset += 8;\n\t\treturn value;\n\n\t}\n\n\tgetFloat64Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat64() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetArrayBuffer( size ) {\n\n\t\tconst value = this.dv.buffer.slice( this.offset, this.offset + size );\n\t\tthis.offset += size;\n\t\treturn value;\n\n\t}\n\n\tgetString( size ) {\n\n\t\tconst start = this.offset;\n\t\tlet a = new Uint8Array( this.dv.buffer, start, size );\n\n\t\tthis.skip( size );\n\n\t\tconst nullByte = a.indexOf( 0 );\n\t\tif ( nullByte >= 0 ) a = new Uint8Array( this.dv.buffer, start, nullByte );\n\n\t\treturn this._textDecoder.decode( a );\n\n\t}\n\n}\n\n// FBXTree holds a representation of the FBX data, returned by the TextParser ( FBX ASCII format)\n// and BinaryParser( FBX Binary format)\nclass FBXTree {\n\n\tadd( key, val ) {\n\n\t\tthis[ key ] = val;\n\n\t}\n\n}\n\n// ************** UTILITY FUNCTIONS **************\n\nfunction isFbxFormatBinary( buffer ) {\n\n\tconst CORRECT = 'Kaydara\\u0020FBX\\u0020Binary\\u0020\\u0020\\0';\n\n\treturn buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString( buffer, 0, CORRECT.length );\n\n}\n\nfunction isFbxFormatASCII( text ) {\n\n\tconst CORRECT = [ 'K', 'a', 'y', 'd', 'a', 'r', 'a', '\\\\', 'F', 'B', 'X', '\\\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\\\', '\\\\' ];\n\n\tlet cursor = 0;\n\n\tfunction read( offset ) {\n\n\t\tconst result = text[ offset - 1 ];\n\t\ttext = text.slice( cursor + offset );\n\t\tcursor ++;\n\t\treturn result;\n\n\t}\n\n\tfor ( let i = 0; i < CORRECT.length; ++ i ) {\n\n\t\tconst num = read( 1 );\n\t\tif ( num === CORRECT[ i ] ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nfunction getFbxVersion( text ) {\n\n\tconst versionRegExp = /FBXVersion: (\\d+)/;\n\tconst match = text.match( versionRegExp );\n\n\tif ( match ) {\n\n\t\tconst version = parseInt( match[ 1 ] );\n\t\treturn version;\n\n\t}\n\n\tthrow new Error( 'THREE.FBXLoader: Cannot find the version number for the file given.' );\n\n}\n\n// Converts FBX ticks into real time seconds.\nfunction convertFBXTimeToSeconds( time ) {\n\n\treturn time / 46186158000;\n\n}\n\nconst dataArray = [];\n\n// extracts the data from the correct position in the FBX array based on indexing type\nfunction getData( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {\n\n\tlet index;\n\n\tswitch ( infoObject.mappingType ) {\n\n\t\tcase 'ByPolygonVertex' :\n\t\t\tindex = polygonVertexIndex;\n\t\t\tbreak;\n\t\tcase 'ByPolygon' :\n\t\t\tindex = polygonIndex;\n\t\t\tbreak;\n\t\tcase 'ByVertice' :\n\t\t\tindex = vertexIndex;\n\t\t\tbreak;\n\t\tcase 'AllSame' :\n\t\t\tindex = infoObject.indices[ 0 ];\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tconsole.warn( 'THREE.FBXLoader: unknown attribute mapping type ' + infoObject.mappingType );\n\n\t}\n\n\tif ( infoObject.referenceType === 'IndexToDirect' ) index = infoObject.indices[ index ];\n\n\tconst from = index * infoObject.dataSize;\n\tconst to = from + infoObject.dataSize;\n\n\treturn slice( dataArray, infoObject.buffer, from, to );\n\n}\n\nconst tempEuler = new Euler();\nconst tempVec = new Vector3();\n\n// generate transformation from FBX transform data\n// ref: https://help.autodesk.com/view/FBX/2017/ENU/?guid=__files_GUID_10CDD63C_79C1_4F2D_BB28_AD2BE65A02ED_htm\n// ref: http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html?url=cpp_ref/_transformations_2main_8cxx-example.html,topicNumber=cpp_ref__transformations_2main_8cxx_example_htmlfc10a1e1-b18d-4e72-9dc0-70d0f1959f5e\nfunction generateTransform( transformData ) {\n\n\tconst lTranslationM = new Matrix4();\n\tconst lPreRotationM = new Matrix4();\n\tconst lRotationM = new Matrix4();\n\tconst lPostRotationM = new Matrix4();\n\n\tconst lScalingM = new Matrix4();\n\tconst lScalingPivotM = new Matrix4();\n\tconst lScalingOffsetM = new Matrix4();\n\tconst lRotationOffsetM = new Matrix4();\n\tconst lRotationPivotM = new Matrix4();\n\n\tconst lParentGX = new Matrix4();\n\tconst lParentLX = new Matrix4();\n\tconst lGlobalT = new Matrix4();\n\n\tconst inheritType = ( transformData.inheritType ) ? transformData.inheritType : 0;\n\n\tif ( transformData.translation ) lTranslationM.setPosition( tempVec.fromArray( transformData.translation ) );\n\n\tif ( transformData.preRotation ) {\n\n\t\tconst array = transformData.preRotation.map( MathUtils.degToRad );\n\t\tarray.push( transformData.eulerOrder || Euler.DEFAULT_ORDER );\n\t\tlPreRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t}\n\n\tif ( transformData.rotation ) {\n\n\t\tconst array = transformData.rotation.map( MathUtils.degToRad );\n\t\tarray.push( transformData.eulerOrder || Euler.DEFAULT_ORDER );\n\t\tlRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t}\n\n\tif ( transformData.postRotation ) {\n\n\t\tconst array = transformData.postRotation.map( MathUtils.degToRad );\n\t\tarray.push( transformData.eulerOrder || Euler.DEFAULT_ORDER );\n\t\tlPostRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\t\tlPostRotationM.invert();\n\n\t}\n\n\tif ( transformData.scale ) lScalingM.scale( tempVec.fromArray( transformData.scale ) );\n\n\t// Pivots and offsets\n\tif ( transformData.scalingOffset ) lScalingOffsetM.setPosition( tempVec.fromArray( transformData.scalingOffset ) );\n\tif ( transformData.scalingPivot ) lScalingPivotM.setPosition( tempVec.fromArray( transformData.scalingPivot ) );\n\tif ( transformData.rotationOffset ) lRotationOffsetM.setPosition( tempVec.fromArray( transformData.rotationOffset ) );\n\tif ( transformData.rotationPivot ) lRotationPivotM.setPosition( tempVec.fromArray( transformData.rotationPivot ) );\n\n\t// parent transform\n\tif ( transformData.parentMatrixWorld ) {\n\n\t\tlParentLX.copy( transformData.parentMatrix );\n\t\tlParentGX.copy( transformData.parentMatrixWorld );\n\n\t}\n\n\tconst lLRM = lPreRotationM.clone().multiply( lRotationM ).multiply( lPostRotationM );\n\t// Global Rotation\n\tconst lParentGRM = new Matrix4();\n\tlParentGRM.extractRotation( lParentGX );\n\n\t// Global Shear*Scaling\n\tconst lParentTM = new Matrix4();\n\tlParentTM.copyPosition( lParentGX );\n\n\tconst lParentGRSM = lParentTM.clone().invert().multiply( lParentGX );\n\tconst lParentGSM = lParentGRM.clone().invert().multiply( lParentGRSM );\n\tconst lLSM = lScalingM;\n\n\tconst lGlobalRS = new Matrix4();\n\n\tif ( inheritType === 0 ) {\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM ).multiply( lLSM );\n\n\t} else if ( inheritType === 1 ) {\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lParentGSM ).multiply( lLRM ).multiply( lLSM );\n\n\t} else {\n\n\t\tconst lParentLSM = new Matrix4().scale( new Vector3().setFromMatrixScale( lParentLX ) );\n\t\tconst lParentLSM_inv = lParentLSM.clone().invert();\n\t\tconst lParentGSM_noLocal = lParentGSM.clone().multiply( lParentLSM_inv );\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM_noLocal ).multiply( lLSM );\n\n\t}\n\n\tconst lRotationPivotM_inv = lRotationPivotM.clone().invert();\n\tconst lScalingPivotM_inv = lScalingPivotM.clone().invert();\n\t// Calculate the local transform matrix\n\tlet lTransform = lTranslationM.clone().multiply( lRotationOffsetM ).multiply( lRotationPivotM ).multiply( lPreRotationM ).multiply( lRotationM ).multiply( lPostRotationM ).multiply( lRotationPivotM_inv ).multiply( lScalingOffsetM ).multiply( lScalingPivotM ).multiply( lScalingM ).multiply( lScalingPivotM_inv );\n\n\tconst lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition( lTransform );\n\n\tconst lGlobalTranslation = lParentGX.clone().multiply( lLocalTWithAllPivotAndOffsetInfo );\n\tlGlobalT.copyPosition( lGlobalTranslation );\n\n\tlTransform = lGlobalT.clone().multiply( lGlobalRS );\n\n\t// from global to local\n\tlTransform.premultiply( lParentGX.invert() );\n\n\treturn lTransform;\n\n}\n\n// Returns the three.js intrinsic Euler order corresponding to FBX extrinsic Euler order\n// ref: http://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_euler_html\nfunction getEulerOrder( order ) {\n\n\torder = order || 0;\n\n\tconst enums = [\n\t\t'ZYX', // -> XYZ extrinsic\n\t\t'YZX', // -> XZY extrinsic\n\t\t'XZY', // -> YZX extrinsic\n\t\t'ZXY', // -> YXZ extrinsic\n\t\t'YXZ', // -> ZXY extrinsic\n\t\t'XYZ', // -> ZYX extrinsic\n\t\t//'SphericXYZ', // not possible to support\n\t];\n\n\tif ( order === 6 ) {\n\n\t\tconsole.warn( 'THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect.' );\n\t\treturn enums[ 0 ];\n\n\t}\n\n\treturn enums[ order ];\n\n}\n\n// Parses comma separated list of numbers and returns them an array.\n// Used internally by the TextParser\nfunction parseNumberArray( value ) {\n\n\tconst array = value.split( ',' ).map( function ( val ) {\n\n\t\treturn parseFloat( val );\n\n\t} );\n\n\treturn array;\n\n}\n\nfunction convertArrayBufferToString( buffer, from, to ) {\n\n\tif ( from === undefined ) from = 0;\n\tif ( to === undefined ) to = buffer.byteLength;\n\n\treturn new TextDecoder().decode( new Uint8Array( buffer, from, to ) );\n\n}\n\nfunction append( a, b ) {\n\n\tfor ( let i = 0, j = a.length, l = b.length; i < l; i ++, j ++ ) {\n\n\t\ta[ j ] = b[ i ];\n\n\t}\n\n}\n\nfunction slice( a, b, from, to ) {\n\n\tfor ( let i = from, j = 0; i < to; i ++, j ++ ) {\n\n\t\ta[ j ] = b[ i ];\n\n\t}\n\n\treturn a;\n\n}\n\n\nexport { FBXLoader };\n","import {FBXLoader} from 'three/examples/jsm/loaders/FBXLoader.js'\nimport {Group, Texture} from 'three'\nimport {whiteImageData} from '../../three'\n\n/**\n * Extended FBXLoader that sets the default image from AssetImporter (for invalid/missing textures)\n */\nexport class FBXLoader2 extends FBXLoader {\n    async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Group> {\n\n        const val = Texture.DEFAULT_IMAGE\n\n        // this will be used when doing new Texture(). Which is done for not found images or when some error happens in loading. See FBXLoader.\n        // todo save the path of invalid textures, check if they can be found in the loaded libs, and ask the user in UI to remap it to something else manually\n        if (!Texture.DEFAULT_IMAGE) Texture.DEFAULT_IMAGE = whiteImageData\n\n        const res = await super.loadAsync(url, onProgress)\n\n        Texture.DEFAULT_IMAGE = val\n\n        return res\n    }\n}\n","import {FileLoader} from 'three'\nimport {unzipSync} from 'three/examples/jsm/libs/fflate.module.js'\n\nexport class ZipLoader extends FileLoader {\n\n    load(url: string, onLoad?: (t: any) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void {\n        this.setResponseType('arraybuffer')\n        return super.load(url, (buffer: any)=>{\n            // const files = blob.arrayBuffer().then(buff => )\n            const files = unzipSync(new Uint8Array(buffer))\n            const map = new Map<string, File>(Object.entries(files).map(([path, fileBuffer]) => {\n                return [path, new File([fileBuffer as any], path)]\n            }))\n            onLoad?.(map)\n        }, onProgress, onError)\n    }\n\n}\n","import type {GLTF, GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {BufferGeometry, Group, Line, LineLoop, LineSegments, LoadingManager, Object3D, Texture} from 'three'\nimport {safeSetProperty} from 'ts-browser-helpers'\nimport {ThreeViewer} from '../../viewer'\nimport {generateUUID, whiteImageData} from '../../three'\nimport {\n    glbEncryptionPreparser,\n    GLTFLightExtrasExtension,\n    GLTFMaterialExtrasExtension,\n    GLTFMaterialsAlphaMapExtension,\n    GLTFMaterialsBumpMapExtension,\n    GLTFMaterialsDisplacementMapExtension,\n    GLTFMaterialsLightMapExtension,\n    GLTFObject3DExtrasExtension,\n    GLTFViewerConfigExtension,\n} from '../gltf'\nimport {RootSceneImportResult} from '../IAssetImporter'\nimport {ILoader} from '../IImporter'\nimport {SerializationMetaType, ThreeSerialization} from '../../utils'\nimport {\n    DirectionalLight2,\n    IObject3D,\n    LineGeometry2,\n    LineMaterial2,\n    LineSegmentsGeometry2,\n    MeshLine,\n    MeshLineSegments,\n    OrthographicCamera0,\n    PerspectiveCamera0,\n    PhysicalMaterial,\n    PointLight2,\n    SpotLight2,\n    UnlitLineMaterial,\n    UnlitMaterial,\n} from '../../core'\nimport {ImportAddOptions} from '../AssetManager'\nimport {AssetImporter} from '../AssetImporter'\n\n// todo move somewhere\nconst supportedEmbeddedFiles = ['hdr', 'exr', 'webp', 'avif', 'ktx', 'hdrpng', 'svg', 'cube', 'ico', 'bmp', 'gif', 'tiff'] // ktx2, drc handled separately\n\nexport class GLTFLoader2 extends GLTFLoader implements ILoader<GLTF, Object3D|undefined> {\n    isGLTFLoader2 = true\n    importOptions?: ImportAddOptions\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.preparsers.push(glbEncryptionPreparser)\n\n        GLTFLoader.ObjectConstructors.DirectionalLight = DirectionalLight2 as any\n        GLTFLoader.ObjectConstructors.PointLight = PointLight2 as any\n        GLTFLoader.ObjectConstructors.SpotLight = SpotLight2 as any\n        GLTFLoader.ObjectConstructors.MeshStandardMaterial = PhysicalMaterial as any\n        GLTFLoader.ObjectConstructors.MeshBasicMaterial = UnlitMaterial as any\n        GLTFLoader.ObjectConstructors.MeshPhysicalMaterial = PhysicalMaterial as any\n        GLTFLoader.ObjectConstructors.LineBasicMaterial = UnlitLineMaterial as any\n        // GLTFLoader.ObjectConstructors.PointsMaterial = PointsMaterial2\n        GLTFLoader.ObjectConstructors.PerspectiveCamera = PerspectiveCamera0 // todo set domElement in the AssetManager during process\n        GLTFLoader.ObjectConstructors.OrthographicCamera = OrthographicCamera0 // todo\n    }\n\n    /**\n     * Saves the current resource path in the gltf document extras/userData, which is then exported along with the asset when its exported using GLTFExporter2.\n     * This value is then used the next time that file is imported to correctly resolve external assets from the original resource path.\n     * [wip]\n     */\n    static ['_EmbedResourcePath'] = false\n    static ['_UseResourcePath'] = true\n\n    static ImportExtensions: ((parser: GLTFParser) => GLTFLoaderPlugin)[] = [\n        GLTFObject3DExtrasExtension.Import,\n        GLTFLightExtrasExtension.Import,\n        GLTFMaterialsBumpMapExtension.Import,\n        GLTFMaterialsDisplacementMapExtension.Import,\n        GLTFMaterialsLightMapExtension.Import,\n        GLTFMaterialsAlphaMapExtension.Import,\n        (p)=>({ // saves the current path as resourcePath in the gltf document extras/userData.\n            name: '_EMBED_RESOURCE_PATH',\n            afterRoot: async(result: GLTF) => {\n                if (!GLTFLoader2._EmbedResourcePath) return\n                const scene = result.scene\n                if (!scene) return\n                // if (result.userData.resourcePath) return // already set to something\n                result.userData.resourcePath = p.options.path\n            },\n        }),\n    ]\n    private _resPathUrlModifier = { // Use the resourcePath saved in extras to resolve embedded assets if required/possible.\n        oldResourcePath: '',\n        newResourcePath: '',\n        modify: (url: string) => {\n            if (!GLTFLoader2._UseResourcePath) return url\n            if (!this._resPathUrlModifier.oldResourcePath) return url\n            if (!this._resPathUrlModifier.newResourcePath) return url\n\n            let old = this._resPathUrlModifier.oldResourcePath\n            const newp = this._resPathUrlModifier.newResourcePath\n            if (old?.startsWith('/')) {\n                // see LoaderUtils.resolveURL\n                if (/^https?:\\/\\//i.test(newp)) {\n                    old = newp.replace(/(^https?:\\/\\/[^/]+).*/i, '$1') + old\n                }\n            }\n\n            if (url.startsWith(old)) {\n                return url.replace(old, newp)\n            }\n            return url\n        },\n    }\n\n    /**\n     * Use {@link MeshLine}(an extension of three.js `Line2`) instead of default `Line` for lines. This allows changing line width and other properties like `dashed`.\n     *\n     * This is the default value for the flag, it can also be controlled by using the `useMeshLines` in the import options.\n     */\n    static UseMeshLines = true\n\n    /**\n     * If true, the loader will create unique names for objects in the gltf file when multiple objects with the same name are found.\n     * This is useful when importing gltf files with multiple objects with the same name, and creating animations for them.\n     * If set to 'auto', it will only create unique names when loading a `rootSceneModelRoot`, i.e. the scene object exported with `AssetExporter`\n     */\n    static CreateUniqueNames: boolean | 'auto' = 'auto'\n\n    /**\n     * Preparsers are run on the arraybuffer/string before parsing to read the glb/gltf data\n     */\n    preparsers: GLTFPreparser[] = []\n\n    static BundledResourcesKey = 'BundledResources'\n    static AllowEmptyFiles = true\n\n    async preparse(data: ArrayBuffer | string, path: string): Promise<ArrayBuffer | string> {\n        for (const preparser of this.preparsers) {\n            data = await preparser.process(data, path)\n        }\n        return data\n    }\n\n    parse(data: ArrayBuffer | string, path: string, onLoad: (gltf: GLTF) => void, onError?: (event: ErrorEvent) => void, url?: string) {\n        this.preparse.call(this, data, url || path)\n            .then((res: ArrayBuffer|string) => {\n                if (!res || !(res as ArrayBuffer).byteLength && typeof res !== 'string') {\n                    // empty file\n                    if (GLTFLoader2.AllowEmptyFiles) {\n                        onLoad && onLoad({scene: new Group(), scenes: [], animations: [], cameras: []} as any)\n                    } else {\n                        onError && onError(new ErrorEvent('GLTFLoader2: empty file'))\n                    }\n                    return\n                }\n\n                const val = Texture.DEFAULT_IMAGE\n\n                // this will be used when doing new Texture(). Which is done for not found images or when some error happens in loading. See FBXLoader.\n                // todo save the path of invalid textures, check if they can be found in the loaded libs, and ask the user in UI to remap it to something else manually\n                if (!Texture.DEFAULT_IMAGE) Texture.DEFAULT_IMAGE = whiteImageData\n\n                const useMeshLines = this.importOptions?.useMeshLines ?? GLTFLoader2.UseMeshLines\n                GLTFLoader.ObjectConstructors.LineBasicMaterial = useMeshLines ? LineMaterial2 as any : UnlitLineMaterial as any\n\n                return res ? super.parse(res, path, (ret)=>{\n                    Texture.DEFAULT_IMAGE = val\n                    GLTFLoader.ObjectConstructors.LineBasicMaterial = useMeshLines ? LineMaterial2 as any : UnlitLineMaterial as any\n\n                    // todo remove after three update\n                    for (const scene of ret.scenes) {\n                        scene.updateMatrixWorld()\n                    }\n\n                    onLoad && onLoad(ret)\n                }, onError) : onError && onError(new ErrorEvent('no data'))\n            })\n            .catch((e: any) => {\n                console.error(e)\n                if (onError) onError(e ?? new ErrorEvent('unknown error'))\n            })\n    }\n\n    /**\n     * This is run post parse to extract the result scene from the GLTF object\n     * @param res\n     * @param _\n     */\n    transform(res: GLTF, options: ImportAddOptions): Object3D|undefined {\n        // todo: support loading of multiple scenes?\n        let scene: RootSceneImportResult|undefined = res ? res.scene || !!res.scenes && res.scenes.length > 0 && res.scenes[0] : undefined as any\n        if (!scene) return undefined\n\n        if (scene && scene.children.length === 1 && !scene.userData?.rootSceneModelRoot && !scene.importedViewerConfig && scene.name === 'AuxScene' && !res.cameras?.length) {\n            scene = scene.children[0] as RootSceneImportResult\n            scene.removeFromParent()\n        }\n        if (!scene.userData) scene.userData = {}\n        if (res.userData) scene.userData.gltfExtras = res.userData\n        if (res.cameras) res.cameras.forEach(c => !c.parent && scene.add(c))\n        if (res.asset) scene.userData.gltfAsset = res.asset\n\n        if (options.importAsModelRoot) {\n            scene.userData.rootSceneModelRoot = true\n        } else if (options.importAsModelRoot === false && scene.userData.rootSceneModelRoot) {\n            delete scene.userData.rootSceneModelRoot\n        }\n\n        const lines: Line[] = []\n        const refMap = new Map<string, Object3D[]>()\n        const geometries = new Set<BufferGeometry>()\n\n        scene.traverse((node: Object3D) => {\n            if (node.userData.gltfUUID) { // saved in GLTFExporter2\n                safeSetProperty(node, 'uuid', node.userData.gltfUUID, true, true)\n                delete node.userData.gltfUUID // have issue with cloning if we don't dispose.\n            }\n            if ((node as Line).isLine) lines.push(node as Line)\n            if (node.uuid) {\n                if (!refMap.has(node.uuid)) refMap.set(node.uuid, [])\n                refMap.get(node.uuid)!.push(node)\n            }\n            if (node.name) {\n                if (!refMap.has(node.name)) refMap.set(node.name, [])\n                refMap.get(node.name)!.push(node)\n            }\n            const obj = node as IObject3D\n            if (obj.geometry && obj.geometry.isBufferGeometry) {\n                if (obj.geometry.userData.isPlaceholder) {\n                    obj.geometry = AssetImporter.DummyGeometry\n                } else {\n                    geometries.add(obj.geometry)\n                }\n            }\n            const mats = Array.isArray(obj.material) ? obj.material : obj.material ? [obj.material] : []\n            for (let i = 0; i < mats.length; i++) {\n                const mat = mats[i]\n                if (mat?.userData.isPlaceholder) {\n                    if (mat.isLineBasicMaterial) {\n                        mats[i] = AssetImporter.DummyLineBasicMaterial\n                    } else if (mat.isLineMaterial) {\n                        mats[i] = AssetImporter.DummyLineMaterial\n                    } else {\n                        mats[i] = AssetImporter.DummyMaterial\n                    }\n                }\n            }\n            if (Array.isArray(obj.material) && obj.material.length) {\n                obj.material = mats\n            } else if (mats.length === 1) {\n                obj.material = mats[0]\n            } else {\n                // material is null\n            }\n        })\n\n        geometries.forEach(geom=>{\n            deserializeUserData(geom, res._bundledResources)\n        })\n\n        if (res.animations.length > 0) {\n            scene.animations = []\n            for (const animation of res.animations) {\n                let f = false\n                // rootRefs is added by GLTFExporter2 when exporting animations, it is an array of uuids or names, it is used to find the root object for the animation\n                if (animation.userData.rootRefs) {\n                    for (const ref of animation.userData.rootRefs) {\n                        const roots = refMap.get(ref) || []\n                        for (const root of roots) {\n                            if (!root.animations) root.animations = []\n                            if (!root.animations.includes(animation)) {\n                                root.animations.push(animation)\n                            }\n                            f = true\n                        }\n                    }\n                    if (f) delete animation.userData.rootRefs // it will be added again with correct data when exporting\n                }\n                if (!f) {\n                    // no root found, add to scene\n                    scene.animations.push(animation)\n                }\n            }\n        }\n\n        const useMeshLines = this.importOptions?.useMeshLines ?? GLTFLoader2.UseMeshLines\n        // todo: move out somewhere else\n        if (useMeshLines) {\n            // convert lines to mesh/fat lines\n            for (const line of lines) {\n                convertToFatLine(line)\n            }\n        }\n\n        scene.importedBundledResources = res._bundledResources\n\n        return scene\n    }\n\n    register(callback: (parser: GLTFParser) => GLTFLoaderPlugin): this {\n        return super.register(callback) as this\n    }\n\n    setup(viewer: ThreeViewer, extraExtensions: ((parser: GLTFParser) => GLTFLoaderPlugin)[]): this {\n        this.register(GLTFMaterialExtrasExtension.Import(viewer.loadConfigResources))\n        for (const ext of extraExtensions) this.register(ext)\n\n        for (const ext of GLTFLoader2.ImportExtensions) this.register(ext)\n\n        // Note: this should be last\n        this.register(this.gltfViewerParser(viewer))\n\n\n        return this\n    }\n\n    // loads the viewer config and handles loading the draco loader for extension\n    gltfViewerParser = (viewer: ThreeViewer): (p: GLTFParser)=>GLTFLoaderPlugin => {\n\n        return (parser: GLTFParser) => { // this is called when the parser is created\n            this._resPathUrlModifier.newResourcePath = parser.options.path\n            this._resPathUrlModifier.oldResourcePath = parser.json?.extras?.resourcePath\n            // in url modifier, see if an asset being loaded starts with userData.resourcePath, if yes, replace it with current resourcePath\n            viewer.assetManager.importer.addURLModifier(this._resPathUrlModifier.modify)\n\n            parser.importOptions = this.importOptions || undefined\n            const getDependency = parser.getDependency\n            parser.getDependency = async(type: string, index: number) => {\n                // deserialize userdata properly. note - this does not do geometry, that's done separately after load\n                const res = await getDependency.call(parser, type, index)\n                deserializeUserData(res, parser.bundledResources)\n                return res\n            }\n            const createUniqueName = parser.createUniqueName\n            parser.createUniqueName = (originalName: string) => {\n                const auto = (parser.importOptions?.createUniqueNames ?? GLTFLoader2.CreateUniqueNames) === 'auto'\n                let cu = false\n                if (auto) {\n                    const isModelRoot = parser.json?.scenes[parser.json.scene ?? 0]?.extras?.rootSceneModelRoot\n                    cu = !isModelRoot\n                } else {\n                    cu = parser.importOptions?.createUniqueNames === true || GLTFLoader2.CreateUniqueNames === true && parser.importOptions?.createUniqueNames !== false\n                }\n                return cu ?\n                    createUniqueName.call(parser, originalName) : // default behaviour\n                    originalName // allow duplicates\n            }\n            const tempPathDrc = generateUUID() + '.drc'\n            const tempPathKtx2 = generateUUID() + '.ktx2'\n            const needsDrc = parser.json?.extensionsRequired?.includes?.('KHR_draco_mesh_compression')\n            if (needsDrc) {\n                const drc = viewer.assetManager.importer.registerFile(tempPathDrc)\n                drc && this.setDRACOLoader(drc as any) // todo: check class?\n            }\n            const needsMeshOpt = parser.json?.extensionsUsed?.includes?.('EXT_meshopt_compression')\n            if (needsMeshOpt) {\n                if (window.MeshoptDecoder) { // added by the plugin or by the user\n                    this.setMeshoptDecoder(window.MeshoptDecoder)\n                    parser.options.meshoptDecoder = window.MeshoptDecoder\n                } else {\n                    console.error('Add GLTFMeshOptDecodePlugin(and initialize it) to viewer to enable EXT_meshopt_compression decode')\n                }\n            }\n\n            // create ktx2 loader so it can be used with getHandler, we need to do this even when extension is not used since we dont know\n            const ktx2 = viewer.assetManager.importer.registerFile(tempPathKtx2)\n            // const needsBasisU = parser.json?.extensionsUsed?.includes?.('KHR_texture_basisu')\n            // if (needsBasisU) {\n            // const ktx2 = viewer.assetManager.importer.registerFile(tempPathKtx2)\n            if (ktx2) {\n                this.setKTX2Loader(ktx2 as any) // todo: check class?\n                parser.options.ktx2Loader = ktx2 as any\n            }\n            // }\n\n            // registering temp file creates and makes a loader available to the loading manager of that type\n            const tempFiles = supportedEmbeddedFiles.map(f=>generateUUID() + '.' + f)\n            tempFiles.forEach(f=>viewer.assetManager.importer.registerFile(f))\n\n            return {name: 'GLTF2_HELPER_PLUGIN',\n                beforeRoot: async() => {\n                    const bundled = parser.json.extras?.[GLTFLoader2.BundledResourcesKey]\n                    if (!bundled || bundled.__isLoadedResources) return\n\n                    parser.bundledResources = await GLTFViewerConfigExtension.ImportResources(bundled, parser, viewer)\n                },\n                afterRoot: async(result: GLTF) => {\n                    result._bundledResources = parser.bundledResources\n                    await GLTFViewerConfigExtension.ImportViewerConfig(parser, viewer, result.scenes || [result.scene])\n\n                    if (needsDrc) viewer.assetManager.importer.unregisterFile(tempPathDrc)\n                    if (ktx2) viewer.assetManager.importer.unregisterFile(tempPathKtx2)\n                    tempFiles.forEach(f=>viewer.assetManager.importer.unregisterFile(f))\n\n                    viewer.assetManager.importer.removeURLModifier(this._resPathUrlModifier.modify)\n                }}\n        }\n    }\n}\n\nexport interface GLTFPreparser{\n    process(data: string | ArrayBuffer, path: string): Promise<string | ArrayBuffer>\n    [key: string]: any\n}\n\n// sample test model - https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/refs/heads/main/Models/MeshPrimitiveModes/glTF/MeshPrimitiveModes.gltf\n// todo maybe do the same as others inside GLTFLoader.js\nfunction convertToFatLine(line: Line) {\n    const parent = line.parent\n    if (!parent) {\n        console.warn('GLTFLoader2: Line has no parent', line)\n        return\n    }\n    if (line.geometry.index) line.geometry = line.geometry.toNonIndexed() // Line2 requires non indexed\n    const line2 =\n        (line as LineSegments).isLineSegments ?\n            new MeshLineSegments(new LineSegmentsGeometry2(), line.material as LineMaterial2) :\n            new MeshLine(new LineGeometry2(), line.material as LineMaterial2)\n    let positions = line.geometry.attributes.position.array as Float32Array\n    if ((line as LineLoop).isLineLoop) {\n        // add first pos as last.\n        const pos = new Float32Array(positions.length + 3)\n        pos.set(positions)\n        pos.set(positions.subarray(0, 3), positions.length)\n        positions = pos\n    }\n    line2.geometry.setPositions(positions)\n    const colors = line.geometry.attributes.color?.array as Float32Array\n    if (colors && (line2.geometry as LineGeometry2|LineSegmentsGeometry2).setColors) {\n        (line2.geometry as LineGeometry2|LineSegmentsGeometry2).setColors(colors)\n    }\n    line2.geometry.name = line.geometry.name\n    safeSetProperty(line2.geometry, 'uuid', line.geometry.uuid, true, true)\n    line2.geometry.userData = {...line.geometry.userData}\n    // todo groups? anything else\n    const index = parent.children.indexOf(line)\n    parent.add(line2)\n    const {geometry, material} = line2\n    const ud = line.userData\n    line.userData = {}\n    if (!line.userData.__keepShadowDef) {\n        line.castShadow = line2.castShadow\n        line.receiveShadow = line2.receiveShadow\n    }\n    line2.copy(line as any, false)\n    line2.geometry = geometry\n    line2.material = material\n    ;[...line.children].map(c => {\n        line2.add(c)\n    })\n    line2.userData = {...line2.userData, ...ud}\n    // depth rendering for fat lines is not supported yet, so we disable it\n    // todo handle in depth plugins\n    safeSetProperty(line2, 'uuid', line.uuid, true, true)\n    line.removeFromParent()\n    line2.computeLineDistances()\n    // put at the same index\n    const index2 = parent.children.indexOf(line2)\n    if (index2 >= 0 && index2 !== index) {\n        parent.children.splice(index2, 1)\n        parent.children.splice(index, 0, line2)\n    }\n\n}\n\ndeclare module 'three/examples/jsm/loaders/GLTFLoader.js'{\n    export interface GLTFParser {\n        importOptions?: ImportAddOptions\n        // getDependency(type: string, index: number): Promise<Object3D|Texture|Line|LineSegments|LineLoop>\n    }\n}\n\nfunction deserializeUserData(res: {userData: any}, meta?: SerializationMetaType) {\n    if (res && res.userData) {\n        const gltfExtensions = res.userData.gltfExtensions\n        delete res.userData.gltfExtensions\n        // if (meta) {\n        //     meta._dRoot = res.userData\n        // }\n        res.userData = ThreeSerialization.Deserialize(res.userData, {}, meta)\n        res.userData.gltfExtensions = gltfExtensions\n    }\n}\n\ndeclare module 'three/examples/jsm/loaders/GLTFLoader.js' {\n    export interface GLTF {\n        _bundledResources?: SerializationMetaType\n    }\n\n    export interface GLTFParser {\n        bundledResources?: SerializationMetaType\n    }\n}\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i ).convertSRGBToLinear();\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorkerStr;\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\nconst DRACOWorkerStr = `\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and .drc files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n`;\nexport { DRACOLoader };\n","import {DRACOLoader} from 'three/examples/jsm/loaders/DRACOLoader.js'\nimport {BufferGeometry, Color, LoadingManager, Mesh} from 'three'\nimport {AnyOptions} from 'ts-browser-helpers'\nimport {ILoader} from '../IImporter'\nimport {PhysicalMaterial} from '../../core'\n\nexport class DRACOLoader2 extends DRACOLoader implements ILoader<BufferGeometry, Mesh|undefined> {\n    public encoderPending: Promise<any>|null = null\n    public encoderConfig: any = {type: 'js'}\n    readonly isDRACOLoader2 = true\n\n    /**\n     * Path to the draco decoder/encoder libraries, default uses jsdelivr CDN\n     * You may want to set this to your own path or use {@link DRACOLoader2.SetDecoderJsString}\n     * to bundle the draco decoder js file with your app source\n     * @default 'https://cdn.jsdelivr.net/gh/google/draco@1.5.6/javascript/'\n     */\n    public static DRACO_LIBRARY_PATH = 'https://cdn.jsdelivr.net/gh/google/draco@1.5.6/javascript/' // https://github.com/google/draco\n    // public static DRACO_LIBRARY_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.4.1/'\n    // public static DRACO_LIBRARY_PATH = 'https://threejs.org/examples/jsm/libs/draco/'\n\n    constructor(manager?: LoadingManager) {\n        super(manager)\n        this.setDecoderPath(DRACOLoader2.DRACO_LIBRARY_PATH)\n        this.setDecoderConfig({type: 'js'}) // todo: hack for now, encoder works with wasm, maybe not decoder.\n    }\n\n    transform(res: BufferGeometry, _: AnyOptions): Mesh|undefined {\n        if (!res.attributes?.normal) res.computeVertexNormals()\n        // todo set mesh name from options/path\n        return res ? new Mesh(res, new PhysicalMaterial({color: new Color(1, 1, 1)})) : undefined\n    }\n\n    preload(decoder = true, encoder = false): DRACOLoader {\n        if (decoder) super.preload()\n        if (encoder) this.initEncoder()\n        return this\n    }\n\n    public async initEncoder() {\n\n        if (this.encoderPending) return this.encoderPending\n        // this.setDecoderConfig({type: 'js'}) // todo: hack for now.\n\n        const useJS = typeof WebAssembly !== 'object' || this.encoderConfig.type === 'js'\n        const librariesPending = []\n\n        if (useJS) {\n            librariesPending.push(this._loadLibrary('draco_encoder.js', 'text'))\n        } else {\n            // todo: not tested\n            librariesPending.push(this._loadLibrary('draco_wasm_wrapper.js', 'text'))\n            librariesPending.push(this._loadLibrary('draco_encoder.wasm', 'arraybuffer'))\n        }\n\n        this.encoderPending = Promise.all(librariesPending)\n            .then((libraries) => {\n                const jsContent = libraries[ 0 ]\n                if (!useJS) {\n                    this.encoderConfig.wasmBinary = libraries[ 1 ]\n                }\n                const eval2 = eval\n                return eval2(jsContent + '\\nDracoEncoderModule;')?.()\n            })\n\n        return this.encoderPending\n\n    }\n\n    public async initDecoder() {\n        await (this as any)._initDecoder()\n        const jsContent = await fetch((this as any).workerSourceURL).then(async response => response.text()).then(text => {\n            const i = text.indexOf('/* worker */')\n            if (i < 1) throw new Error('unable to load decoder module')\n            return text.substring(0, i - 1)\n        })\n        const eval2 = eval\n        return eval2(jsContent + '\\nDracoDecoderModule;')?.()\n    }\n\n    /**\n     * This is a hack to allow bundling the draco decoder js file with your app source\n     * See {@link DRACOLoader2.SetDecoderJsString} for example\n     */\n    static LibraryValueMap: Record<string, any> = {}\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    async _loadLibrary(url: string, responseType: string): Promise<any> {\n        if (DRACOLoader2.LibraryValueMap[url]) return DRACOLoader2.LibraryValueMap[url]\n        return DRACOLoader2.LibraryValueMap[url] = await super._loadLibrary(url, responseType)\n    }\n\n    /**\n     * Set the decoder js string\n     * Sample for how to set LibraryValueMap\n     * This is useful for bundling the draco decoder js file with your app source\n     * @example\n     * First put the draco_decoder.js file in your src folder, then import it in js/ts as a string\n     * ```js\n     * import draco_decoder from './libs/draco_decoder.1.5.6.js?raw' // vite will load this as a string\n     * // console.log(draco_decoder) // this should be a string with js content\n     * DRACOLoader2.SetDecoderJsString(draco_decoder)\n     * ```\n     * @param jsString - the contents of draco_decoder.js file\n     */\n    static SetDecoderJsString(jsString: string) {\n        this.LibraryValueMap['draco_decoder.js'] = jsString\n    }\n\n}\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearSRGBColorSpace,\n\tRedFormat,\n\tRGBAFormat\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * OpenEXR loader currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression.\n * Supports reading as UnsignedByte, HalfFloat and Float type data texture.\n *\n * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita\n * implementation, so I have preserved their copyright notices.\n */\n\n// /*\n// Copyright (c) 2014 - 2017, Syoyo Fujita\n// All rights reserved.\n\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above copyright\n//       notice, this list of conditions and the following disclaimer in the\n//       documentation and/or other materials provided with the distribution.\n//     * Neither the name of the Syoyo Fujita nor the\n//       names of its contributors may be used to endorse or promote products\n//       derived from this software without specific prior written permission.\n\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// */\n\n// // TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n// ///////////////////////////////////////////////////////////////////////////\n// //\n// // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// // Digital Ltd. LLC\n// //\n// // All rights reserved.\n// //\n// // Redistribution and use in source and binary forms, with or without\n// // modification, are permitted provided that the following conditions are\n// // met:\n// // *       Redistributions of source code must retain the above copyright\n// // notice, this list of conditions and the following disclaimer.\n// // *       Redistributions in binary form must reproduce the above\n// // copyright notice, this list of conditions and the following disclaimer\n// // in the documentation and/or other materials provided with the\n// // distribution.\n// // *       Neither the name of Industrial Light & Magic nor the names of\n// // its contributors may be used to endorse or promote products derived\n// // from this software without specific prior written permission.\n// //\n// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// // \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// //\n// ///////////////////////////////////////////////////////////////////////////\n\n// // End of OpenEXR license -------------------------------------------------\n\nclass EXRLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst USHORT_RANGE = ( 1 << 16 );\n\t\tconst BITMAP_SIZE = ( USHORT_RANGE >> 3 );\n\n\t\tconst HUF_ENCBITS = 16; // literal (value) bit length\n\t\tconst HUF_DECBITS = 14; // decoding bit size (>= 8)\n\n\t\tconst HUF_ENCSIZE = ( 1 << HUF_ENCBITS ) + 1; // encoding table size\n\t\tconst HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size\n\t\tconst HUF_DECMASK = HUF_DECSIZE - 1;\n\n\t\tconst NBITS = 16;\n\t\tconst A_OFFSET = 1 << ( NBITS - 1 );\n\t\tconst MOD_MASK = ( 1 << NBITS ) - 1;\n\n\t\tconst SHORT_ZEROCODE_RUN = 59;\n\t\tconst LONG_ZEROCODE_RUN = 63;\n\t\tconst SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\n\n\t\tconst ULONG_SIZE = 8;\n\t\tconst FLOAT32_SIZE = 4;\n\t\tconst INT32_SIZE = 4;\n\t\tconst INT16_SIZE = 2;\n\t\tconst INT8_SIZE = 1;\n\n\t\tconst STATIC_HUFFMAN = 0;\n\t\tconst DEFLATE = 1;\n\n\t\tconst UNKNOWN = 0;\n\t\tconst LOSSY_DCT = 1;\n\t\tconst RLE = 2;\n\n\t\tconst logBase = Math.pow( 2.7182818, 2.2 );\n\n\t\tfunction reverseLutFromBitmap( bitmap, lut ) {\n\n\t\t\tlet k = 0;\n\n\t\t\tfor ( let i = 0; i < USHORT_RANGE; ++ i ) {\n\n\t\t\t\tif ( ( i == 0 ) || ( bitmap[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {\n\n\t\t\t\t\tlut[ k ++ ] = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst n = k - 1;\n\n\t\t\twhile ( k < USHORT_RANGE ) lut[ k ++ ] = 0;\n\n\t\t\treturn n;\n\n\t\t}\n\n\t\tfunction hufClearDecTable( hdec ) {\n\n\t\t\tfor ( let i = 0; i < HUF_DECSIZE; i ++ ) {\n\n\t\t\t\thdec[ i ] = {};\n\t\t\t\thdec[ i ].len = 0;\n\t\t\t\thdec[ i ].lit = 0;\n\t\t\t\thdec[ i ].p = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getBitsReturn = { l: 0, c: 0, lc: 0 };\n\n\t\tfunction getBits( nBits, c, lc, uInt8Array, inOffset ) {\n\n\t\t\twhile ( lc < nBits ) {\n\n\t\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\t\tlc += 8;\n\n\t\t\t}\n\n\t\t\tlc -= nBits;\n\n\t\t\tgetBitsReturn.l = ( c >> lc ) & ( ( 1 << nBits ) - 1 );\n\t\t\tgetBitsReturn.c = c;\n\t\t\tgetBitsReturn.lc = lc;\n\n\t\t}\n\n\t\tconst hufTableBuffer = new Array( 59 );\n\n\t\tfunction hufCanonicalCodeTable( hcode ) {\n\n\t\t\tfor ( let i = 0; i <= 58; ++ i ) hufTableBuffer[ i ] = 0;\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) hufTableBuffer[ hcode[ i ] ] += 1;\n\n\t\t\tlet c = 0;\n\n\t\t\tfor ( let i = 58; i > 0; -- i ) {\n\n\t\t\t\tconst nc = ( ( c + hufTableBuffer[ i ] ) >> 1 );\n\t\t\t\thufTableBuffer[ i ] = c;\n\t\t\t\tc = nc;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) {\n\n\t\t\t\tconst l = hcode[ i ];\n\t\t\t\tif ( l > 0 ) hcode[ i ] = l | ( hufTableBuffer[ l ] ++ << 6 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction hufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, hcode ) {\n\n\t\t\tconst p = inOffset;\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tif ( p.value - inOffset.value > ni ) return false;\n\n\t\t\t\tgetBits( 6, c, lc, uInt8Array, p );\n\n\t\t\t\tconst l = getBitsReturn.l;\n\t\t\t\tc = getBitsReturn.c;\n\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\thcode[ im ] = l;\n\n\t\t\t\tif ( l == LONG_ZEROCODE_RUN ) {\n\n\t\t\t\t\tif ( p.value - inOffset.value > ni ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgetBits( 8, c, lc, uInt8Array, p );\n\n\t\t\t\t\tlet zerun = getBitsReturn.l + SHORTEST_LONG_RUN;\n\t\t\t\t\tc = getBitsReturn.c;\n\t\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t} else if ( l >= SHORT_ZEROCODE_RUN ) {\n\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable( hcode );\n\n\t\t}\n\n\t\tfunction hufLength( code ) {\n\n\t\t\treturn code & 63;\n\n\t\t}\n\n\t\tfunction hufCode( code ) {\n\n\t\t\treturn code >> 6;\n\n\t\t}\n\n\t\tfunction hufBuildDecTable( hcode, im, iM, hdecod ) {\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tconst c = hufCode( hcode[ im ] );\n\t\t\t\tconst l = hufLength( hcode[ im ] );\n\n\t\t\t\tif ( c >> l ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( l > HUF_DECBITS ) {\n\n\t\t\t\t\tconst pl = hdecod[ ( c >> ( l - HUF_DECBITS ) ) ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit ++;\n\n\t\t\t\t\tif ( pl.p ) {\n\n\t\t\t\t\t\tconst p = pl.p;\n\t\t\t\t\t\tpl.p = new Array( pl.lit );\n\n\t\t\t\t\t\tfor ( let i = 0; i < pl.lit - 1; ++ i ) {\n\n\t\t\t\t\t\t\tpl.p[ i ] = p[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpl.p = new Array( 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[ pl.lit - 1 ] = im;\n\n\t\t\t\t} else if ( l ) {\n\n\t\t\t\t\tlet plOffset = 0;\n\n\t\t\t\t\tfor ( let i = 1 << ( HUF_DECBITS - l ); i > 0; i -- ) {\n\n\t\t\t\t\t\tconst pl = hdecod[ ( c << ( HUF_DECBITS - l ) ) + plOffset ];\n\n\t\t\t\t\t\tif ( pl.len || pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpl.len = l;\n\t\t\t\t\t\tpl.lit = im;\n\n\t\t\t\t\t\tplOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar( c, lc, uInt8Array, inOffset ) {\n\n\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\tlc += 8;\n\n\t\t\tgetCharReturn.c = c;\n\t\t\tgetCharReturn.lc = lc;\n\n\t\t}\n\n\t\tconst getCodeReturn = { c: 0, lc: 0 };\n\n\t\tfunction getCode( po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset ) {\n\n\t\t\tif ( po == rlc ) {\n\n\t\t\t\tif ( lc < 8 ) {\n\n\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t}\n\n\t\t\t\tlc -= 8;\n\n\t\t\t\tlet cs = ( c >> lc );\n\t\t\t\tcs = new Uint8Array( [ cs ] )[ 0 ];\n\n\t\t\t\tif ( outBufferOffset.value + cs > outBufferEndOffset ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst s = outBuffer[ outBufferOffset.value - 1 ];\n\n\t\t\t\twhile ( cs -- > 0 ) {\n\n\t\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = s;\n\n\t\t\t\t}\n\n\t\t\t} else if ( outBufferOffset.value < outBufferEndOffset ) {\n\n\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = po;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\n\t\t}\n\n\t\tfunction UInt16( value ) {\n\n\t\t\treturn ( value & 0xFFFF );\n\n\t\t}\n\n\t\tfunction Int16( value ) {\n\n\t\t\tconst ref = UInt16( value );\n\t\t\treturn ( ref > 0x7FFF ) ? ref - 0x10000 : ref;\n\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14( l, h ) {\n\n\t\t\tconst ls = Int16( l );\n\t\t\tconst hs = Int16( h );\n\n\t\t\tconst hi = hs;\n\t\t\tconst ai = ls + ( hi & 1 ) + ( hi >> 1 );\n\n\t\t\tconst as = ai;\n\t\t\tconst bs = ai - hi;\n\n\t\t\twdec14Return.a = as;\n\t\t\twdec14Return.b = bs;\n\n\t\t}\n\n\t\tfunction wdec16( l, h ) {\n\n\t\t\tconst m = UInt16( l );\n\t\t\tconst d = UInt16( h );\n\n\t\t\tconst bb = ( m - ( d >> 1 ) ) & MOD_MASK;\n\t\t\tconst aa = ( d + bb - A_OFFSET ) & MOD_MASK;\n\n\t\t\twdec14Return.a = aa;\n\t\t\twdec14Return.b = bb;\n\n\t\t}\n\n\t\tfunction wav2Decode( buffer, j, nx, ox, ny, oy, mx ) {\n\n\t\t\tconst w14 = mx < ( 1 << 14 );\n\t\t\tconst n = ( nx > ny ) ? ny : nx;\n\t\t\tlet p = 1;\n\t\t\tlet p2;\n\t\t\tlet py;\n\n\t\t\twhile ( p <= n ) p <<= 1;\n\n\t\t\tp >>= 1;\n\t\t\tp2 = p;\n\t\t\tp >>= 1;\n\n\t\t\twhile ( p >= 1 ) {\n\n\t\t\t\tpy = 0;\n\t\t\t\tconst ey = py + oy * ( ny - p2 );\n\t\t\t\tconst oy1 = oy * p;\n\t\t\t\tconst oy2 = oy * p2;\n\t\t\t\tconst ox1 = ox * p;\n\t\t\t\tconst ox2 = ox * p2;\n\t\t\t\tlet i00, i01, i10, i11;\n\n\t\t\t\tfor ( ; py <= ey; py += oy2 ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\t\t\t\t\t\tconst p10 = px + oy1;\n\t\t\t\t\t\tconst p11 = p10 + ox1;\n\n\t\t\t\t\t\tif ( w14 ) {\n\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nx & p ) {\n\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ny & p ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p01 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p01 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\n\t\t\t}\n\n\t\t\treturn py;\n\n\t\t}\n\n\t\tfunction hufDecode( encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset ) {\n\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\t\t\tconst outBufferEndOffset = no;\n\t\t\tconst inOffsetEnd = Math.trunc( inOffset.value + ( ni + 7 ) / 8 );\n\n\t\t\twhile ( inOffset.value < inOffsetEnd ) {\n\n\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\tc = getCharReturn.c;\n\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\twhile ( lc >= HUF_DECBITS ) {\n\n\t\t\t\t\tconst index = ( c >> ( lc - HUF_DECBITS ) ) & HUF_DECMASK;\n\t\t\t\t\tconst pl = decodingTable[ index ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet j;\n\n\t\t\t\t\t\tfor ( j = 0; j < pl.lit; j ++ ) {\n\n\t\t\t\t\t\t\tconst l = hufLength( encodingTable[ pl.p[ j ] ] );\n\n\t\t\t\t\t\t\twhile ( lc < l && inOffset.value < inOffsetEnd ) {\n\n\t\t\t\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( lc >= l ) {\n\n\t\t\t\t\t\t\t\tif ( hufCode( encodingTable[ pl.p[ j ] ] ) == ( ( c >> ( lc - l ) ) & ( ( 1 << l ) - 1 ) ) ) {\n\n\t\t\t\t\t\t\t\t\tlc -= l;\n\n\t\t\t\t\t\t\t\t\tgetCode( pl.p[ j ], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( j == pl.lit ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst i = ( 8 - ni ) & 7;\n\n\t\t\tc >>= i;\n\t\t\tlc -= i;\n\n\t\t\twhile ( lc > 0 ) {\n\n\t\t\t\tconst pl = decodingTable[ ( c << ( HUF_DECBITS - lc ) ) & HUF_DECMASK ];\n\n\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction hufUncompress( uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw ) {\n\n\t\t\tconst outOffset = { value: 0 };\n\t\t\tconst initialInOffset = inOffset.value;\n\n\t\t\tconst im = parseUint32( inDataView, inOffset );\n\t\t\tconst iM = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tconst nBits = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tif ( im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with HUF_ENCSIZE' );\n\n\t\t\t}\n\n\t\t\tconst freq = new Array( HUF_ENCSIZE );\n\t\t\tconst hdec = new Array( HUF_DECSIZE );\n\n\t\t\thufClearDecTable( hdec );\n\n\t\t\tconst ni = nCompressed - ( inOffset.value - initialInOffset );\n\n\t\t\thufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, freq );\n\n\t\t\tif ( nBits > 8 * ( nCompressed - ( inOffset.value - initialInOffset ) ) ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with hufUncompress' );\n\n\t\t\t}\n\n\t\t\thufBuildDecTable( freq, im, iM, hdec );\n\n\t\t\thufDecode( freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset );\n\n\t\t}\n\n\t\tfunction applyLut( lut, data, nData ) {\n\n\t\t\tfor ( let i = 0; i < nData; ++ i ) {\n\n\t\t\t\tdata[ i ] = lut[ data[ i ] ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction predictor( source ) {\n\n\t\t\tfor ( let t = 1; t < source.length; t ++ ) {\n\n\t\t\t\tconst d = source[ t - 1 ] + source[ t ] - 128;\n\t\t\t\tsource[ t ] = d;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interleaveScalar( source, out ) {\n\n\t\t\tlet t1 = 0;\n\t\t\tlet t2 = Math.floor( ( source.length + 1 ) / 2 );\n\t\t\tlet s = 0;\n\t\t\tconst stop = source.length - 1;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t1 ++ ];\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t2 ++ ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction decodeRunLength( source ) {\n\n\t\t\tlet size = source.byteLength;\n\t\t\tconst out = new Array();\n\t\t\tlet p = 0;\n\n\t\t\tconst reader = new DataView( source );\n\n\t\t\twhile ( size > 0 ) {\n\n\t\t\t\tconst l = reader.getInt8( p ++ );\n\n\t\t\t\tif ( l < 0 ) {\n\n\t\t\t\t\tconst count = - l;\n\t\t\t\t\tsize -= count + 1;\n\n\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\tout.push( reader.getUint8( p ++ ) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst count = l;\n\t\t\t\t\tsize -= 2;\n\n\t\t\t\t\tconst value = reader.getUint8( p ++ );\n\n\t\t\t\t\tfor ( let i = 0; i < count + 1; i ++ ) {\n\n\t\t\t\t\t\tout.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn out;\n\n\t\t}\n\n\t\tfunction lossyDctDecode( cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tlet dataView = new DataView( outBuffer.buffer );\n\n\t\t\tconst width = channelData[ cscSet.idx[ 0 ] ].width;\n\t\t\tconst height = channelData[ cscSet.idx[ 0 ] ].height;\n\n\t\t\tconst numComp = 3;\n\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tconst currDcComp = new Array( numComp );\n\t\t\tconst dctData = new Array( numComp );\n\t\t\tconst halfZigBlock = new Array( numComp );\n\t\t\tconst rowBlock = new Array( numComp );\n\t\t\tconst rowOffsets = new Array( numComp );\n\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\trowOffsets[ comp ] = rowPtrs[ cscSet.idx[ comp ] ];\n\t\t\t\tcurrDcComp[ comp ] = ( comp < 1 ) ? 0 : currDcComp[ comp - 1 ] + numBlocksX * numBlocksY;\n\t\t\t\tdctData[ comp ] = new Float32Array( 64 );\n\t\t\t\thalfZigBlock[ comp ] = new Uint16Array( 64 );\n\t\t\t\trowBlock[ comp ] = new Uint16Array( numBlocksX * 64 );\n\n\t\t\t}\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 )\n\t\t\t\t\tmaxY = leftoverY;\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\tif ( blockx == numBlocksX - 1 )\n\t\t\t\t\t\tmaxX = leftoverX;\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\thalfZigBlock[ comp ].fill( 0 );\n\n\t\t\t\t\t\t// set block DC component\n\t\t\t\t\t\thalfZigBlock[ comp ][ 0 ] = dcBuffer[ currDcComp[ comp ] ++ ];\n\t\t\t\t\t\t// set block AC components\n\t\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock[ comp ] );\n\n\t\t\t\t\t\t// UnZigZag block to float\n\t\t\t\t\t\tunZigZag( halfZigBlock[ comp ], dctData[ comp ] );\n\t\t\t\t\t\t// decode float dct\n\t\t\t\t\t\tdctInverse( dctData[ comp ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numComp == 3 ) {\n\n\t\t\t\t\t\tcsc709Inverse( dctData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\tconvertToHalf( dctData[ comp ], rowBlock[ comp ], blockx * 64 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // blockx\n\n\t\t\t\tlet offset = 0;\n\n\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\toffset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 0 * INT16_SIZE * type, rowBlock[ comp ][ src + 0 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 1 * INT16_SIZE * type, rowBlock[ comp ][ src + 1 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 2 * INT16_SIZE * type, rowBlock[ comp ][ src + 2 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 3 * INT16_SIZE * type, rowBlock[ comp ][ src + 3 ], true );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 4 * INT16_SIZE * type, rowBlock[ comp ][ src + 4 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 5 * INT16_SIZE * type, rowBlock[ comp ][ src + 5 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 6 * INT16_SIZE * type, rowBlock[ comp ][ src + 6 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 7 * INT16_SIZE * type, rowBlock[ comp ][ src + 7 ], true );\n\n\t\t\t\t\t\t\toffset += 8 * INT16_SIZE * type;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle partial X blocks\n\t\t\t\t\tif ( numFullBlocksX != numBlocksX ) {\n\n\t\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ] + 8 * numFullBlocksX * INT16_SIZE * type;\n\t\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < maxX; ++ x ) {\n\n\t\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * type, rowBlock[ comp ][ src + x ], true );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} // comp\n\n\t\t\t} // blocky\n\n\t\t\tconst halfRow = new Uint16Array( width );\n\t\t\tdataView = new DataView( outBuffer.buffer );\n\n\t\t\t// convert channels back to float, if needed\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\tchannelData[ cscSet.idx[ comp ] ].decoded = true;\n\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\tif ( channelData[ comp ].type != 2 ) continue;\n\n\t\t\t\tfor ( let y = 0; y < height; ++ y ) {\n\n\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\thalfRow[ x ] = dataView.getUint16( offset + x * INT16_SIZE * type, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\tdataView.setFloat32( offset + x * INT16_SIZE * type, decodeFloat16( halfRow[ x ] ), true );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unRleAC( currAcComp, acBuffer, halfZigBlock ) {\n\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile ( dctComp < 64 ) {\n\n\t\t\t\tacValue = acBuffer[ currAcComp.value ];\n\n\t\t\t\tif ( acValue == 0xff00 ) {\n\n\t\t\t\t\tdctComp = 64;\n\n\t\t\t\t} else if ( acValue >> 8 == 0xff ) {\n\n\t\t\t\t\tdctComp += acValue & 0xff;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thalfZigBlock[ dctComp ] = acValue;\n\t\t\t\t\tdctComp ++;\n\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unZigZag( src, dst ) {\n\n\t\t\tdst[ 0 ] = decodeFloat16( src[ 0 ] );\n\t\t\tdst[ 1 ] = decodeFloat16( src[ 1 ] );\n\t\t\tdst[ 2 ] = decodeFloat16( src[ 5 ] );\n\t\t\tdst[ 3 ] = decodeFloat16( src[ 6 ] );\n\t\t\tdst[ 4 ] = decodeFloat16( src[ 14 ] );\n\t\t\tdst[ 5 ] = decodeFloat16( src[ 15 ] );\n\t\t\tdst[ 6 ] = decodeFloat16( src[ 27 ] );\n\t\t\tdst[ 7 ] = decodeFloat16( src[ 28 ] );\n\t\t\tdst[ 8 ] = decodeFloat16( src[ 2 ] );\n\t\t\tdst[ 9 ] = decodeFloat16( src[ 4 ] );\n\n\t\t\tdst[ 10 ] = decodeFloat16( src[ 7 ] );\n\t\t\tdst[ 11 ] = decodeFloat16( src[ 13 ] );\n\t\t\tdst[ 12 ] = decodeFloat16( src[ 16 ] );\n\t\t\tdst[ 13 ] = decodeFloat16( src[ 26 ] );\n\t\t\tdst[ 14 ] = decodeFloat16( src[ 29 ] );\n\t\t\tdst[ 15 ] = decodeFloat16( src[ 42 ] );\n\t\t\tdst[ 16 ] = decodeFloat16( src[ 3 ] );\n\t\t\tdst[ 17 ] = decodeFloat16( src[ 8 ] );\n\t\t\tdst[ 18 ] = decodeFloat16( src[ 12 ] );\n\t\t\tdst[ 19 ] = decodeFloat16( src[ 17 ] );\n\n\t\t\tdst[ 20 ] = decodeFloat16( src[ 25 ] );\n\t\t\tdst[ 21 ] = decodeFloat16( src[ 30 ] );\n\t\t\tdst[ 22 ] = decodeFloat16( src[ 41 ] );\n\t\t\tdst[ 23 ] = decodeFloat16( src[ 43 ] );\n\t\t\tdst[ 24 ] = decodeFloat16( src[ 9 ] );\n\t\t\tdst[ 25 ] = decodeFloat16( src[ 11 ] );\n\t\t\tdst[ 26 ] = decodeFloat16( src[ 18 ] );\n\t\t\tdst[ 27 ] = decodeFloat16( src[ 24 ] );\n\t\t\tdst[ 28 ] = decodeFloat16( src[ 31 ] );\n\t\t\tdst[ 29 ] = decodeFloat16( src[ 40 ] );\n\n\t\t\tdst[ 30 ] = decodeFloat16( src[ 44 ] );\n\t\t\tdst[ 31 ] = decodeFloat16( src[ 53 ] );\n\t\t\tdst[ 32 ] = decodeFloat16( src[ 10 ] );\n\t\t\tdst[ 33 ] = decodeFloat16( src[ 19 ] );\n\t\t\tdst[ 34 ] = decodeFloat16( src[ 23 ] );\n\t\t\tdst[ 35 ] = decodeFloat16( src[ 32 ] );\n\t\t\tdst[ 36 ] = decodeFloat16( src[ 39 ] );\n\t\t\tdst[ 37 ] = decodeFloat16( src[ 45 ] );\n\t\t\tdst[ 38 ] = decodeFloat16( src[ 52 ] );\n\t\t\tdst[ 39 ] = decodeFloat16( src[ 54 ] );\n\n\t\t\tdst[ 40 ] = decodeFloat16( src[ 20 ] );\n\t\t\tdst[ 41 ] = decodeFloat16( src[ 22 ] );\n\t\t\tdst[ 42 ] = decodeFloat16( src[ 33 ] );\n\t\t\tdst[ 43 ] = decodeFloat16( src[ 38 ] );\n\t\t\tdst[ 44 ] = decodeFloat16( src[ 46 ] );\n\t\t\tdst[ 45 ] = decodeFloat16( src[ 51 ] );\n\t\t\tdst[ 46 ] = decodeFloat16( src[ 55 ] );\n\t\t\tdst[ 47 ] = decodeFloat16( src[ 60 ] );\n\t\t\tdst[ 48 ] = decodeFloat16( src[ 21 ] );\n\t\t\tdst[ 49 ] = decodeFloat16( src[ 34 ] );\n\n\t\t\tdst[ 50 ] = decodeFloat16( src[ 37 ] );\n\t\t\tdst[ 51 ] = decodeFloat16( src[ 47 ] );\n\t\t\tdst[ 52 ] = decodeFloat16( src[ 50 ] );\n\t\t\tdst[ 53 ] = decodeFloat16( src[ 56 ] );\n\t\t\tdst[ 54 ] = decodeFloat16( src[ 59 ] );\n\t\t\tdst[ 55 ] = decodeFloat16( src[ 61 ] );\n\t\t\tdst[ 56 ] = decodeFloat16( src[ 35 ] );\n\t\t\tdst[ 57 ] = decodeFloat16( src[ 36 ] );\n\t\t\tdst[ 58 ] = decodeFloat16( src[ 48 ] );\n\t\t\tdst[ 59 ] = decodeFloat16( src[ 49 ] );\n\n\t\t\tdst[ 60 ] = decodeFloat16( src[ 57 ] );\n\t\t\tdst[ 61 ] = decodeFloat16( src[ 58 ] );\n\t\t\tdst[ 62 ] = decodeFloat16( src[ 62 ] );\n\t\t\tdst[ 63 ] = decodeFloat16( src[ 63 ] );\n\n\t\t}\n\n\t\tfunction dctInverse( data ) {\n\n\t\t\tconst a = 0.5 * Math.cos( 3.14159 / 4.0 );\n\t\t\tconst b = 0.5 * Math.cos( 3.14159 / 16.0 );\n\t\t\tconst c = 0.5 * Math.cos( 3.14159 / 8.0 );\n\t\t\tconst d = 0.5 * Math.cos( 3.0 * 3.14159 / 16.0 );\n\t\t\tconst e = 0.5 * Math.cos( 5.0 * 3.14159 / 16.0 );\n\t\t\tconst f = 0.5 * Math.cos( 3.0 * 3.14159 / 8.0 );\n\t\t\tconst g = 0.5 * Math.cos( 7.0 * 3.14159 / 16.0 );\n\n\t\t\tconst alpha = new Array( 4 );\n\t\t\tconst beta = new Array( 4 );\n\t\t\tconst theta = new Array( 4 );\n\t\t\tconst gamma = new Array( 4 );\n\n\t\t\tfor ( let row = 0; row < 8; ++ row ) {\n\n\t\t\t\tconst rowPtr = row * 8;\n\n\t\t\t\talpha[ 0 ] = c * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 1 ] = f * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 2 ] = c * data[ rowPtr + 6 ];\n\t\t\t\talpha[ 3 ] = f * data[ rowPtr + 6 ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ rowPtr + 1 ] + d * data[ rowPtr + 3 ] + e * data[ rowPtr + 5 ] + g * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 1 ] = d * data[ rowPtr + 1 ] - g * data[ rowPtr + 3 ] - b * data[ rowPtr + 5 ] - e * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 2 ] = e * data[ rowPtr + 1 ] - b * data[ rowPtr + 3 ] + g * data[ rowPtr + 5 ] + d * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 3 ] = g * data[ rowPtr + 1 ] - e * data[ rowPtr + 3 ] + d * data[ rowPtr + 5 ] - b * data[ rowPtr + 7 ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ rowPtr + 0 ] + data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ rowPtr + 0 ] - data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ rowPtr + 0 ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ rowPtr + 1 ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 2 ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 3 ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ rowPtr + 4 ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ rowPtr + 5 ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 6 ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 7 ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t\tfor ( let column = 0; column < 8; ++ column ) {\n\n\t\t\t\talpha[ 0 ] = c * data[ 16 + column ];\n\t\t\t\talpha[ 1 ] = f * data[ 16 + column ];\n\t\t\t\talpha[ 2 ] = c * data[ 48 + column ];\n\t\t\t\talpha[ 3 ] = f * data[ 48 + column ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ 8 + column ] + d * data[ 24 + column ] + e * data[ 40 + column ] + g * data[ 56 + column ];\n\t\t\t\tbeta[ 1 ] = d * data[ 8 + column ] - g * data[ 24 + column ] - b * data[ 40 + column ] - e * data[ 56 + column ];\n\t\t\t\tbeta[ 2 ] = e * data[ 8 + column ] - b * data[ 24 + column ] + g * data[ 40 + column ] + d * data[ 56 + column ];\n\t\t\t\tbeta[ 3 ] = g * data[ 8 + column ] - e * data[ 24 + column ] + d * data[ 40 + column ] - b * data[ 56 + column ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ column ] + data[ 32 + column ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ column ] - data[ 32 + column ] );\n\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ 0 + column ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ 8 + column ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ 16 + column ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ 24 + column ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ 32 + column ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ 40 + column ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ 48 + column ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ 56 + column ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction csc709Inverse( data ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tconst y = data[ 0 ][ i ];\n\t\t\t\tconst cb = data[ 1 ][ i ];\n\t\t\t\tconst cr = data[ 2 ][ i ];\n\n\t\t\t\tdata[ 0 ][ i ] = y + 1.5747 * cr;\n\t\t\t\tdata[ 1 ][ i ] = y - 0.1873 * cb - 0.4682 * cr;\n\t\t\t\tdata[ 2 ][ i ] = y + 1.8556 * cb;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convertToHalf( src, dst, idx ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tdst[ idx + i ] = DataUtils.toHalfFloat( toLinear( src[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction toLinear( float ) {\n\n\t\t\tif ( float <= 1 ) {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( Math.abs( float ), 2.2 );\n\n\t\t\t} else {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( logBase, Math.abs( float ) - 1.0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uncompressRAW( info ) {\n\n\t\t\treturn new DataView( info.array.buffer, info.offset.value, info.size );\n\n\t\t}\n\n\t\tfunction uncompressRLE( info ) {\n\n\t\t\tconst compressed = info.viewer.buffer.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = new Uint8Array( decodeRunLength( compressed ) );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressZIP( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPIZ( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\n\t\t\tconst outBuffer = new Uint16Array( info.width * info.scanlineBlockSize * ( info.channels * info.type ) );\n\t\t\tconst bitmap = new Uint8Array( BITMAP_SIZE );\n\n\t\t\t// Setup channel info\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst pizChannelData = new Array( info.channels );\n\t\t\tfor ( let i = 0; i < info.channels; i ++ ) {\n\n\t\t\t\tpizChannelData[ i ] = {};\n\t\t\t\tpizChannelData[ i ][ 'start' ] = outBufferEnd;\n\t\t\t\tpizChannelData[ i ][ 'end' ] = pizChannelData[ i ][ 'start' ];\n\t\t\t\tpizChannelData[ i ][ 'nx' ] = info.width;\n\t\t\t\tpizChannelData[ i ][ 'ny' ] = info.lines;\n\t\t\t\tpizChannelData[ i ][ 'size' ] = info.type;\n\n\t\t\t\toutBufferEnd += pizChannelData[ i ].nx * pizChannelData[ i ].ny * pizChannelData[ i ].size;\n\n\t\t\t}\n\n\t\t\t// Read range compression data\n\n\t\t\tconst minNonZero = parseUint16( inDataView, inOffset );\n\t\t\tconst maxNonZero = parseUint16( inDataView, inOffset );\n\n\t\t\tif ( maxNonZero >= BITMAP_SIZE ) {\n\n\t\t\t\tthrow new Error( 'Something is wrong with PIZ_COMPRESSION BITMAP_SIZE' );\n\n\t\t\t}\n\n\t\t\tif ( minNonZero <= maxNonZero ) {\n\n\t\t\t\tfor ( let i = 0; i < maxNonZero - minNonZero + 1; i ++ ) {\n\n\t\t\t\t\tbitmap[ i + minNonZero ] = parseUint8( inDataView, inOffset );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Reverse LUT\n\t\t\tconst lut = new Uint16Array( USHORT_RANGE );\n\t\t\tconst maxValue = reverseLutFromBitmap( bitmap, lut );\n\n\t\t\tconst length = parseUint32( inDataView, inOffset );\n\n\t\t\t// Huffman decoding\n\t\t\thufUncompress( info.array, inDataView, inOffset, length, outBuffer, outBufferEnd );\n\n\t\t\t// Wavelet decoding\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = pizChannelData[ i ];\n\n\t\t\t\tfor ( let j = 0; j < pizChannelData[ i ].size; ++ j ) {\n\n\t\t\t\t\twav2Decode(\n\t\t\t\t\t\toutBuffer,\n\t\t\t\t\t\tcd.start + j,\n\t\t\t\t\t\tcd.nx,\n\t\t\t\t\t\tcd.size,\n\t\t\t\t\t\tcd.ny,\n\t\t\t\t\t\tcd.nx * cd.size,\n\t\t\t\t\t\tmaxValue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Expand the pixel data to their original range\n\t\t\tapplyLut( lut, outBuffer, outBufferEnd );\n\n\t\t\t// Rearrange the pixel data into the format expected by the caller.\n\t\t\tlet tmpOffset = 0;\n\t\t\tconst tmpBuffer = new Uint8Array( outBuffer.buffer.byteLength );\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tconst cd = pizChannelData[ c ];\n\n\t\t\t\t\tconst n = cd.nx * cd.size;\n\t\t\t\t\tconst cp = new Uint8Array( outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE );\n\n\t\t\t\t\ttmpBuffer.set( cp, tmpOffset );\n\t\t\t\t\ttmpOffset += n * INT16_SIZE;\n\t\t\t\t\tcd.end += n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPXR( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\n\t\t\tconst sz = info.lines * info.channels * info.width;\n\t\t\tconst tmpBuffer = ( info.type == 1 ) ? new Uint16Array( sz ) : new Uint32Array( sz );\n\n\t\t\tlet tmpBufferEnd = 0;\n\t\t\tlet writePtr = 0;\n\t\t\tconst ptr = new Array( 4 );\n\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tswitch ( info.type ) {\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 1 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 8 ) | rawBuffer[ ptr[ 1 ] ++ ];\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\tptr[ 2 ] = ptr[ 1 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 2 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 24 ) | ( rawBuffer[ ptr[ 1 ] ++ ] << 16 ) | ( rawBuffer[ ptr[ 2 ] ++ ] << 8 );\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressDWA( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array( info.width * info.lines * ( info.channels * info.type * INT16_SIZE ) );\n\n\t\t\t// Read compression header information\n\t\t\tconst dwaHeader = {\n\n\t\t\t\tversion: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tdcCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleRawSize: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalAcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalDcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompression: parseInt64( inDataView, inOffset )\n\n\t\t\t};\n\n\t\t\tif ( dwaHeader.version < 2 )\n\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported' );\n\n\t\t\t// Read channel ruleset information\n\t\t\tconst channelRules = new Array();\n\t\t\tlet ruleSize = parseUint16( inDataView, inOffset ) - INT16_SIZE;\n\n\t\t\twhile ( ruleSize > 0 ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( inDataView.buffer, inOffset );\n\t\t\t\tconst value = parseUint8( inDataView, inOffset );\n\t\t\t\tconst compression = ( value >> 2 ) & 3;\n\t\t\t\tconst csc = ( value >> 4 ) - 1;\n\t\t\t\tconst index = new Int8Array( [ csc ] )[ 0 ];\n\t\t\t\tconst type = parseUint8( inDataView, inOffset );\n\n\t\t\t\tchannelRules.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tcompression: compression,\n\t\t\t\t} );\n\n\t\t\t\truleSize -= name.length + 3;\n\n\t\t\t}\n\n\t\t\t// Classify channels\n\t\t\tconst channels = EXRHeader.channels;\n\t\t\tconst channelData = new Array( info.channels );\n\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ] = {};\n\t\t\t\tconst channel = channels[ i ];\n\n\t\t\t\tcd.name = channel.name;\n\t\t\t\tcd.compression = UNKNOWN;\n\t\t\t\tcd.decoded = false;\n\t\t\t\tcd.type = channel.pixelType;\n\t\t\t\tcd.pLinear = channel.pLinear;\n\t\t\t\tcd.width = info.width;\n\t\t\t\tcd.height = info.lines;\n\n\t\t\t}\n\n\t\t\tconst cscSet = {\n\t\t\t\tidx: new Array( 3 )\n\t\t\t};\n\n\t\t\tfor ( let offset = 0; offset < info.channels; ++ offset ) {\n\n\t\t\t\tconst cd = channelData[ offset ];\n\n\t\t\t\tfor ( let i = 0; i < channelRules.length; ++ i ) {\n\n\t\t\t\t\tconst rule = channelRules[ i ];\n\n\t\t\t\t\tif ( cd.name == rule.name ) {\n\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif ( rule.index >= 0 ) {\n\n\t\t\t\t\t\t\tcscSet.idx[ rule.index ] = offset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet acBuffer, dcBuffer, rleBuffer;\n\n\t\t\t// Read DCT - AC component data\n\t\t\tif ( dwaHeader.acCompressedSize > 0 ) {\n\n\t\t\t\tswitch ( dwaHeader.acCompression ) {\n\n\t\t\t\t\tcase STATIC_HUFFMAN:\n\n\t\t\t\t\t\tacBuffer = new Uint16Array( dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\thufUncompress( info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DEFLATE:\n\n\t\t\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\t\t\tacBuffer = new Uint16Array( data.buffer );\n\t\t\t\t\t\tinOffset.value += dwaHeader.totalAcUncompressedCount;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif ( dwaHeader.dcCompressedSize > 0 ) {\n\n\t\t\t\tconst zlibInfo = {\n\t\t\t\t\tarray: info.array,\n\t\t\t\t\toffset: inOffset,\n\t\t\t\t\tsize: dwaHeader.dcCompressedSize\n\t\t\t\t};\n\t\t\t\tdcBuffer = new Uint16Array( uncompressZIP( zlibInfo ).buffer );\n\t\t\t\tinOffset.value += dwaHeader.dcCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif ( dwaHeader.rleRawSize > 0 ) {\n\n\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.rleCompressedSize );\n\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\trleBuffer = decodeRunLength( data.buffer );\n\n\t\t\t\tinOffset.value += dwaHeader.rleCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Prepare outbuffer data offset\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst rowOffsets = new Array( channelData.length );\n\t\t\tfor ( let i = 0; i < rowOffsets.length; ++ i ) {\n\n\t\t\t\trowOffsets[ i ] = new Array();\n\n\t\t\t}\n\n\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\tfor ( let chan = 0; chan < channelData.length; ++ chan ) {\n\n\t\t\t\t\trowOffsets[ chan ].push( outBufferEnd );\n\t\t\t\t\toutBufferEnd += channelData[ chan ].width * info.type * INT16_SIZE;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Lossy DCT decode RGB channels\n\t\t\tlossyDctDecode( cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t// Decode other channels\n\t\t\tfor ( let i = 0; i < channelData.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ];\n\n\t\t\t\tif ( cd.decoded ) continue;\n\n\t\t\t\tswitch ( cd.compression ) {\n\n\t\t\t\t\tcase RLE:\n\n\t\t\t\t\t\tlet row = 0;\n\t\t\t\t\t\tlet rleOffset = 0;\n\n\t\t\t\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\t\t\t\tlet rowOffsetBytes = rowOffsets[ i ][ row ];\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < cd.width; ++ x ) {\n\n\t\t\t\t\t\t\t\tfor ( let byte = 0; byte < INT16_SIZE * cd.type; ++ byte ) {\n\n\t\t\t\t\t\t\t\t\toutBuffer[ rowOffsetBytes ++ ] = rleBuffer[ rleOffset + byte * cd.width * cd.height ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase LOSSY_DCT: // skip\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported channel compression' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( outBuffer.buffer );\n\n\t\t}\n\n\t\tfunction parseNullTerminatedString( buffer, offset ) {\n\n\t\t\tconst uintBuffer = new Uint8Array( buffer );\n\t\t\tlet endOffset = 0;\n\n\t\t\twhile ( uintBuffer[ offset.value + endOffset ] != 0 ) {\n\n\t\t\t\tendOffset += 1;\n\n\t\t\t}\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tuintBuffer.slice( offset.value, offset.value + endOffset )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + endOffset + 1;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseFixedLengthString( buffer, offset, size ) {\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tnew Uint8Array( buffer ).slice( offset.value, offset.value + size )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + size;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseRational( dataView, offset ) {\n\n\t\t\tconst x = parseInt32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseTimecode( dataView, offset ) {\n\n\t\t\tconst x = parseUint32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseInt32( dataView, offset ) {\n\n\t\t\tconst Int32 = dataView.getInt32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Int32;\n\n\t\t}\n\n\t\tfunction parseUint32( dataView, offset ) {\n\n\t\t\tconst Uint32 = dataView.getUint32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Uint32;\n\n\t\t}\n\n\t\tfunction parseUint8Array( uInt8Array, offset ) {\n\n\t\t\tconst Uint8 = uInt8Array[ offset.value ];\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tfunction parseUint8( dataView, offset ) {\n\n\t\t\tconst Uint8 = dataView.getUint8( offset.value );\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tconst parseInt64 = function ( dataView, offset ) {\n\n\t\t\tlet int;\n\n\t\t\tif ( 'getBigInt64' in DataView.prototype ) {\n\n\t\t\t\tint = Number( dataView.getBigInt64( offset.value, true ) );\n\n\t\t\t} else {\n\n\t\t\t\tint = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 );\n\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\n\t\t};\n\n\t\tfunction parseFloat32( dataView, offset ) {\n\n\t\t\tconst float = dataView.getFloat32( offset.value, true );\n\n\t\t\toffset.value += FLOAT32_SIZE;\n\n\t\t\treturn float;\n\n\t\t}\n\n\t\tfunction decodeFloat32( dataView, offset ) {\n\n\t\t\treturn DataUtils.toHalfFloat( parseFloat32( dataView, offset ) );\n\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16( binary ) {\n\n\t\t\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\t\t\tfraction = binary & 0x03FF;\n\n\t\t\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\t\t\texponent ?\n\t\t\t\t\t(\n\t\t\t\t\t\texponent === 0x1F ?\n\t\t\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t\t\t) :\n\t\t\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t\t\t);\n\n\t\t}\n\n\t\tfunction parseUint16( dataView, offset ) {\n\n\t\t\tconst Uint16 = dataView.getUint16( offset.value, true );\n\n\t\t\toffset.value += INT16_SIZE;\n\n\t\t\treturn Uint16;\n\n\t\t}\n\n\t\tfunction parseFloat16( buffer, offset ) {\n\n\t\t\treturn decodeFloat16( parseUint16( buffer, offset ) );\n\n\t\t}\n\n\t\tfunction parseChlist( dataView, buffer, offset, size ) {\n\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile ( offset.value < ( startOffset + size - 1 ) ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( buffer, offset );\n\t\t\t\tconst pixelType = parseInt32( dataView, offset );\n\t\t\t\tconst pLinear = parseUint8( dataView, offset );\n\t\t\t\toffset.value += 3; // reserved, three chars\n\t\t\t\tconst xSampling = parseInt32( dataView, offset );\n\t\t\t\tconst ySampling = parseInt32( dataView, offset );\n\n\t\t\t\tchannels.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tpixelType: pixelType,\n\t\t\t\t\tpLinear: pLinear,\n\t\t\t\t\txSampling: xSampling,\n\t\t\t\t\tySampling: ySampling\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\n\t\t}\n\n\t\tfunction parseChromaticities( dataView, offset ) {\n\n\t\t\tconst redX = parseFloat32( dataView, offset );\n\t\t\tconst redY = parseFloat32( dataView, offset );\n\t\t\tconst greenX = parseFloat32( dataView, offset );\n\t\t\tconst greenY = parseFloat32( dataView, offset );\n\t\t\tconst blueX = parseFloat32( dataView, offset );\n\t\t\tconst blueY = parseFloat32( dataView, offset );\n\t\t\tconst whiteX = parseFloat32( dataView, offset );\n\t\t\tconst whiteY = parseFloat32( dataView, offset );\n\n\t\t\treturn { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY };\n\n\t\t}\n\n\t\tfunction parseCompression( dataView, offset ) {\n\n\t\t\tconst compressionCodes = [\n\t\t\t\t'NO_COMPRESSION',\n\t\t\t\t'RLE_COMPRESSION',\n\t\t\t\t'ZIPS_COMPRESSION',\n\t\t\t\t'ZIP_COMPRESSION',\n\t\t\t\t'PIZ_COMPRESSION',\n\t\t\t\t'PXR24_COMPRESSION',\n\t\t\t\t'B44_COMPRESSION',\n\t\t\t\t'B44A_COMPRESSION',\n\t\t\t\t'DWAA_COMPRESSION',\n\t\t\t\t'DWAB_COMPRESSION'\n\t\t\t];\n\n\t\t\tconst compression = parseUint8( dataView, offset );\n\n\t\t\treturn compressionCodes[ compression ];\n\n\t\t}\n\n\t\tfunction parseBox2i( dataView, offset ) {\n\n\t\t\tconst xMin = parseInt32( dataView, offset );\n\t\t\tconst yMin = parseInt32( dataView, offset );\n\t\t\tconst xMax = parseInt32( dataView, offset );\n\t\t\tconst yMax = parseInt32( dataView, offset );\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\n\t\t}\n\n\t\tfunction parseLineOrder( dataView, offset ) {\n\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y',\n\t\t\t\t'DECREASING_Y'\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8( dataView, offset );\n\n\t\t\treturn lineOrders[ lineOrder ];\n\n\t\t}\n\n\t\tfunction parseV2f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseV3f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\t\t\tconst z = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y, z ];\n\n\t\t}\n\n\t\tfunction parseValue( dataView, buffer, offset, type, size ) {\n\n\t\t\tif ( type === 'string' || type === 'stringvector' || type === 'iccProfile' ) {\n\n\t\t\t\treturn parseFixedLengthString( buffer, offset, size );\n\n\t\t\t} else if ( type === 'chlist' ) {\n\n\t\t\t\treturn parseChlist( dataView, buffer, offset, size );\n\n\t\t\t} else if ( type === 'chromaticities' ) {\n\n\t\t\t\treturn parseChromaticities( dataView, offset );\n\n\t\t\t} else if ( type === 'compression' ) {\n\n\t\t\t\treturn parseCompression( dataView, offset );\n\n\t\t\t} else if ( type === 'box2i' ) {\n\n\t\t\t\treturn parseBox2i( dataView, offset );\n\n\t\t\t} else if ( type === 'lineOrder' ) {\n\n\t\t\t\treturn parseLineOrder( dataView, offset );\n\n\t\t\t} else if ( type === 'float' ) {\n\n\t\t\t\treturn parseFloat32( dataView, offset );\n\n\t\t\t} else if ( type === 'v2f' ) {\n\n\t\t\t\treturn parseV2f( dataView, offset );\n\n\t\t\t} else if ( type === 'v3f' ) {\n\n\t\t\t\treturn parseV3f( dataView, offset );\n\n\t\t\t} else if ( type === 'int' ) {\n\n\t\t\t\treturn parseInt32( dataView, offset );\n\n\t\t\t} else if ( type === 'rational' ) {\n\n\t\t\t\treturn parseRational( dataView, offset );\n\n\t\t\t} else if ( type === 'timecode' ) {\n\n\t\t\t\treturn parseTimecode( dataView, offset );\n\n\t\t\t} else if ( type === 'preview' ) {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\n\t\t\t} else {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseHeader( dataView, buffer, offset ) {\n\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif ( dataView.getUint32( 0, true ) != 20000630 ) { // magic\n\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file doesn\\'t appear to be in OpenEXR format.' );\n\n\t\t\t}\n\n\t\t\tEXRHeader.version = dataView.getUint8( 4 );\n\n\t\t\tconst spec = dataView.getUint8( 5 ); // fullMask\n\n\t\t\tEXRHeader.spec = {\n\t\t\t\tsingleTile: !! ( spec & 2 ),\n\t\t\t\tlongName: !! ( spec & 4 ),\n\t\t\t\tdeepFormat: !! ( spec & 8 ),\n\t\t\t\tmultiPart: !! ( spec & 16 ),\n\t\t\t};\n\n\t\t\t// start of header\n\n\t\t\toffset.value = 8; // start at 8 - after pre-amble\n\n\t\t\tlet keepReading = true;\n\n\t\t\twhile ( keepReading ) {\n\n\t\t\t\tconst attributeName = parseNullTerminatedString( buffer, offset );\n\n\t\t\t\tif ( attributeName == 0 ) {\n\n\t\t\t\t\tkeepReading = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst attributeType = parseNullTerminatedString( buffer, offset );\n\t\t\t\t\tconst attributeSize = parseUint32( dataView, offset );\n\t\t\t\t\tconst attributeValue = parseValue( dataView, buffer, offset, attributeType, attributeSize );\n\n\t\t\t\t\tif ( attributeValue === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( `THREE.EXRLoader: Skipped unknown header attribute type \\'${attributeType}\\'.` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tEXRHeader[ attributeName ] = attributeValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( spec & ~ 0x04 ) != 0 ) { // unsupported tiled, deep-image, multi-part\n\n\t\t\t\tconsole.error( 'THREE.EXRHeader:', EXRHeader );\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file is currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\n\t\t}\n\n\t\tfunction setupDecoder( EXRHeader, dataView, uInt8Array, offset, outputType ) {\n\n\t\t\tconst EXRDecoder = {\n\t\t\t\tsize: 0,\n\t\t\t\tviewer: dataView,\n\t\t\t\tarray: uInt8Array,\n\t\t\t\toffset: offset,\n\t\t\t\twidth: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,\n\t\t\t\theight: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,\n\t\t\t\tchannels: EXRHeader.channels.length,\n\t\t\t\tchannelLineOffsets: {},\n\t\t\t\tscanOrder: null,\n\t\t\t\tbytesPerLine: null,\n\t\t\t\tlines: null,\n\t\t\t\tinputSize: null,\n\t\t\t\ttype: null,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\t};\n\n\t\t\tswitch ( EXRHeader.compression ) {\n\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRAW;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RLE_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIPS_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIP_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PIZ_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPIZ;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PXR24_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPXR;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAA_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAB_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 256;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.scanlineBlockSize = EXRDecoder.lines;\n\n\t\t\tconst channels = {};\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tswitch ( channel.name ) {\n\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\tcase 'R':\n\t\t\t\t\tcase 'G':\n\t\t\t\t\tcase 'B':\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tchannels[ channel.name ] = true;\n\t\t\t\t\t\tEXRDecoder.type = channel.pixelType;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tlet fillAlpha = false;\n\n\t\t\tif ( channels.R && channels.G && channels.B ) {\n\n\t\t\t\tfillAlpha = ! channels.A;\n\t\t\t\tEXRDecoder.outputChannels = 4;\n\t\t\t\tEXRDecoder.decodeChannels = { R: 0, G: 1, B: 2, A: 3 };\n\n\t\t\t} else if ( channels.Y ) {\n\n\t\t\t\tEXRDecoder.outputChannels = 1;\n\t\t\t\tEXRDecoder.decodeChannels = { Y: 0 };\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: file contains unsupported data channels.' );\n\n\t\t\t}\n\n\t\t\tif ( EXRDecoder.type == 1 ) {\n\n\t\t\t\t// half\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( EXRDecoder.type == 2 ) {\n\n\t\t\t\t// float\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.blockCount = EXRDecoder.height / EXRDecoder.scanlineBlockSize;\n\n\t\t\tfor ( let i = 0; i < EXRDecoder.blockCount; i ++ )\n\t\t\t\tparseInt64( dataView, offset ); // scanlineOffset\n\n\t\t\t// we should be passed the scanline offset table, ready to start reading pixel data.\n\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch ( outputType ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Float32Array( size );\n\n\t\t\t\t\t// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 1, 0, size );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array( size );\n\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.EXRLoader: unsupported type: ', outputType );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlet byteOffset = 0;\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tif ( EXRDecoder.decodeChannels[ channel.name ] !== undefined ) {\n\n\t\t\t\t\tEXRDecoder.channelLineOffsets[ channel.name ] = byteOffset * EXRDecoder.width;\n\n\t\t\t\t}\n\n\t\t\t\tbyteOffset += channel.pixelType * 2;\n\n\t\t\t}\n\n\t\t\tEXRDecoder.bytesPerLine = EXRDecoder.width * byteOffset;\n\t\t\tEXRDecoder.outLineWidth = EXRDecoder.width * EXRDecoder.outputChannels;\n\n\t\t\tif ( EXRHeader.lineOrder === 'INCREASING_Y' ) {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => y;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => EXRDecoder.height - 1 - y;\n\n\t\t\t}\n\n\t\t\tif ( EXRDecoder.outputChannels == 4 ) {\n\n\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\tEXRDecoder.colorSpace = NoColorSpace;\n\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\n\t\t}\n\n\t\t// start parsing file [START]\n\n\t\tconst bufferDataView = new DataView( buffer );\n\t\tconst uInt8Array = new Uint8Array( buffer );\n\t\tconst offset = { value: 0 };\n\n\t\t// get header information and validate format.\n\t\tconst EXRHeader = parseHeader( bufferDataView, buffer, offset );\n\n\t\t// get input compression information and prepare decoding.\n\t\tconst EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type );\n\n\t\tconst tmpOffset = { value: 0 };\n\n\t\tfor ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx ++ ) {\n\n\t\t\tconst line = parseInt32( bufferDataView, offset ) - EXRHeader.dataWindow.yMin; // line_no\n\t\t\tEXRDecoder.size = parseUint32( bufferDataView, offset ); // data_len\n\t\t\tEXRDecoder.lines = ( ( line + EXRDecoder.scanlineBlockSize > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.scanlineBlockSize );\n\n\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * EXRDecoder.bytesPerLine;\n\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\tfor ( let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y ++ ) {\n\n\t\t\t\tconst scan_y = scanlineBlockIdx * EXRDecoder.scanlineBlockSize;\n\t\t\t\tconst true_y = line_y + EXRDecoder.scanOrder( scan_y );\n\t\t\t\tif ( true_y >= EXRDecoder.height ) continue;\n\n\t\t\t\tconst lineOffset = line_y * EXRDecoder.bytesPerLine;\n\t\t\t\tconst outLineOffset = ( EXRDecoder.height - 1 - true_y ) * EXRDecoder.outLineWidth;\n\n\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.channels; channelID ++ ) {\n\n\t\t\t\t\tconst name = EXRHeader.channels[ channelID ].name;\n\t\t\t\t\tconst lOff = EXRDecoder.channelLineOffsets[ name ];\n\t\t\t\t\tconst cOff = EXRDecoder.decodeChannels[ name ];\n\n\t\t\t\t\tif ( cOff === undefined ) continue;\n\n\t\t\t\t\ttmpOffset.value = lineOffset + lOff;\n\n\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.width; x ++ ) {\n\n\t\t\t\t\t\tconst outIndex = outLineOffset + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\theader: EXRHeader,\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tcolorSpace: EXRDecoder.colorSpace,\n\t\t\ttype: this.type,\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\ttexture.colorSpace = texData.colorSpace;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { EXRLoader };\n","import {\n\tBufferGeometryLoader,\n\tCanvasTexture,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tLinearFilter,\n\tLine,\n\tLineBasicMaterial,\n\tLoader,\n\tMatrix4,\n\tMesh,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tObject3D,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tRectAreaLight,\n\tRepeatWrapping,\n\tSpotLight,\n\tSprite,\n\tSpriteMaterial,\n\tTextureLoader\n} from 'three';\n\nimport { EXRLoader } from '../loaders/EXRLoader.js';\n\nconst _taskCache = new WeakMap();\n\nclass Rhino3dmLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.libraryPath = '';\n\t\tthis.libraryPending = null;\n\t\tthis.libraryBinary = null;\n\t\tthis.libraryConfig = {};\n\n\t\tthis.url = '';\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = {};\n\n\t\tthis.materials = [];\n\t\tthis.warnings = [];\n\n\t}\n\n\tsetLibraryPath( path ) {\n\n\t\tthis.libraryPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\n\t\tthis.url = url;\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t\t// again from this thread.\n\t\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t\t}\n\n\t\t\tthis.decodeObjects( buffer, url )\n\t\t\t\t.then( result => {\n\n\t\t\t\t\tresult.userData.warnings = this.warnings;\n\t\t\t\t\tthis.warnings = [];\n\t\t\t\t\tonLoad( result );\n\n\t\t\t\t } )\n\t\t\t\t.catch( e => onError( e ) );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdecodeObjects( buffer, url ) {\n\n\t\tlet worker;\n\t\tlet taskID;\n\n\t\tconst taskCost = buffer.byteLength;\n\n\t\tconst objectPending = this._getWorker( taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\t\t\t\ttaskID = this.workerNextTaskID ++;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.data ) )\n\t\t\t.catch( e => {\n\n\t\t\t\tthrow e;\n\n\t\t\t} );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tobjectPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t//this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\turl: url,\n\t\t\tpromise: objectPending\n\n\t\t} );\n\n\t\treturn objectPending;\n\n\t}\n\n\tparse( data, onLoad, onError ) {\n\n\t\tthis.decodeObjects( data, '' )\n\t\t\t.then( result => {\n\n\t\t\t\tresult.userData.warnings = this.warnings;\n\t\t\t\tonLoad( result );\n\n\t\t\t} )\n\t\t\t.catch( e => onError( e ) );\n\n\t}\n\n\t_compareMaterials( material ) {\n\n\t\tif ( this.materials.includes( material ) ) return material;\n\n\t\tconst mat = {};\n\t\tmat.name = material.name;\n\t\tmat.color = {};\n\t\tmat.color.r = material.color.r;\n\t\tmat.color.g = material.color.g;\n\t\tmat.color.b = material.color.b;\n\t\tmat.type = material.type;\n\t\tmat.vertexColors = material.vertexColors;\n\n\t\tconst json = JSON.stringify( mat );\n\n\t\tfor ( let i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\tconst m = this.materials[ i ];\n\t\t\tconst _mat = {};\n\t\t\t_mat.name = m.name;\n\t\t\t_mat.color = {};\n\t\t\t_mat.color.r = m.color.r;\n\t\t\t_mat.color.g = m.color.g;\n\t\t\t_mat.color.b = m.color.b;\n\t\t\t_mat.type = m.type;\n\t\t\t_mat.vertexColors = m.vertexColors;\n\n\t\t\tif ( JSON.stringify( _mat ) === json ) {\n\n\t\t\t\treturn m;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.materials.push( material );\n\n\t\treturn material;\n\n\t}\n\n\t_createMaterial( material, renderEnvironment ) {\n\n\t\tif ( material === undefined ) {\n\n\t\t\treturn new MeshStandardMaterial( {\n\t\t\t\tcolor: new Color( 1, 1, 1 ),\n\t\t\t\tmetalness: 0.8,\n\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\tside: DoubleSide\n\t\t\t} );\n\n\t\t}\n\n\t\t//console.log(material)\n\n\t\tconst mat = new MeshPhysicalMaterial( {\n\n\t\t\tcolor: new Color( material.diffuseColor.r / 255.0, material.diffuseColor.g / 255.0, material.diffuseColor.b / 255.0 ),\n\t\t\temissive: new Color( material.emissionColor.r, material.emissionColor.g, material.emissionColor.b ),\n\t\t\tflatShading: material.disableLighting,\n\t\t\tior: material.indexOfRefraction,\n\t\t\tname: material.name,\n\t\t\treflectivity: material.reflectivity,\n\t\t\topacity: 1.0 - material.transparency,\n\t\t\tside: DoubleSide, // todo should we change?\n\t\t\tspecularColor: material.specularColor,\n\t\t\ttransparent: material.transparency > 0 ? true : false\n\n\t\t} );\n\n\t\tmat.userData.id = material.id;\n\n\t\tif ( material.pbrSupported ) {\n\n\t\t\tconst pbr = material.pbr;\n\n\t\t\tmat.anisotropy = pbr.anisotropic;\n\t\t\tmat.anisotropyRotation = pbr.anisotropicRotation;\n\t\t\tmat.color = new Color( pbr.baseColor.r, pbr.baseColor.g, pbr.baseColor.b );\n\t\t\tmat.clearcoat = pbr.clearcoat;\n\t\t\tmat.clearcoatRoughness = pbr.clearcoatRoughness;\n\t\t\tmat.metalness = pbr.metallic;\n\t\t\tmat.transmission = 1 - pbr.opacity;\n\t\t\tmat.roughness = pbr.roughness;\n\t\t\tmat.sheen = pbr.sheen;\n\t\t\tmat.specularIntensity = pbr.specular;\n\t\t\tmat.thickness = pbr.subsurface;\n\n\t\t}\n\n\t\tif ( material.pbrSupported && material.pbr.opacity === 0 && material.transparency === 1 ) {\n\n\t\t\t//some compromises\n\n\t\t\tmat.opacity = 0.2;\n\t\t\tmat.transmission = 1.00;\n\n\t\t}\n\n\t\tconst textureLoader = new TextureLoader();\n\n\t\tfor ( let i = 0; i < material.textures.length; i ++ ) {\n\n\t\t\tconst texture = material.textures[ i ];\n\n\t\t\tif ( texture.image !== null ) {\n\n\t\t\t\tconst map = textureLoader.load( texture.image );\n\n\t\t\t\t//console.log(texture.type )\n\n\t\t\t\tswitch ( texture.type ) {\n\n\t\t\t\t\tcase 'Bump':\n\n\t\t\t\t\t\tmat.bumpMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Diffuse':\n\n\t\t\t\t\t\tmat.map = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Emap':\n\n\t\t\t\t\t\tmat.envMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Opacity':\n\n\t\t\t\t\t\tmat.transmissionMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Transparency':\n\n\t\t\t\t\t\tmat.alphaMap = map;\n\t\t\t\t\t\tmat.transparent = true;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Alpha':\n\n\t\t\t\t\t\tmat.alphaMap = map;\n\t\t\t\t\t\tmat.transparent = true;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_AmbientOcclusion':\n\n\t\t\t\t\t\tmat.aoMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Anisotropic':\n\n\t\t\t\t\t\tmat.anisotropyMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_BaseColor':\n\n\t\t\t\t\t\tmat.map = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Clearcoat':\n\n\t\t\t\t\t\tmat.clearcoatMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_ClearcoatBump':\n\n\t\t\t\t\t\tmat.clearcoatNormalMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_ClearcoatRoughness':\n\n\t\t\t\t\t\tmat.clearcoatRoughnessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Displacement':\n\n\t\t\t\t\t\tmat.displacementMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Emission':\n\n\t\t\t\t\t\tmat.emissiveMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Metallic':\n\n\t\t\t\t\t\tmat.metalnessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Roughness':\n\n\t\t\t\t\t\tmat.roughnessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Sheen':\n\n\t\t\t\t\t\tmat.sheenColorMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Specular':\n\n\t\t\t\t\t\tmat.specularColorMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Subsurface':\n\n\t\t\t\t\t\tmat.thicknessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tthis.warnings.push( {\n\t\t\t\t\t\t\tmessage: `THREE.3DMLoader: No conversion exists for 3dm ${texture.type}.`,\n\t\t\t\t\t\t\ttype: 'no conversion'\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tmap.wrapS = texture.wrapU === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\t\t\t\tmap.wrapT = texture.wrapV === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\t\t\tif ( texture.repeat ) {\n\n\t\t\t\t\tmap.repeat.set( texture.repeat[ 0 ], texture.repeat[ 1 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// todo repalash - do it through AssetImporter/LoadingManager\n\t\tif ( renderEnvironment ) {\n\n\t\t\tnew EXRLoader().load( renderEnvironment.image, function ( texture ) {\n\n\t\t\t\ttexture.mapping = THREE.EquirectangularReflectionMapping;\n\t\t\t\tmat.envMap = texture;\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn mat;\n\n\t}\n\n\t_createGeometry( data ) {\n\n\t\tconst object = new Object3D();\n\t\tconst instanceDefinitionObjects = [];\n\t\tconst instanceDefinitions = [];\n\t\tconst instanceReferences = [];\n\n\t\tobject.userData[ 'layers' ] = data.layers;\n\t\tobject.userData[ 'groups' ] = data.groups;\n\t\tobject.userData[ 'settings' ] = data.settings;\n\t\tobject.userData.settings[ 'renderSettings' ] = data.renderSettings;\n\t\tobject.userData[ 'strings' ] = data.strings;\n\t\tobject.userData[ 'objectType' ] = 'File3dm';\n\t\tobject.userData[ 'materials' ] = null;\n\n\t\tobject.name = this.url;\n\n\t\tlet objects = data.objects;\n\t\tconst materials = data.materials;\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\tconst obj = objects[ i ];\n\t\t\tconst attributes = obj.attributes;\n\n\t\t\tswitch ( obj.objectType ) {\n\n\t\t\t\tcase 'InstanceDefinition':\n\n\t\t\t\t\tinstanceDefinitions.push( obj );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'InstanceReference':\n\n\t\t\t\t\tinstanceReferences.push( obj );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tlet matId = null;\n\n\t\t\t\t\tswitch ( attributes.materialSource.name ) {\n\n\t\t\t\t\t\tcase 'ObjectMaterialSource_MaterialFromLayer':\n\t\t\t\t\t\t\t//check layer index\n\t\t\t\t\t\t\tif ( attributes.layerIndex >= 0 ) {\n\n\t\t\t\t\t\t\t\tmatId = data.layers[ attributes.layerIndex ].renderMaterialIndex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ObjectMaterialSource_MaterialFromObject':\n\n\t\t\t\t\t\t\tif ( attributes.materialIndex >= 0 ) {\n\n\t\t\t\t\t\t\t\tmatId = attributes.materialIndex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet material = null;\n\n\t\t\t\t\tif ( matId >= 0 ) {\n\n\t\t\t\t\t\tconst rMaterial = materials[ matId ];\n\t\t\t\t\t\tmaterial = this._createMaterial( rMaterial, data.renderEnvironment );\n\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst _object = this._createObject( obj, material );\n\n\t\t\t\t\tif ( _object === undefined ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst layer = data.layers[ attributes.layerIndex ];\n\n\t\t\t\t\t_object.visible = layer ? layer.visible : true;\n\n\t\t\t\t\tif ( attributes.isInstanceDefinitionObject ) {\n\n\t\t\t\t\t\tinstanceDefinitionObjects.push( _object );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.add( _object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < instanceDefinitions.length; i ++ ) {\n\n\t\t\tconst iDef = instanceDefinitions[ i ];\n\n\t\t\tobjects = [];\n\n\t\t\tfor ( let j = 0; j < iDef.attributes.objectIds.length; j ++ ) {\n\n\t\t\t\tconst objId = iDef.attributes.objectIds[ j ];\n\n\t\t\t\tfor ( let p = 0; p < instanceDefinitionObjects.length; p ++ ) {\n\n\t\t\t\t\tconst idoId = instanceDefinitionObjects[ p ].userData.attributes.id;\n\n\t\t\t\t\tif ( objId === idoId ) {\n\n\t\t\t\t\t\tobjects.push( instanceDefinitionObjects[ p ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Currently clones geometry and does not take advantage of instancing\n\n\t\t\tfor ( let j = 0; j < instanceReferences.length; j ++ ) {\n\n\t\t\t\tconst iRef = instanceReferences[ j ];\n\n\t\t\t\tif ( iRef.geometry.parentIdefId === iDef.attributes.id ) {\n\n\t\t\t\t\tconst xf = iRef.geometry.xform.array;\n\n\t\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\t\tmatrix.set( ...xf );\n\n\t\t\t\t\tif ( objects.length === 1 ) {\n\n\t\t\t\t\t\tconst clone = objects[ 0 ].clone( true );\n\n\t\t\t\t\t\tclone.name = iRef.attributes.name || clone.name;\n\t\t\t\t\t\tclone.applyMatrix4( matrix );\n\n\t\t\t\t\t\tif ( iRef.attributes.materialIndex >= 0 && iRef.attributes.materialIndex !== objects[ 0 ].userData.attributes.materialIndex ) {\n\n\t\t\t\t\t\t\tconst rMaterial = materials[ iRef.attributes.materialIndex ];\n\t\t\t\t\t\t\tconst material = this._createMaterial( rMaterial );\n\t\t\t\t\t\t\tclone.material = this._compareMaterials( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tclone.userData[ 'defAttributes' ] = clone.userData.attributes;\n\t\t\t\t\t\tclone.userData[ 'defObjectType' ] = clone.userData.objectType;\n\t\t\t\t\t\tclone.userData[ 'attributes' ] = { ...clone.userData.attributes, ...iRef.attributes };\n\t\t\t\t\t\tclone.userData[ 'objectType' ] = iRef.objectType;\n\t\t\t\t\t\tif ( iRef.attributes.layerIndex !== undefined ) {\n\n\t\t\t\t\t\t\tconst layer = data.layers[ iRef.attributes.layerIndex ];\n\t\t\t\t\t\t\tclone.visible = layer ? layer.visible : clone.visible;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tobject.add( clone );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.Rhino3dmLoader: InstanceReference with multiple/no objects, not all properties will be copied.' );\n\n\t\t\t\t\t\tconst iRefObject = new Object3D();\n\n\t\t\t\t\t\tiRefObject.applyMatrix4( matrix );\n\n\t\t\t\t\t\tfor ( let p = 0; p < objects.length; p ++ ) {\n\n\t\t\t\t\t\t\tiRefObject.add( objects[ p ].clone( true ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tobject.add( iRefObject );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tobject.userData[ 'materials' ] = this.materials;\n\t\t// todo removing name?\n\t\tobject.name = '';\n\t\treturn object;\n\n\t}\n\n\t_createObject( obj, mat ) {\n\n\t\tconst loader = new BufferGeometryLoader();\n\n\t\tconst attributes = obj.attributes;\n\n\t\tlet geometry, material, _color, color;\n\n\t\tswitch ( obj.objectType ) {\n\n\t\t\tcase 'Point':\n\t\t\tcase 'PointSet':\n\n\t\t\t\tgeometry = loader.parse( obj.geometry );\n\n\t\t\t\tif ( geometry.attributes.hasOwnProperty( 'color' ) ) {\n\n\t\t\t\t\tmaterial = new PointsMaterial( { vertexColors: true, sizeAttenuation: false, size: 2 } );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_color = attributes.drawColor;\n\t\t\t\t\tcolor = new Color( _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 );\n\t\t\t\t\tmaterial = new PointsMaterial( { color: color, sizeAttenuation: false, size: 2 } );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = this._compareMaterials( material );\n\n\t\t\t\tconst points = new Points( geometry, material );\n\t\t\t\tpoints.userData[ 'attributes' ] = attributes;\n\t\t\t\tpoints.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tpoints.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn points;\n\n\t\t\tcase 'Mesh':\n\t\t\tcase 'Extrusion':\n\t\t\tcase 'SubD':\n\t\t\tcase 'Brep':\n\n\t\t\t\tif ( obj.geometry === null ) return;\n\n\t\t\t\tgeometry = loader.parse( obj.geometry );\n\n\n\t\t\t\tif ( mat === null ) {\n\n\t\t\t\t\tmat = this._createMaterial();\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( geometry.attributes.hasOwnProperty( 'color' ) ) {\n\n\t\t\t\t\tmat.vertexColors = true;\n\n\t\t\t\t}\n\n\t\t\t\tmat = this._compareMaterials( mat );\n\n\t\t\t\tconst mesh = new Mesh( geometry, mat );\n\t\t\t\tmesh.castShadow = attributes.castsShadows;\n\t\t\t\tmesh.receiveShadow = attributes.receivesShadows;\n\t\t\t\tmesh.userData[ 'attributes' ] = attributes;\n\t\t\t\tmesh.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tmesh.name = attributes.name;\n\t\t\t\t\tgeometry.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn mesh;\n\n\t\t\tcase 'Curve':\n\n\t\t\t\tgeometry = loader.parse( obj.geometry );\n\n\t\t\t\t_color = attributes.drawColor;\n\t\t\t\tcolor = new Color( _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 );\n\n\t\t\t\tmaterial = new LineBasicMaterial( { color: color } );\n\t\t\t\tmaterial = this._compareMaterials( material );\n\n\t\t\t\tconst lines = new Line( geometry, material );\n\t\t\t\tlines.userData[ 'attributes' ] = attributes;\n\t\t\t\tlines.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tlines.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn lines;\n\n\t\t\tcase 'TextDot':\n\n\t\t\t\tgeometry = obj.geometry;\n\n\t\t\t\tconst ctx = document.createElement( 'canvas' ).getContext( '2d' );\n\t\t\t\tconst font = `${geometry.fontHeight}px ${geometry.fontFace}`;\n\t\t\t\tctx.font = font;\n\t\t\t\tconst width = ctx.measureText( geometry.text ).width + 10;\n\t\t\t\tconst height = geometry.fontHeight + 10;\n\n\t\t\t\tconst r = window.devicePixelRatio;\n\n\t\t\t\tctx.canvas.width = width * r;\n\t\t\t\tctx.canvas.height = height * r;\n\t\t\t\tctx.canvas.style.width = width + 'px';\n\t\t\t\tctx.canvas.style.height = height + 'px';\n\t\t\t\tctx.setTransform( r, 0, 0, r, 0, 0 );\n\n\t\t\t\tctx.font = font;\n\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\tctx.textAlign = 'center';\n\t\t\t\tcolor = attributes.drawColor;\n\t\t\t\tctx.fillStyle = `rgba(${color.r},${color.g},${color.b},${color.a})`;\n\t\t\t\tctx.fillRect( 0, 0, width, height );\n\t\t\t\tctx.fillStyle = 'white';\n\t\t\t\tctx.fillText( geometry.text, width / 2, height / 2 );\n\n\t\t\t\tconst texture = new CanvasTexture( ctx.canvas );\n\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttexture.wrapS = ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = ClampToEdgeWrapping;\n\n\t\t\t\tmaterial = new SpriteMaterial( { map: texture, depthTest: false } );\n\t\t\t\tconst sprite = new Sprite( material );\n\t\t\t\tsprite.position.set( geometry.point[ 0 ], geometry.point[ 1 ], geometry.point[ 2 ] );\n\t\t\t\tsprite.scale.set( width / 10, height / 10, 1.0 );\n\n\t\t\t\tsprite.userData[ 'attributes' ] = attributes;\n\t\t\t\tsprite.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tsprite.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn sprite;\n\n\t\t\tcase 'Light':\n\n\t\t\t\tgeometry = obj.geometry;\n\n\t\t\t\tlet light;\n\n\t\t\t\tswitch ( geometry.lightStyle.name ) {\n\n\t\t\t\t\tcase 'LightStyle_WorldPoint':\n\n\t\t\t\t\t\tlight = new PointLight();\n\t\t\t\t\t\tlight.castShadow = attributes.castsShadows;\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ], geometry.location[ 1 ], geometry.location[ 2 ] );\n\t\t\t\t\t\tlight.shadow.normalBias = 0.1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldSpot':\n\n\t\t\t\t\t\tlight = new SpotLight();\n\t\t\t\t\t\tlight.castShadow = attributes.castsShadows;\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ], geometry.location[ 1 ], geometry.location[ 2 ] );\n\t\t\t\t\t\tlight.target.position.set( geometry.direction[ 0 ], geometry.direction[ 1 ], geometry.direction[ 2 ] );\n\t\t\t\t\t\tlight.angle = geometry.spotAngleRadians;\n\t\t\t\t\t\tlight.shadow.normalBias = 0.1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldRectangular':\n\n\t\t\t\t\t\tlight = new RectAreaLight();\n\t\t\t\t\t\tconst width = Math.abs( geometry.width[ 2 ] );\n\t\t\t\t\t\tconst height = Math.abs( geometry.length[ 0 ] );\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ] - ( height / 2 ), geometry.location[ 1 ], geometry.location[ 2 ] - ( width / 2 ) );\n\t\t\t\t\t\tlight.height = height;\n\t\t\t\t\t\tlight.width = width;\n\t\t\t\t\t\tlight.lookAt( geometry.direction[ 0 ], geometry.direction[ 1 ], geometry.direction[ 2 ] );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldDirectional':\n\n\t\t\t\t\t\tlight = new DirectionalLight();\n\t\t\t\t\t\tlight.castShadow = attributes.castsShadows;\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ], geometry.location[ 1 ], geometry.location[ 2 ] );\n\t\t\t\t\t\tlight.target.position.set( geometry.direction[ 0 ], geometry.direction[ 1 ], geometry.direction[ 2 ] );\n\t\t\t\t\t\tlight.shadow.normalBias = 0.1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldLinear':\n\t\t\t\t\t\t// no conversion exists, warning has already been printed to the console\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( light ) {\n\n\t\t\t\t\tlight.intensity = geometry.intensity;\n\t\t\t\t\t_color = geometry.diffuse;\n\t\t\t\t\tcolor = new Color( _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 );\n\t\t\t\t\tlight.color = color;\n\t\t\t\t\tlight.userData[ 'attributes' ] = attributes;\n\t\t\t\t\tlight.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\t}\n\n\t\t\t\treturn light;\n\n\t\t}\n\n\t}\n\n\t_initLibrary() {\n\n\t\tif ( ! this.libraryPending ) {\n\n\t\t\t// Load rhino3dm wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.libraryPath );\n\t\t\tconst jsContent = new Promise( ( resolve, reject ) => {\n\n\t\t\t\tjsLoader.load( 'rhino3dm.js', resolve, undefined, reject );\n\n\t\t\t} );\n\n\t\t\t// Load rhino3dm WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.libraryPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tconst binaryContent = new Promise( ( resolve, reject ) => {\n\n\t\t\t\tbinaryLoader.load( 'rhino3dm.wasm', resolve, undefined, reject );\n\n\t\t\t} );\n\n\t\t\tthis.libraryPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\t//this.libraryBinary = binaryContent;\n\t\t\t\t\tthis.libraryConfig.wasmBinary = binaryContent;\n\n\t\t\t\t\tconst fn = Rhino3DMWorkerStr;\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* rhino3dm.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\treturn this.libraryPending;\n\n\t}\n\n\t_getWorker( taskCost ) {\n\n\t\treturn this._initLibrary().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( {\n\t\t\t\t\ttype: 'init',\n\t\t\t\t\tlibraryConfig: this.libraryConfig\n\t\t\t\t} );\n\n\t\t\t\tworker.onmessage = e => {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'warning':\n\t\t\t\t\t\t\tthis.warnings.push( message.data );\n\t\t\t\t\t\t\tconsole.warn( message.data );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Rhino3dmLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\n\t\t\tworker._taskLoad += taskCost;\n\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nconst Rhino3DMWorkerStr = `\nfunction Rhino3dmWorker() {\n\n\tlet libraryPending;\n\tlet libraryConfig;\n\tlet rhino;\n\tlet taskID;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\n\t\t\t\tlibraryConfig = message.libraryConfig;\n\t\t\t\tconst wasmBinary = libraryConfig.wasmBinary;\n\t\t\t\tlet RhinoModule;\n\t\t\t\tlibraryPending = new Promise( function ( resolve ) {\n\n\t\t\t\t\t/* Like Basis Loader */\n\t\t\t\t\tRhinoModule = { wasmBinary, onRuntimeInitialized: resolve };\n\n\t\t\t\t\trhino3dm( RhinoModule ); // eslint-disable-line no-undef\n\n\t\t\t\t } ).then( () => {\n\n\t\t\t\t\trhino = RhinoModule;\n\n\t\t\t\t } );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\n\t\t\t\ttaskID = message.id;\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tlibraryPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst data = decodeObjects( rhino, buffer );\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, data } );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeObjects( rhino, buffer ) {\n\n\t\tconst arr = new Uint8Array( buffer );\n\t\tconst doc = rhino.File3dm.fromByteArray( arr );\n\n\t\tconst objects = [];\n\t\tconst materials = [];\n\t\tconst layers = [];\n\t\tconst views = [];\n\t\tconst namedViews = [];\n\t\tconst groups = [];\n\t\tconst strings = [];\n\n\t\t//Handle objects\n\n\t\tconst objs = doc.objects();\n\t\tconst cnt = objs.count;\n\n\t\tfor ( let i = 0; i < cnt; i ++ ) {\n\n\t\t\tconst _object = objs.get( i );\n\n\t\t\tconst object = extractObjectData( _object, doc );\n\n\t\t\t_object.delete();\n\n\t\t\tif ( object ) {\n\n\t\t\t\tobjects.push( object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Handle instance definitions\n\t\t// console.log( \\`Instance Definitions Count: \\$\\{doc.instanceDefinitions().count()\\}\\` );\n\n\t\tfor ( let i = 0; i < doc.instanceDefinitions().count; i ++ ) {\n\n\t\t\tconst idef = doc.instanceDefinitions().get( i );\n\t\t\tconst idefAttributes = extractProperties( idef );\n\t\t\tidefAttributes.objectIds = idef.getObjectIds();\n\n\t\t\tobjects.push( { geometry: null, attributes: idefAttributes, objectType: 'InstanceDefinition' } );\n\n\t\t}\n\n\t\t// Handle materials\n\n\t\tconst textureTypes = [\n\t\t\t// rhino.TextureType.Bitmap,\n\t\t\trhino.TextureType.Diffuse,\n\t\t\trhino.TextureType.Bump,\n\t\t\trhino.TextureType.Transparency,\n\t\t\trhino.TextureType.Opacity,\n\t\t\trhino.TextureType.Emap\n\t\t];\n\n\t\tconst pbrTextureTypes = [\n\t\t\trhino.TextureType.PBR_BaseColor,\n\t\t\trhino.TextureType.PBR_Subsurface,\n\t\t\trhino.TextureType.PBR_SubsurfaceScattering,\n\t\t\trhino.TextureType.PBR_SubsurfaceScatteringRadius,\n\t\t\trhino.TextureType.PBR_Metallic,\n\t\t\trhino.TextureType.PBR_Specular,\n\t\t\trhino.TextureType.PBR_SpecularTint,\n\t\t\trhino.TextureType.PBR_Roughness,\n\t\t\trhino.TextureType.PBR_Anisotropic,\n\t\t\trhino.TextureType.PBR_Anisotropic_Rotation,\n\t\t\trhino.TextureType.PBR_Sheen,\n\t\t\trhino.TextureType.PBR_SheenTint,\n\t\t\trhino.TextureType.PBR_Clearcoat,\n\t\t\trhino.TextureType.PBR_ClearcoatBump,\n\t\t\trhino.TextureType.PBR_ClearcoatRoughness,\n\t\t\trhino.TextureType.PBR_OpacityIor,\n\t\t\trhino.TextureType.PBR_OpacityRoughness,\n\t\t\trhino.TextureType.PBR_Emission,\n\t\t\trhino.TextureType.PBR_AmbientOcclusion,\n\t\t\trhino.TextureType.PBR_Displacement\n\t\t];\n\n\t\tfor ( let i = 0; i < doc.materials().count; i ++ ) {\n\n\t\t\tconst _material = doc.materials().get( i );\n\n\t\t\tconst material = extractProperties( _material );\n\n\t\t\tconst textures = [];\n\n\t\t\ttextures.push( ...extractTextures( _material, textureTypes, doc ) );\n\n\t\t\tmaterial.pbrSupported = _material.physicallyBased().supported;\n\n\t\t\tif ( material.pbrSupported ) {\n\n\t\t\t\ttextures.push( ...extractTextures( _material, pbrTextureTypes, doc ) );\n\t\t\t\tmaterial.pbr = extractProperties( _material.physicallyBased() );\n\n\t\t\t}\n\n\t\t\tmaterial.textures = textures;\n\n\t\t\tmaterials.push( material );\n\n\t\t\t_material.delete();\n\n\t\t}\n\n\t\t// Handle layers\n\n\t\tfor ( let i = 0; i < doc.layers().count; i ++ ) {\n\n\t\t\tconst _layer = doc.layers().get( i );\n\t\t\tconst layer = extractProperties( _layer );\n\n\t\t\tlayers.push( layer );\n\n\t\t\t_layer.delete();\n\n\t\t}\n\n\t\t// Handle views\n\n\t\tfor ( let i = 0; i < doc.views().count; i ++ ) {\n\n\t\t\tconst _view = doc.views().get( i );\n\t\t\tconst view = extractProperties( _view );\n\n\t\t\tviews.push( view );\n\n\t\t\t_view.delete();\n\n\t\t}\n\n\t\t// Handle named views\n\n\t\tfor ( let i = 0; i < doc.namedViews().count; i ++ ) {\n\n\t\t\tconst _namedView = doc.namedViews().get( i );\n\t\t\tconst namedView = extractProperties( _namedView );\n\n\t\t\tnamedViews.push( namedView );\n\n\t\t\t_namedView.delete();\n\n\t\t}\n\n\t\t// Handle groups\n\n\t\tfor ( let i = 0; i < doc.groups().count; i ++ ) {\n\n\t\t\tconst _group = doc.groups().get( i );\n\t\t\tconst group = extractProperties( _group );\n\n\t\t\tgroups.push( group );\n\n\t\t\t_group.delete();\n\n\t\t}\n\n\t\t// Handle settings\n\n\t\tconst settings = extractProperties( doc.settings() );\n\n\t\t//TODO: Handle other document stuff like dimstyles, instance definitions, bitmaps etc.\n\n\t\t// Handle dimstyles\n\t\t// console.log( \\`Dimstyle Count: \\$\\{doc.dimstyles().count()\\}\\` );\n\n\t\t// Handle bitmaps\n\t\t// console.log( \\`Bitmap Count: \\$\\{doc.bitmaps().count()\\}\\` );\n\n\t\t// Handle strings\n\t\t// console.log( \\`Document Strings Count: \\$\\{doc.strings().count()\\}\\` );\n\t\t// Note: doc.strings().documentUserTextCount() counts any doc.strings defined in a section\n\t\t// console.log( \\`Document User Text Count: \\$\\{doc.strings().documentUserTextCount()\\}\\` );\n\n\t\tconst strings_count = doc.strings().count;\n\n\t\tfor ( let i = 0; i < strings_count; i ++ ) {\n\n\t\t\tstrings.push( doc.strings().get( i ) );\n\n\t\t}\n\n\t\t// Handle Render Environments for Material Environment\n\n\t\t// get the id of the active render environment skylight, which we'll use for environment texture\n\t\tconst reflectionId = doc.settings().renderSettings().renderEnvironments.reflectionId;\n\n\t\tconst rc = doc.renderContent();\n\n\t\tlet renderEnvironment = null;\n\n\t\tfor ( let i = 0; i < rc.count; i ++ ) {\n\n\t\t\tconst content = rc.get(i);\n\n\t\t\tswitch ( content.kind ) {\n\n\t\t\t\tcase 'environment':\n\n\t\t\t\t\tconst id = content.id;\n\n\t\t\t\t\t// there could be multiple render environments in a 3dm file\n\t\t\t\t\tif ( id !== reflectionId ) break;\n\n\t\t\t\t\tconst renderTexture = content.findChild( 'texture' );\n\t\t\t\t\tconst fileName = renderTexture.fileName;\n\n\t\t\t\t\tfor ( let j = 0; j < doc.embeddedFiles().count; j ++ ) {\n\n\t\t\t\t\t\tconst _fileName = doc.embeddedFiles().get( j ).fileName;\n\n\t\t\t\t\t\tif ( fileName === _fileName ) {\n\n\t\t\t\t\t\t\tconst background = doc.getEmbeddedFileAsBase64( fileName );\n\t\t\t\t\t\t\tconst backgroundImage = 'data:image/png;base64,' + background;\n\t\t\t\t\t\t\trenderEnvironment = { type: 'renderEnvironment', image: backgroundImage, name: fileName };\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Handle Render Settings\n\n\t\tconst renderSettings = {\n\t\t\tambientLight: doc.settings().renderSettings().ambientLight,\n\t\t\tbackgroundColorTop: doc.settings().renderSettings().backgroundColorTop,\n\t\t\tbackgroundColorBottom: doc.settings().renderSettings().backgroundColorBottom,\n\t\t\tuseHiddenLights: doc.settings().renderSettings().useHiddenLights,\n\t\t\tdepthCue: doc.settings().renderSettings().depthCue,\n\t\t\tflatShade: doc.settings().renderSettings().flatShade,\n\t\t\trenderBackFaces: doc.settings().renderSettings().renderBackFaces,\n\t\t\trenderPoints: doc.settings().renderSettings().renderPoints,\n\t\t\trenderCurves: doc.settings().renderSettings().renderCurves,\n\t\t\trenderIsoParams: doc.settings().renderSettings().renderIsoParams,\n\t\t\trenderMeshEdges: doc.settings().renderSettings().renderMeshEdges,\n\t\t\trenderAnnotations: doc.settings().renderSettings().renderAnnotations,\n\t\t\tuseViewportSize: doc.settings().renderSettings().useViewportSize,\n\t\t\tscaleBackgroundToFit: doc.settings().renderSettings().scaleBackgroundToFit,\n\t\t\ttransparentBackground: doc.settings().renderSettings().transparentBackground,\n\t\t\timageDpi: doc.settings().renderSettings().imageDpi,\n\t\t\tshadowMapLevel: doc.settings().renderSettings().shadowMapLevel,\n\t\t\tnamedView: doc.settings().renderSettings().namedView,\n\t\t\tsnapShot: doc.settings().renderSettings().snapShot,\n\t\t\tspecificViewport: doc.settings().renderSettings().specificViewport,\n\t\t\tgroundPlane: extractProperties( doc.settings().renderSettings().groundPlane ),\n\t\t\tsafeFrame: extractProperties( doc.settings().renderSettings().safeFrame ),\n\t\t\tdithering: extractProperties( doc.settings().renderSettings().dithering ),\n\t\t\tskylight: extractProperties( doc.settings().renderSettings().skylight ),\n\t\t\tlinearWorkflow: extractProperties( doc.settings().renderSettings().linearWorkflow ),\n\t\t\trenderChannels: extractProperties( doc.settings().renderSettings().renderChannels ),\n\t\t\tsun: extractProperties( doc.settings().renderSettings().sun ),\n\t\t\trenderEnvironments: extractProperties( doc.settings().renderSettings().renderEnvironments ),\n\t\t\tpostEffects: extractProperties( doc.settings().renderSettings().postEffects ),\n\n\t\t};\n\n\t\tdoc.delete();\n\n\t\treturn { objects, materials, layers, views, namedViews, groups, strings, settings, renderSettings, renderEnvironment };\n\n\t}\n\n\tfunction extractTextures( m, tTypes, d ) {\n\n\t\tconst textures = [];\n\n\t\tfor ( let i = 0; i < tTypes.length; i ++ ) {\n\n\t\t\tconst _texture = m.getTexture( tTypes[ i ] );\n\t\t\tif ( _texture ) {\n\n\t\t\t\tlet textureType = tTypes[ i ].constructor.name;\n\t\t\t\ttextureType = textureType.substring( 12, textureType.length );\n\t\t\t\tconst texture = extractTextureData( _texture, textureType, d );\n\t\t\t\ttextures.push( texture );\n\t\t\t\t_texture.delete();\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tfunction extractTextureData( t, tType, d ) {\n\n\t\tconst texture = { type: tType };\n\n\t\tconst image = d.getEmbeddedFileAsBase64( t.fileName );\n\n\t\ttexture.wrapU = t.wrapU;\n\t\ttexture.wrapV = t.wrapV;\n\t\ttexture.wrapW = t.wrapW;\n\t\tconst uvw = t.uvwTransform.toFloatArray( true );\n\n\t\ttexture.repeat = [ uvw[ 0 ], uvw[ 5 ] ];\n\n\t\tif ( image ) {\n\n\t\t\ttexture.image = 'data:image/png;base64,' + image;\n\n\t\t} else {\n\n\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\tmessage: \\`THREE.3DMLoader: Image for \\$\\{tType\\} texture not embedded in file.\\`,\n\t\t\t\ttype: 'missing resource'\n\t\t\t}\n\n\t\t\t} );\n\n\t\t\ttexture.image = null;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction extractObjectData( object, doc ) {\n\n\t\tconst _geometry = object.geometry();\n\t\tconst _attributes = object.attributes();\n\t\tlet objectType = _geometry.objectType;\n\t\tlet geometry, attributes, position, data, mesh;\n\n\t\t// skip instance definition objects\n\t\t//if( _attributes.isInstanceDefinitionObject ) { continue; }\n\n\t\t// TODO: handle other geometry types\n\t\tswitch ( objectType ) {\n\n\t\t\tcase rhino.ObjectType.Curve:\n\n\t\t\t\tconst pts = curveToPoints( _geometry, 100 );\n\n\t\t\t\tposition = {};\n\t\t\t\tattributes = {};\n\t\t\t\tdata = {};\n\n\t\t\t\tposition.itemSize = 3;\n\t\t\t\tposition.type = 'Float32Array';\n\t\t\t\tposition.array = [];\n\n\t\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\t\tposition.array.push( pts[ j ][ 0 ] );\n\t\t\t\t\tposition.array.push( pts[ j ][ 1 ] );\n\t\t\t\t\tposition.array.push( pts[ j ][ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t\tattributes.position = position;\n\t\t\t\tdata.attributes = attributes;\n\n\t\t\t\tgeometry = { data };\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Point:\n\n\t\t\t\tconst pt = _geometry.location;\n\n\t\t\t\tposition = {};\n\t\t\t\tconst color = {};\n\t\t\t\tattributes = {};\n\t\t\t\tdata = {};\n\n\t\t\t\tposition.itemSize = 3;\n\t\t\t\tposition.type = 'Float32Array';\n\t\t\t\tposition.array = [ pt[ 0 ], pt[ 1 ], pt[ 2 ] ];\n\n\t\t\t\tconst _color = _attributes.drawColor( doc );\n\n\t\t\t\tcolor.itemSize = 3;\n\t\t\t\tcolor.type = 'Float32Array';\n\t\t\t\tcolor.array = [ _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 ];\n\n\t\t\t\tattributes.position = position;\n\t\t\t\tattributes.color = color;\n\t\t\t\tdata.attributes = attributes;\n\n\t\t\t\tgeometry = { data };\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.PointSet:\n\t\t\tcase rhino.ObjectType.Mesh:\n\n\t\t\t\tgeometry = _geometry.toThreejsJSON();\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Brep:\n\n\t\t\t\tconst faces = _geometry.faces();\n\t\t\t\tmesh = new rhino.Mesh();\n\n\t\t\t\tfor ( let faceIndex = 0; faceIndex < faces.count; faceIndex ++ ) {\n\n\t\t\t\t\tconst face = faces.get( faceIndex );\n\t\t\t\t\tconst _mesh = face.getMesh( rhino.MeshType.Any );\n\n\t\t\t\t\tif ( _mesh ) {\n\n\t\t\t\t\t\tmesh.append( _mesh );\n\t\t\t\t\t\t_mesh.delete();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tface.delete();\n\n\t\t\t\t}\n\n\t\t\t\tif ( mesh.faces().count > 0 ) {\n\n\t\t\t\t\tmesh.compact();\n\t\t\t\t\tgeometry = mesh.toThreejsJSON();\n\t\t\t\t\tfaces.delete();\n\n\t\t\t\t}\n\n\t\t\t\tmesh.delete();\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Extrusion:\n\n\t\t\t\tmesh = _geometry.getMesh( rhino.MeshType.Any );\n\n\t\t\t\tif ( mesh ) {\n\n\t\t\t\t\tgeometry = mesh.toThreejsJSON();\n\t\t\t\t\tmesh.delete();\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.TextDot:\n\n\t\t\t\tgeometry = extractProperties( _geometry );\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Light:\n\n\t\t\t\tgeometry = extractProperties( _geometry );\n\n\t\t\t\tif ( geometry.lightStyle.name === 'LightStyle_WorldLinear' ) {\n\n\t\t\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\t\t\tmessage: \\`THREE.3DMLoader: No conversion exists for \\$\\{objectType.constructor.name} \\$\\{geometry.lightStyle.name\\}\\`,\n\t\t\t\t\t\ttype: 'no conversion',\n\t\t\t\t\t\tguid: _attributes.id\n\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.InstanceReference:\n\n\t\t\t\tgeometry = extractProperties( _geometry );\n\t\t\t\tgeometry.xform = extractProperties( _geometry.xform );\n\t\t\t\tgeometry.xform.array = _geometry.xform.toFloatArray( true );\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.SubD:\n\n\t\t\t\t// TODO: precalculate resulting vertices and faces and warn on excessive results\n\t\t\t\t_geometry.subdivide( 3 );\n\t\t\t\tmesh = rhino.Mesh.createFromSubDControlNet( _geometry, false );\n\t\t\t\tif ( mesh ) {\n\n\t\t\t\t\tgeometry = mesh.toThreejsJSON();\n\t\t\t\t\tmesh.delete();\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\t\t/*\n\t\t\t\tcase rhino.ObjectType.Annotation:\n\t\t\t\tcase rhino.ObjectType.Hatch:\n\t\t\t\tcase rhino.ObjectType.ClipPlane:\n\t\t\t\t*/\n\n\t\t\tdefault:\n\n\t\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\t\tmessage: \\`THREE.3DMLoader: Conversion not implemented for \\$\\{objectType.constructor.name\\}\\`,\n\t\t\t\t\ttype: 'not implemented',\n\t\t\t\t\tguid: _attributes.id\n\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( geometry ) {\n\n\t\t\tattributes = extractProperties( _attributes );\n\t\t\tattributes.geometry = extractProperties( _geometry );\n\n\t\t\tif ( _attributes.groupCount > 0 ) {\n\n\t\t\t\tattributes.groupIds = _attributes.getGroupList();\n\n\t\t\t}\n\n\t\t\tif ( _attributes.userStringCount > 0 ) {\n\n\t\t\t\tattributes.userStrings = _attributes.getUserStrings();\n\n\t\t\t}\n\n\t\t\tif ( _geometry.userStringCount > 0 ) {\n\n\t\t\t\tattributes.geometry.userStrings = _geometry.getUserStrings();\n\n\t\t\t}\n\n\t\t\tif ( _attributes.decals().count > 0 ) {\n\n\t\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\t\tmessage: \\`THREE.3DMLoader: No conversion exists for the decals associated with this object.\\`,\n\t\t\t\t\ttype: 'no conversion',\n\t\t\t\t\tguid: _attributes.id\n\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tattributes.drawColor = _attributes.drawColor( doc );\n\n\t\t\tobjectType = objectType.constructor.name;\n\t\t\tobjectType = objectType.substring( 11, objectType.length );\n\n\t\t\treturn { geometry, attributes, objectType };\n\n\t\t} else {\n\n\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\tmessage: \\`THREE.3DMLoader: \\$\\{objectType.constructor.name\\} has no associated mesh geometry.\\`,\n\t\t\t\ttype: 'missing mesh',\n\t\t\t\tguid: _attributes.id\n\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tfunction extractProperties( object ) {\n\n\t\tconst result = {};\n\n\t\tfor ( const property in object ) {\n\n\t\t\tconst value = object[ property ];\n\n\t\t\tif ( typeof value !== 'function' ) {\n\n\t\t\t\tif ( typeof value === 'object' && value !== null && value.hasOwnProperty( 'constructor' ) ) {\n\n\t\t\t\t\tresult[ property ] = { name: value.constructor.name, value: value.value };\n\n\t\t\t\t} else if ( typeof value === 'object' && value !== null ) {\n\n\t\t\t\t\tresult[ property ] = extractProperties( value );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresult[ property ] = value;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// these are functions that could be called to extract more data.\n\t\t\t\t//console.log( \\`\\$\\{property\\}: \\$\\{object[ property ].constructor.name}\\` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction curveToPoints( curve, pointLimit ) {\n\n\t\tlet pointCount = pointLimit;\n\t\tlet rc = [];\n\t\tconst ts = [];\n\n\t\tif ( curve instanceof rhino.LineCurve ) {\n\n\t\t\treturn [ curve.pointAtStart, curve.pointAtEnd ];\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.PolylineCurve ) {\n\n\t\t\tpointCount = curve.pointCount;\n\t\t\tfor ( let i = 0; i < pointCount; i ++ ) {\n\n\t\t\t\trc.push( curve.point( i ) );\n\n\t\t\t}\n\n\t\t\treturn rc;\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.PolyCurve ) {\n\n\t\t\tconst segmentCount = curve.segmentCount;\n\n\t\t\tfor ( let i = 0; i < segmentCount; i ++ ) {\n\n\t\t\t\tconst segment = curve.segmentCurve( i );\n\t\t\t\tconst segmentArray = curveToPoints( segment, pointCount );\n\t\t\t\trc = rc.concat( segmentArray );\n\t\t\t\tsegment.delete();\n\n\t\t\t}\n\n\t\t\treturn rc;\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.ArcCurve ) {\n\n\t\t\tpointCount = Math.floor( curve.angleDegrees / 5 );\n\t\t\tpointCount = pointCount < 2 ? 2 : pointCount;\n\t\t\t// alternative to this hardcoded version: https://stackoverflow.com/a/18499923/2179399\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.NurbsCurve && curve.degree === 1 ) {\n\n\t\t\tconst pLine = curve.tryGetPolyline();\n\n\t\t\tfor ( let i = 0; i < pLine.count; i ++ ) {\n\n\t\t\t\trc.push( pLine.get( i ) );\n\n\t\t\t}\n\n\t\t\tpLine.delete();\n\n\t\t\treturn rc;\n\n\t\t}\n\n\t\tconst domain = curve.domain;\n\t\tconst divisions = pointCount - 1.0;\n\n\t\tfor ( let j = 0; j < pointCount; j ++ ) {\n\n\t\t\tconst t = domain[ 0 ] + ( j / divisions ) * ( domain[ 1 ] - domain[ 0 ] );\n\n\t\t\tif ( t === domain[ 0 ] || t === domain[ 1 ] ) {\n\n\t\t\t\tts.push( t );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst tan = curve.tangentAt( t );\n\t\t\tconst prevTan = curve.tangentAt( ts.slice( - 1 )[ 0 ] );\n\n\t\t\t// Duplicated from THREE.Vector3\n\t\t\t// How to pass imports to worker?\n\n\t\t\tconst tS = tan[ 0 ] * tan[ 0 ] + tan[ 1 ] * tan[ 1 ] + tan[ 2 ] * tan[ 2 ];\n\t\t\tconst ptS = prevTan[ 0 ] * prevTan[ 0 ] + prevTan[ 1 ] * prevTan[ 1 ] + prevTan[ 2 ] * prevTan[ 2 ];\n\n\t\t\tconst denominator = Math.sqrt( tS * ptS );\n\n\t\t\tlet angle;\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\tangle = Math.PI / 2;\n\n\t\t\t} else {\n\n\t\t\t\tconst theta = ( tan.x * prevTan.x + tan.y * prevTan.y + tan.z * prevTan.z ) / denominator;\n\t\t\t\tangle = Math.acos( Math.max( - 1, Math.min( 1, theta ) ) );\n\n\t\t\t}\n\n\t\t\tif ( angle < 0.1 ) continue;\n\n\t\t\tts.push( t );\n\n\t\t}\n\n\t\trc = ts.map( t => curve.pointAt( t ) );\n\t\treturn rc;\n\n\t}\n\n}\n`;\n\nexport { Rhino3dmLoader };\n","import {Rhino3dmLoader} from 'three/examples/jsm/loaders/3DMLoader.js'\nimport {\n    Color,\n    DoubleSide,\n    InstancedMesh,\n    Line,\n    LineSegments,\n    LoadingManager,\n    Material,\n    Mesh,\n    MeshStandardMaterial,\n    Object3D,\n    Points,\n} from 'three'\nimport {getUrlQueryParam} from 'ts-browser-helpers'\n\nexport class Rhino3dmLoader2 extends Rhino3dmLoader {\n    // todo since 8.4.0(next version) it's not able to load some files like https://drive.google.com/file/d/1mWOCGIOWmaC4L7IxCvWM9dgeVYeDl8L-/view (request for access)\n    //  gets stuck at `rhino.File3dm.fromByteArray` call in the worker. Note three.js uses 8.4.0 version of rhino3dm.\n    /**\n     * Path to the rhino3dm.js library, default uses jsdelivr CDN\n     * You may want to set this to your own path or use {@link Rhino3dmLoader2.setLibraryPath}\n     * @default `https://cdn.jsdelivr.net/npm/rhino3dm@${getUrlQueryParam('rhino3dm', '8.0.1')}/`\n     */\n    public static LIBRARY_PATH = `https://cdn.jsdelivr.net/npm/rhino3dm@${getUrlQueryParam('rhino3dm', '8.0.1')}/`\n\n    constructor(manager?: LoadingManager) {\n        super(manager)\n        this.setLibraryPath(Rhino3dmLoader2.LIBRARY_PATH)\n    }\n    public static ImportMaterials = true\n    public static ForceLayerMaterials = false\n    public static ReplaceWithInstancedMesh = false\n    public static HideLineMesh = false\n    public static HidePointMesh = false\n    public static LoadUserDataStrings = true\n    public static LoadUserDataWarnings = true\n\n    materials: Material[] = []\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    _createMaterial(material: any): Material {\n        if (!Rhino3dmLoader2.ImportMaterials) return this.materials[0] || new MeshStandardMaterial({\n            color: new Color(1, 1, 1),\n            metalness: 0.8,\n            name: 'default',\n            side: DoubleSide,\n        })\n        return super._createMaterial(material)\n    }\n    private declare _compareMaterials: (material: Material) => Material\n\n    async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Object3D> {\n        const ret = await super.loadAsync(url, onProgress)\n        ret.rotateX(-Math.PI / 2) // since models are rotated\n        if (ret.userData.materials) delete ret.userData.materials // we don't want them saved in the file during export\n\n        // console.log(ret.userData)\n\n        const layers = ret.userData.layers\n        ret.traverse((obj) => {\n            const castShadow = obj.userData.attributes?.castsShadows\n            const receiveShadow = obj.userData.attributes?.receivesShadows\n            obj.castShadow = castShadow\n            obj.receiveShadow = receiveShadow\n            const layerIndex = obj.userData.attributes?.layerIndex ?? obj.userData.defAttributes?.layerIndex\n            const layer = layers[layerIndex]\n            if (layer) obj.userData.rhinoLayer = layer\n            obj.userData.rhino3dmRoot = ret.uuid\n\n            if (!Rhino3dmLoader2.LoadUserDataStrings)\n                obj.userData.strings = []\n            if (!Rhino3dmLoader2.LoadUserDataWarnings)\n                delete obj.userData.warnings\n\n            this._hideLineMesh(obj)\n            this._useInstancedMesh(obj)\n            this._useMaterialSource(obj, layer)\n        })\n        this.materials = [] // so that next file load doesn't give the same materials.\n        return ret\n    }\n\n    private _useMaterialSource(obj: Object3D, layer: any) {\n        if (!Rhino3dmLoader2.ImportMaterials) return\n        const mesh = obj as Mesh\n        if ((mesh.material as any)?.name === 'default' || Rhino3dmLoader2.ForceLayerMaterials) {\n\n            // https://developer.rhino3d.com/api/rhinoscript/object_methods/objectmaterialsource.htm\n            const materialSource = mesh.userData.attributes?.materialSource || mesh.userData.defAttributes?.materialSource\n            const colorSource = mesh.userData.attributes?.colorSource || mesh.userData.defAttributes?.colorSource\n            // const materialSource = mesh.userData.defAttributes?.materialSource\n            // console.log(materialSource, mesh.userData.attributes, mesh.userData.defAttributes)\n            if (!Rhino3dmLoader2.ForceLayerMaterials && !materialSource && !colorSource) return\n            if (Rhino3dmLoader2.ForceLayerMaterials ||\n                (materialSource?.value === 0 || materialSource?.value === 1 && colorSource?.value === 0)\n            ) { // material from layer\n                if (layer) {\n                    mesh.material = this._compareMaterials(this._createMaterial({\n                        diffuseColor: layer.color,\n                        name: layer.name,\n                        transparency: 0,\n                        textures: [],\n                    }))\n                }\n            } else if (materialSource?.value === 3 || materialSource?.value === 1 && colorSource?.value === 3) { // material from parent\n                mesh.traverseAncestors((parent: any) => {\n                    if (parent?.material) mesh.material = parent.material\n                })\n            } else if (materialSource && materialSource.value !== 1) {\n                console.warn('Unknown material source', materialSource, mesh, mesh.userData.attributes)\n            }\n        }\n    }\n\n    private _useInstancedMesh(obj: Object3D) {\n        if (!Rhino3dmLoader2.ReplaceWithInstancedMesh) return\n        if (obj.children.length <= 0) return\n        const children = obj.children\n        const geometries = children.map((c: any) => c.geometry)\n        const uniqueGeometries = geometries.filter((g, i) => geometries.indexOf(g) === i)\n        uniqueGeometries.forEach((g) => {\n            const instances = children.filter((c: any) => c.geometry === g)\n            const instances2 = instances.length > 0 ? instances.filter((c: any) => c.material === (instances[0] as any).material) : []\n            if (instances2.length > 1) {\n                const instanced = new InstancedMesh(g, (instances2[0] as any).material, instances2.length)\n                instanced.userData = {...instances2[0].userData}\n                instanced.userData.instanceUserData = []\n                instanced.userData.attributes = instanced.userData.defAttributes || instanced.userData.attributes\n                if (instanced.userData.defAttributes) delete instanced.userData.defAttributes\n                instanced.name = instanced.userData.attributes?.name || instances2[0].name\n                instances2.forEach((c: any, i: number) => {\n                    instanced.setMatrixAt(i, c.matrix)\n                    obj.remove(c)\n                    instanced.userData.instanceUserData.push(c.userData)\n                })\n                obj.add(instanced)\n            }\n        })\n    }\n\n    private _hideLineMesh(obj: Object3D) {\n        if (!Rhino3dmLoader2.HideLineMesh && !Rhino3dmLoader2.HidePointMesh) return\n        if (obj.children.length <= 0) return\n        const toHide: any[] = []\n        obj.traverse((c) => {\n            if (c && (\n                Rhino3dmLoader2.HideLineMesh && ((c as Line).isLine || (c as LineSegments).isLineSegments))\n                ||\n                Rhino3dmLoader2.HidePointMesh && (c as Points).isPoints\n            ) toHide.push(c)\n        })\n        toHide.forEach((c) => {\n            c.userData.visible_3dm = c.visible\n            c.visible = false\n        })\n    }\n}\n\n","import {CanvasTexture, ImageLoader, Loader, LoadingManager, Texture} from 'three'\nimport {getUrlQueryParam} from 'ts-browser-helpers'\n\n/**\n * Same as TextureLoader but loads SVG images, fixes issues with windows not loading svg files without a defined size.\n * See - https://github.com/mrdoob/three.js/issues/30899\n *\n * todo - create example for test, see sample code in gh issue.\n */\nclass SVGTextureLoader extends Loader<Texture> {\n\n    constructor(manager?: LoadingManager) {\n\n        super(manager)\n\n    }\n\n    static USE_CANVAS_TEXTURE = getUrlQueryParam('svg-load-disable-canvas') !== 'true'\n\n    load(url: string, onLoad: (texture: Texture) => void, onProgress?: (event: ProgressEvent) => void, onError?: (err: unknown) => void): Texture {\n\n        const canvas = SVGTextureLoader.USE_CANVAS_TEXTURE ? document.createElement('canvas') : undefined\n        const texture = SVGTextureLoader.USE_CANVAS_TEXTURE ? new CanvasTexture(canvas!) : new Texture()\n\n        const loader = new ImageLoader(this.manager)\n        loader.setCrossOrigin(this.crossOrigin)\n        loader.setPath(this.path)\n\n        loader.load(url, function(image) {\n\n            if (canvas) {\n                SVGTextureLoader.CopyImageToCanvas(canvas, image)\n            } else {\n\n                texture.image = image\n\n            }\n            texture.needsUpdate = true\n\n            if (onLoad !== undefined) {\n\n                onLoad(texture)\n\n            }\n\n        }, onProgress, onError)\n\n        return texture\n\n    }\n\n    static CopyImageToCanvas(canvas: HTMLCanvasElement, image: HTMLImageElement) {\n        // size can be scaled here, this is based on the viewBox aspect ratio and minimum size of 150hx300w\n        canvas.width = image.naturalWidth || image.width || 512\n        canvas.height = image.naturalHeight || image.height || 512\n\n        const ctx = canvas.getContext('2d')\n        if (ctx) {\n            ctx.clearRect(0, 0, canvas.width, canvas.height)\n            ctx.drawImage(image, 0, 0, canvas.width, canvas.height)\n        } else {\n            console.error('SVGTextureLoader: Failed to get canvas context.')\n        }\n    }\n\n}\n\n\nexport {SVGTextureLoader}\n","import {Cache, Loader, LoadingManager} from 'three'\n\nclass VideoLoader extends Loader {\n\n    constructor(manager: LoadingManager) {\n\n        super(manager)\n\n    }\n\n    load(url: string, onLoad: (a: HTMLVideoElement)=>void, _onProgress: (p: ProgressEvent)=>void, onError: (e: any)=>void): HTMLVideoElement {\n\n        if (this.path !== undefined) url = this.path + url\n\n        url = this.manager.resolveURL(url)\n\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const scope = this\n\n        const cached = Cache.get(url)\n\n        if (cached !== undefined) {\n\n            scope.manager.itemStart(url)\n\n            setTimeout(function() {\n\n                if (onLoad) onLoad(cached)\n\n                scope.manager.itemEnd(url)\n\n            }, 0)\n\n            return cached\n\n        }\n\n        const videoEl = document.createElementNS('http://www.w3.org/1999/xhtml', 'video') as HTMLVideoElement\n\n        function onVideoLoad() {\n\n            videoEl.removeEventListener('loadedmetadata', onVideoLoad, false)\n            videoEl.removeEventListener('error', onVideoError, false)\n\n            Cache.add(url, videoEl)\n\n            if (onLoad) onLoad(videoEl)\n\n            scope.manager.itemEnd(url)\n\n        }\n\n        function onVideoError(event: any) {\n\n            videoEl.removeEventListener('loadedmetadata', onVideoLoad, false)\n            videoEl.removeEventListener('error', onVideoError, false)\n\n            if (onError) onError(event)\n\n            scope.manager.itemError(url)\n            scope.manager.itemEnd(url)\n\n        }\n\n        videoEl.addEventListener('loadedmetadata', onVideoLoad, false)\n        videoEl.addEventListener('error', onVideoError, false)\n\n        if (url.substr(0, 5) !== 'data:') {\n\n            if (this.crossOrigin !== undefined) videoEl.crossOrigin = this.crossOrigin\n\n        }\n\n        scope.manager.itemStart(url)\n\n        videoEl.src = url\n        videoEl.preload = 'auto'\n        videoEl.autoplay = true\n\n\n        videoEl.setAttribute('webkit-playsinline', 'webkit-playsinline')\n        videoEl.setAttribute('playsinline', '')\n\n        return videoEl\n\n    }\n\n}\n\n\nexport {VideoLoader}\n","import {LinearFilter, Loader, LoadingManager, RGBAFormat, SRGBColorSpace, VideoTexture} from 'three'\nimport {VideoLoader} from './VideoLoader'\n\nexport class VideoTextureLoader extends Loader {\n\n    constructor(manager: LoadingManager) {\n\n        super(manager)\n\n    }\n\n    load(url: string, onLoad: (a: VideoTexture)=>void, onProgress: (p: ProgressEvent)=>void, onError: (e: any)=>void): VideoTexture {\n\n        const loader = new VideoLoader(this.manager)\n        loader.setCrossOrigin(this.crossOrigin)\n        loader.setPath(this.path)\n\n        let videoTexture: VideoTexture|undefined\n        // noinspection JSVoidFunctionReturnValueUsed\n        const vid = loader.load(url, function(video) {\n\n            if (!videoTexture) videoTexture = new VideoTexture(video)\n\n            videoTexture.format = RGBAFormat\n            videoTexture.minFilter = LinearFilter\n            videoTexture.magFilter = LinearFilter\n            videoTexture.colorSpace = SRGBColorSpace // todo depends on the video\n            videoTexture.needsUpdate = true\n            // video.play()\n\n            if (onLoad !== undefined) {\n\n                onLoad(videoTexture)\n\n            }\n\n        }, onProgress, onError) as any\n\n        if (!videoTexture && vid)\n            videoTexture = new VideoTexture(vid)\n\n        return videoTexture!\n\n    }\n\n}\n","import {GLTFExporter, GLTFExporterPlugin} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {IExportWriter} from '../IExporter'\nimport {GLTFWriter2} from './GLTFWriter2'\nimport {AnimationClip, Object3D} from 'three'\nimport {ThreeViewer} from '../../viewer'\nimport {\n    glbEncryptionProcessor,\n    GLTFLightExtrasExtension,\n    GLTFMaterialExtrasExtension,\n    GLTFMaterialsAlphaMapExtension,\n    GLTFMaterialsDisplacementMapExtension,\n    GLTFMaterialsLightMapExtension,\n    GLTFObject3DExtrasExtension,\n    GLTFViewerConfigExtension,\n} from '../gltf'\nimport {GLTF} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {metaToResources, SerializationMetaType} from '../../utils'\nimport {GLTFLoader2} from '../import'\n\nexport interface GLTFExporter2Options {\n    /**\n     * embed images in glb even when remote url is available\n     * @default false\n     */\n    embedUrlImages?: boolean,\n    /**\n     * Embed previews of images in glb\n     * @default false\n     */\n    embedUrlImagePreviews?: boolean,\n    /**\n     * export viewer config (scene settings)\n     */\n    viewerConfig?: boolean,\n    /**\n     * Extension to export to, default for object/scene = glb\n     */\n    exportExt?: string,\n    preserveUUIDs?: boolean,\n    /**\n     * see GLTFDracoExporter and {@link GLTFMaterialExtrasExtension}\n     */\n    externalImagesInExtras?: boolean,\n    /**\n     * see GLTFViewerExport->processViewer\n     * @default false\n     */\n    encodeUint16Rgbe?: boolean\n    /**\n     * Number of spaces to use when exporting to json\n     * @default 2\n     */\n    jsonSpaces?: number,\n    /**\n     * Encrypt the exported file in a GLB container using {@link encryptKey}\n     * @default false.\n     * Works only for glb export.\n     */\n    encrypt?: boolean,\n    /**\n     * Encryption key, if not provided, will be prompted\n     * @default undefined.\n     * Works only for glb export.\n     */\n    encryptKey?: string|Uint8Array,\n\n\n    // From GLTFExporter\n\n    /**\n     * Export position, rotation and scale instead of matrix per node.\n     * Default is false\n     */\n    trs?: boolean;\n\n    /**\n     * Export only visible objects.\n     * Default is false.\n     */\n    onlyVisible?: boolean;\n\n    /**\n     * Export just the attributes within the drawRange, if defined, instead of exporting the whole array.\n     * Default is true.\n     */\n    truncateDrawRange?: boolean;\n\n    /**\n     * Restricts the image maximum size (both width and height) to the given value. This option works only if embedImages is true.\n     * Default is Infinity.\n     */\n    maxTextureSize?: number;\n\n    /**\n     * List of animations to be included in the export.\n     */\n    animations?: AnimationClip[];\n\n    /**\n     * Generate indices for non-index geometry and export with them.\n     * Default is false.\n     */\n    forceIndices?: boolean;\n\n    /**\n     * Export custom glTF extensions defined on an object's userData.gltfExtensions property.\n     * Default is true.\n     */\n    includeCustomExtensions?: boolean;\n\n    // wip - replace this base path from embedded resources url. this is expected to be path/resourcePath in GLTFLoader when this exported asset is loaded the next time.\n    _basePath?: string\n\n    [key: string]: any\n}\n\n/**\n * GLTFExporter2 is an improved version of the three.js GLTFExporter with support for:\n * - glb encryption\n * - embedding image previews\n * - saving external image references in extras\n * - saving viewer config (scene settings)\n * - various optimizations and bug fixes\n */\nexport class GLTFExporter2 extends GLTFExporter implements IExportWriter {\n\n    constructor() {\n        super()\n        this.processors.push(glbEncryptionProcessor)\n    }\n\n    register(callback: (writer: GLTFWriter2)=>GLTFExporterPlugin): this {\n        return super.register(callback as any)\n    }\n\n    processors: ((obj: ArrayBuffer|any|Blob, options: GLTFExporter2Options) => Promise<ArrayBuffer|any|Blob>)[] = []\n\n    async parseAsync(obj: ArrayBuffer|any, options: GLTFExporter2Options): Promise<Blob> {\n        if (!obj) throw new Error('No object to export')\n        let gltf = !obj.__isGLTFOutput && (Array.isArray(obj) || obj.isObject3D) ? await new Promise((resolve, reject) => this.parse(obj, resolve, reject, options)) : obj\n\n        for (const processor of this.processors) {\n            gltf = await processor(gltf, options)\n        }\n\n        if (gltf && gltf instanceof Blob) return gltf\n\n        if (gltf && typeof gltf === 'object' && !gltf.byteLength) { // byteLength is for ArrayBuffer\n            return new Blob([JSON.stringify(gltf, (k, v)=> k.startsWith('__') ? undefined : v, options.jsonSpaces ?? 2)], {type: 'model/gltf+json'})\n        } else if (gltf) {\n            return new Blob([gltf as ArrayBuffer], {type: 'model/gltf+binary'})\n        } else {\n            throw new Error('GLTFExporter2.parse() failed')\n        }\n    }\n\n    parse(\n        input: Object3D | Object3D[],\n        onDone: (gltf: ArrayBuffer | {[key: string]: any}) => void,\n        onError: (error: ErrorEvent) => void,\n        options: GLTFExporter2Options = {},\n    ): void {\n        const gltfOptions = {\n            // default options\n            binary: false as boolean,\n            trs: options.trs ?? false,\n            onlyVisible: options.onlyVisible ?? false,\n            truncateDrawRange: options.truncateDrawRange ?? true,\n            externalImagesInExtras: !options.embedUrlImages && options.externalImagesInExtras || false, // this is handled in gltfMaterialExtrasWriter, also see GLTFDracoExporter\n            maxTextureSize: options.maxTextureSize ?? Infinity,\n            animations: options.animations ?? [],\n            includeCustomExtensions: options.includeCustomExtensions ?? true,\n            forceIndices: options.forceIndices ?? false, // todo implement\n            exporterOptions: options,\n            ignoreInvalidMorphTargetTracks: options.ignoreInvalidMorphTargetTracks,\n            ignoreEmptyTextures: options.ignoreEmptyTextures,\n        } satisfies GLTFWriter2['options']\n        if (options.exportExt === 'glb') {\n            gltfOptions.binary = true\n        }\n\n        const onDone1 = (o: GLTF)=> {\n\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            onDone(Object.assign(o, {__isGLTFOutput: true}))\n        }\n        return super.parse(input, onDone1, onError, gltfOptions, new GLTFWriter2())\n    }\n\n    static ExportExtensions: ((writer: GLTFWriter2) => GLTFExporterPlugin)[] = [\n        GLTFMaterialExtrasExtension.Export,\n        GLTFObject3DExtrasExtension.Export,\n        GLTFLightExtrasExtension.Export,\n        // GLTFMaterialsBumpMapExtension.Export, // deprecated\n        GLTFMaterialsDisplacementMapExtension.Export,\n        GLTFMaterialsLightMapExtension.Export,\n        GLTFMaterialsAlphaMapExtension.Export,\n        (w)=>{ // Extension to write any gltfExtras that is imported with GLTFLoader back into the gltf json.\n            return {\n                name: '_AssetPropsWriter',\n                beforeParse: (input: any)=>{\n                    const inputs = Array.isArray(input) ? input : [input]\n                    for (const obj of inputs) {\n                        // remove from userData so its not serialized inside the node/scene\n                        if (obj.userData.gltfExtras) {\n                            obj.__gltfExtras = obj.userData.gltfExtras\n                            delete obj.userData.gltfExtras\n                        }\n                        if (obj.userData.gltfAsset) {\n                            obj.__gltfAsset = obj.userData.gltfAsset\n                            delete obj.userData.gltfAsset\n                        }\n                    }\n                },\n                afterParse: (input: any)=>{\n                    const extras = (w.json as any).extras || {}\n                    const inputs = Array.isArray(input) ? input : [input]\n                    for (const obj of inputs) {\n                        // ignoring .gltfAsset right now, is that fine? any copyright info would have been copied to userData.license during import.\n                        if (obj.__gltfAsset) {\n                            obj.userData.gltfAsset = obj.__gltfAsset\n                            delete obj.__gltfAsset\n                        }\n                        if (obj.__gltfExtras) {\n                            obj.userData.gltfExtras = obj.__gltfExtras\n                            Object.assign(extras, obj.userData.gltfExtras)\n                            delete obj.__gltfExtras\n                        }\n                    }\n                    if (Object.keys(extras).length > 0) {\n                        (w.json as any).extras = extras\n                    }\n                },\n            }\n        },\n        // (w)=>new GLTFMeshGpuInstancingExporter(w), // added to threejs\n    ]\n\n    setup(viewer: ThreeViewer, extraExtensions?: ((writer: GLTFWriter2) => GLTFExporterPlugin)[]): this {\n        for (const ext of GLTFExporter2.ExportExtensions) this.register(ext)\n        if (extraExtensions) for (const ext of extraExtensions) this.register(ext)\n\n        // should be last\n        this.register(this.gltfViewerWriter(viewer))\n        return this\n    }\n\n    // BundledResources or viewer config writer\n    gltfViewerWriter(viewer: ThreeViewer): (writer: GLTFWriter2) => GLTFExporterPlugin {\n        return (writer: GLTFWriter2) => ({\n            afterParse: (input: any)=>{\n                input = Array.isArray(input) ? input[0] : input\n                let resources: Partial<SerializationMetaType>|undefined = undefined\n                if (!input?.userData?.rootSceneModelRoot ||\n                    writer.options?.exporterOptions?.viewerConfig === false ||\n                    input?.userData?.__exportViewerConfig === false\n                ) {\n                    resources = metaToResources(writer.serializationMeta)\n                    GLTFViewerConfigExtension.BundleExtraResources(writer.json, resources)\n                    GLTFViewerConfigExtension.BundleArrayBuffers(resources, writer)\n                } else {\n                    // resources will be bundled in the viewer config extension.\n                    // note this has to be absolutely at the end of parse. writer.serializationMeta is used and converted to resources inside this\n                    resources = GLTFViewerConfigExtension.ExportViewerConfig(viewer, writer)\n                }\n                if (!resources) return\n                const itemCount = Object.values(resources).reduce((sum, arr) => sum + Object.keys(arr).length, 0)\n                if (itemCount === 0) return // no resources to bundle\n                const extras = (writer.json as any).extras || {}\n                extras[GLTFLoader2.BundledResourcesKey] = resources\n                ;(writer.json as any).extras = extras\n            },\n        })\n    }\n}\n\ndeclare module 'three'{\n    interface AnimationClip {\n        /**\n         * Whether to export this animation in glTF format.\n         * @default true\n         */\n        __gltfExport?: boolean;\n        userData: {\n            clipActions?: Record<string, any[]>\n            [key: string]: any\n        }\n    }\n}\n","import {IExportWriter} from '../IExporter'\n\nexport class SimpleJSONExporter implements IExportWriter {\n    async parseAsync(obj: any, {jsonSpaces = 2}): Promise<Blob> {\n        return new Blob([JSON.stringify(obj, null, jsonSpaces)], {type: 'application/json'})\n    }\n}\n\n","import {IExportWriter} from '../IExporter'\nimport {AnyOptions} from 'ts-browser-helpers'\n\nexport class SimpleTextExporter implements IExportWriter {\n    async parseAsync(obj: any, _: AnyOptions): Promise<Blob> {\n        return new Blob([obj], {type: 'text/plain'})\n    }\n}\n","/**\n * @author sciecode / https://github.com/sciecode\n *\n * EXR format references:\n * \thttps://www.openexr.com/documentation/openexrfilelayout.pdf\n */\n\nimport {\n\tFloatType,\n\tHalfFloatType,\n\tRGBAFormat,\n\tDataUtils,\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\nconst textEncoder = new TextEncoder();\n\nconst NO_COMPRESSION = 0;\nconst ZIPS_COMPRESSION = 2;\nconst ZIP_COMPRESSION = 3;\n\nclass EXRExporter {\n\n\tparse( arg1, arg2, arg3 ) {\n\n\t\tif ( ! arg1 || ! ( arg1.isWebGLRenderer || arg1.isDataTexture ) ) {\n\n\t\t\tthrow Error( 'EXRExporter.parse: Unsupported first parameter, expected instance of WebGLRenderer or DataTexture.' );\n\n\t\t} else if ( arg1.isWebGLRenderer ) {\n\n\t\t\tconst renderer = arg1, renderTarget = arg2, options = arg3;\n\n\t\t\tsupportedRTT( renderTarget );\n\n\t\t\tconst info = buildInfoRTT( renderTarget, options ),\n\t\t\t\tdataBuffer = getPixelData( renderer, renderTarget, info ),\n\t\t\t\trawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),\n\t\t\t\tchunks = compressData( rawContentBuffer, info );\n\n\t\t\treturn fillData( chunks, info );\n\n\t\t} else if ( arg1.isDataTexture ) {\n\n\t\t\tconst texture = arg1, options = arg2;\n\n\t\t\tsupportedDT( texture );\n\n\t\t\tconst info = buildInfoDT( texture, options ),\n\t\t\t\tdataBuffer = texture.image.data,\n\t\t\t\trawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),\n\t\t\t\tchunks = compressData( rawContentBuffer, info );\n\n\t\t\treturn fillData( chunks, info );\n\n\t\t}\n\n\t}\n\n}\n\nfunction supportedRTT( renderTarget ) {\n\n\tif ( ! renderTarget || ! renderTarget.isWebGLRenderTarget ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported second parameter, expected instance of WebGLRenderTarget.' );\n\n\t}\n\n\tif ( renderTarget.isWebGLCubeRenderTarget || renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported render target type, expected instance of WebGLRenderTarget.' );\n\n\t}\n\n\tif ( renderTarget.texture.type !== FloatType && renderTarget.texture.type !== HalfFloatType ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture type.' );\n\n\t}\n\n\tif ( renderTarget.texture.format !== RGBAFormat ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture format, expected RGBAFormat.' );\n\n\t}\n\n}\n\nfunction supportedDT( texture ) {\n\n\tif ( texture.type !== FloatType && texture.type !== HalfFloatType ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported DataTexture texture type.' );\n\n\t}\n\n\tif ( texture.format !== RGBAFormat ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported DataTexture texture format, expected RGBAFormat.' );\n\n\t}\n\n\tif ( ! texture.image.data ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Invalid DataTexture image data.' );\n\n\t}\n\n\tif ( texture.type === FloatType && texture.image.data.constructor.name !== 'Float32Array' ) {\n\n\t\tthrow Error( 'EXRExporter.parse: DataTexture image data doesn\\'t match type, expected \\'Float32Array\\'.' );\n\n\t}\n\n\tif ( texture.type === HalfFloatType && texture.image.data.constructor.name !== 'Uint16Array' ) {\n\n\t\tthrow Error( 'EXRExporter.parse: DataTexture image data doesn\\'t match type, expected \\'Uint16Array\\'.' );\n\n\t}\n\n}\n\nfunction buildInfoRTT( renderTarget, options = {} ) {\n\n\tconst compressionSizes = {\n\t\t0: 1,\n\t\t2: 1,\n\t\t3: 16\n\t};\n\n\tconst WIDTH = renderTarget.width,\n\t\tHEIGHT = renderTarget.height,\n\t\tTYPE = renderTarget.texture.type,\n\t\tFORMAT = renderTarget.texture.format,\n\t\tCOLOR_SPACE = texture.colorSpace,\n\t\tCOMPRESSION = ( options.compression !== undefined ) ? options.compression : ZIP_COMPRESSION,\n\t\tEXPORTER_TYPE = ( options.type !== undefined ) ? options.type : HalfFloatType,\n\t\tOUT_TYPE = ( EXPORTER_TYPE === FloatType ) ? 2 : 1,\n\t\tCOMPRESSION_SIZE = compressionSizes[ COMPRESSION ],\n\t\tNUM_CHANNELS = 4;\n\n\treturn {\n\t\twidth: WIDTH,\n\t\theight: HEIGHT,\n\t\ttype: TYPE,\n\t\tformat: FORMAT,\n\t\tcompression: COMPRESSION,\n\t\tblockLines: COMPRESSION_SIZE,\n\t\tdataType: OUT_TYPE,\n\t\tdataSize: 2 * OUT_TYPE,\n\t\tnumBlocks: Math.ceil( HEIGHT / COMPRESSION_SIZE ),\n\t\tnumInputChannels: 4,\n\t\tnumOutputChannels: NUM_CHANNELS,\n\t\ttextureIndex: options.textureIndex || 0\n\t};\n\n}\n\nfunction buildInfoDT( texture, options = {} ) {\n\n\tconst compressionSizes = {\n\t\t0: 1,\n\t\t2: 1,\n\t\t3: 16\n\t};\n\n\tconst WIDTH = texture.image.width,\n\t\tHEIGHT = texture.image.height,\n\t\tTYPE = texture.type,\n\t\tFORMAT = texture.format,\n\t\tCOLOR_SPACE = texture.colorSpace,\n\t\tCOMPRESSION = ( options.compression !== undefined ) ? options.compression : ZIP_COMPRESSION,\n\t\tEXPORTER_TYPE = ( options.type !== undefined ) ? options.type : HalfFloatType,\n\t\tOUT_TYPE = ( EXPORTER_TYPE === FloatType ) ? 2 : 1,\n\t\tCOMPRESSION_SIZE = compressionSizes[ COMPRESSION ],\n\t\tNUM_CHANNELS = 4;\n\n\treturn {\n\t\twidth: WIDTH,\n\t\theight: HEIGHT,\n\t\ttype: TYPE,\n\t\tformat: FORMAT,\n\t\tcolorSpace: COLOR_SPACE,\n\t\tcompression: COMPRESSION,\n\t\tblockLines: COMPRESSION_SIZE,\n\t\tdataType: OUT_TYPE,\n\t\tdataSize: 2 * OUT_TYPE,\n\t\tnumBlocks: Math.ceil( HEIGHT / COMPRESSION_SIZE ),\n\t\tnumInputChannels: 4,\n\t\tnumOutputChannels: NUM_CHANNELS,\n\t\tflipY: texture.isDataTexture && texture.flipY,\n\t\ttextureIndex: options.textureIndex || 0 // todo required here?\n\t};\n\n}\n\nfunction getPixelData( renderer, rtt, info ) {\n\n\tlet dataBuffer;\n\n\tif ( info.type === FloatType ) {\n\n\t\tdataBuffer = new Float32Array( info.width * info.height * info.numInputChannels );\n\n\t} else {\n\n\t\tdataBuffer = new Uint16Array( info.width * info.height * info.numInputChannels );\n\n\t}\n\n\trenderer.readRenderTargetPixels( rtt, 0, 0, info.width, info.height, dataBuffer, undefined, info.textureIndex );\n\n\treturn dataBuffer;\n\n}\n\nfunction reorganizeDataBuffer( inBuffer, info ) {\n\n\tconst w = info.width,\n\t\th = info.height,\n\t\tdec = { r: 0, g: 0, b: 0, a: 0 },\n\t\toffset = { value: 0 },\n\t\tcOffset = ( info.numOutputChannels == 4 ) ? 1 : 0,\n\t\tgetValue = ( info.type == FloatType ) ? getFloat32 : getFloat16,\n\t\tsetValue = ( info.dataType == 1 ) ? setFloat16 : setFloat32,\n\t\toutBuffer = new Uint8Array( info.width * info.height * info.numOutputChannels * info.dataSize ),\n\t\tdv = new DataView( outBuffer.buffer );\n\n\tfor ( let y = 0; y < h; ++ y ) {\n\n\t\tfor ( let x = 0; x < w; ++ x ) {\n\n\t\t\tconst i = y * w * 4 + x * 4;\n\n\t\t\tconst r = getValue( inBuffer, i );\n\t\t\tconst g = getValue( inBuffer, i + 1 );\n\t\t\tconst b = getValue( inBuffer, i + 2 );\n\t\t\tconst a = getValue( inBuffer, i + 3 );\n\n\t\t\tconst line = ( info.flipY ? y : h - y - 1 ) * w * ( 3 + cOffset ) * info.dataSize;\n\n\t\t\tdecodeLinear( dec, r, g, b, a );\n\n\t\t\toffset.value = line + x * info.dataSize;\n\t\t\tsetValue( dv, dec.a, offset );\n\n\t\t\toffset.value = line + ( cOffset ) * w * info.dataSize + x * info.dataSize;\n\t\t\tsetValue( dv, dec.b, offset );\n\n\t\t\toffset.value = line + ( 1 + cOffset ) * w * info.dataSize + x * info.dataSize;\n\t\t\tsetValue( dv, dec.g, offset );\n\n\t\t\toffset.value = line + ( 2 + cOffset ) * w * info.dataSize + x * info.dataSize;\n\t\t\tsetValue( dv, dec.r, offset );\n\n\t\t}\n\n\t}\n\n\treturn outBuffer;\n\n}\n\nfunction compressData( inBuffer, info ) {\n\n\tlet compress,\n\t\ttmpBuffer,\n\t\tsum = 0;\n\n\tconst chunks = { data: new Array(), totalSize: 0 },\n\t\tsize = info.width * info.numOutputChannels * info.blockLines * info.dataSize;\n\n\tswitch ( info.compression ) {\n\n\t\tcase 0:\n\t\t\tcompress = compressNONE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\tcase 3:\n\t\t\tcompress = compressZIP;\n\t\t\tbreak;\n\n\t}\n\n\tif ( info.compression !== 0 ) {\n\n\t\ttmpBuffer = new Uint8Array( size );\n\n\t}\n\n\tfor ( let i = 0; i < info.numBlocks; ++ i ) {\n\n\t\tconst arr = inBuffer.subarray( size * i, size * ( i + 1 ) );\n\n\t\tconst block = compress( arr, tmpBuffer );\n\n\t\tsum += block.length;\n\n\t\tchunks.data.push( { dataChunk: block, size: block.length } );\n\n\t}\n\n\tchunks.totalSize = sum;\n\n\treturn chunks;\n\n}\n\nfunction compressNONE( data ) {\n\n\treturn data;\n\n}\n\nfunction compressZIP( data, tmpBuffer ) {\n\n\t//\n\t// Reorder the pixel data.\n\t//\n\n\tlet t1 = 0,\n\t\tt2 = Math.floor( ( data.length + 1 ) / 2 ),\n\t\ts = 0;\n\n\tconst stop = data.length - 1;\n\n\twhile ( true ) {\n\n\t\tif ( s > stop ) break;\n\t\ttmpBuffer[ t1 ++ ] = data[ s ++ ];\n\n\t\tif ( s > stop ) break;\n\t\ttmpBuffer[ t2 ++ ] = data[ s ++ ];\n\n\t}\n\n\t//\n\t// Predictor.\n\t//\n\n\tlet p = tmpBuffer[ 0 ];\n\n\tfor ( let t = 1; t < tmpBuffer.length; t ++ ) {\n\n\t\tconst d = tmpBuffer[ t ] - p + ( 128 + 256 );\n\t\tp = tmpBuffer[ t ];\n\t\ttmpBuffer[ t ] = d;\n\n\t}\n\n\tconst deflate = fflate.zlibSync( tmpBuffer );\n\n\treturn deflate;\n\n}\n\nfunction fillHeader( outBuffer, chunks, info ) {\n\n\tconst offset = { value: 0 };\n\tconst dv = new DataView( outBuffer.buffer );\n\n\tsetUint32( dv, 20000630, offset ); // magic\n\tsetUint32( dv, 2, offset ); // mask\n\n\t// = HEADER =\n\n\tsetString( dv, 'compression', offset );\n\tsetString( dv, 'compression', offset );\n\tsetUint32( dv, 1, offset );\n\tsetUint8( dv, info.compression, offset );\n\n\tsetString( dv, 'screenWindowCenter', offset );\n\tsetString( dv, 'v2f', offset );\n\tsetUint32( dv, 8, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, 0, offset );\n\n\tsetString( dv, 'screenWindowWidth', offset );\n\tsetString( dv, 'float', offset );\n\tsetUint32( dv, 4, offset );\n\tsetFloat32( dv, 1.0, offset );\n\n\tsetString( dv, 'pixelAspectRatio', offset );\n\tsetString( dv, 'float', offset );\n\tsetUint32( dv, 4, offset );\n\tsetFloat32( dv, 1.0, offset );\n\n\tsetString( dv, 'lineOrder', offset );\n\tsetString( dv, 'lineOrder', offset );\n\tsetUint32( dv, 1, offset );\n\tsetUint8( dv, 0, offset );\n\n\tsetString( dv, 'dataWindow', offset );\n\tsetString( dv, 'box2i', offset );\n\tsetUint32( dv, 16, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, info.width - 1, offset );\n\tsetUint32( dv, info.height - 1, offset );\n\n\tsetString( dv, 'displayWindow', offset );\n\tsetString( dv, 'box2i', offset );\n\tsetUint32( dv, 16, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, info.width - 1, offset );\n\tsetUint32( dv, info.height - 1, offset );\n\n\tsetString( dv, 'channels', offset );\n\tsetString( dv, 'chlist', offset );\n\tsetUint32( dv, info.numOutputChannels * 18 + 1, offset );\n\n\tsetString( dv, 'A', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetString( dv, 'B', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetString( dv, 'G', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetString( dv, 'R', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetUint8( dv, 0, offset );\n\n\t// null-byte\n\tsetUint8( dv, 0, offset );\n\n\t// = OFFSET TABLE =\n\n\tlet sum = offset.value + info.numBlocks * 8;\n\n\tfor ( let i = 0; i < chunks.data.length; ++ i ) {\n\n\t\tsetUint64( dv, sum, offset );\n\n\t\tsum += chunks.data[ i ].size + 8;\n\n\t}\n\n}\n\nfunction fillData( chunks, info ) {\n\n\tconst TableSize = info.numBlocks * 8,\n\t\tHeaderSize = 259 + ( 18 * info.numOutputChannels ), // 259 + 18 * chlist\n\t\toffset = { value: HeaderSize + TableSize },\n\t\toutBuffer = new Uint8Array( HeaderSize + TableSize + chunks.totalSize + info.numBlocks * 8 ),\n\t\tdv = new DataView( outBuffer.buffer );\n\n\tfillHeader( outBuffer, chunks, info );\n\n\tfor ( let i = 0; i < chunks.data.length; ++ i ) {\n\n\t\tconst data = chunks.data[ i ].dataChunk;\n\t\tconst size = chunks.data[ i ].size;\n\n\t\tsetUint32( dv, i * info.blockLines, offset );\n\t\tsetUint32( dv, size, offset );\n\n\t\toutBuffer.set( data, offset.value );\n\t\toffset.value += size;\n\n\t}\n\n\treturn outBuffer;\n\n}\n\nfunction decodeLinear( dec, r, g, b, a ) {\n\n\tdec.r = r;\n\tdec.g = g;\n\tdec.b = b;\n\tdec.a = a;\n\n}\n\n// function decodeSRGB( dec, r, g, b, a ) {\n\n// \tdec.r = r > 0.04045 ? Math.pow( r * 0.9478672986 + 0.0521327014, 2.4 ) : r * 0.0773993808;\n// \tdec.g = g > 0.04045 ? Math.pow( g * 0.9478672986 + 0.0521327014, 2.4 ) : g * 0.0773993808;\n// \tdec.b = b > 0.04045 ? Math.pow( b * 0.9478672986 + 0.0521327014, 2.4 ) : b * 0.0773993808;\n// \tdec.a = a;\n\n// }\n\n\nfunction setUint8( dv, value, offset ) {\n\n\tdv.setUint8( offset.value, value );\n\n\toffset.value += 1;\n\n}\n\nfunction setUint32( dv, value, offset ) {\n\n\tdv.setUint32( offset.value, value, true );\n\n\toffset.value += 4;\n\n}\n\nfunction setFloat16( dv, value, offset ) {\n\n\tdv.setUint16( offset.value, DataUtils.toHalfFloat( value ), true );\n\n\toffset.value += 2;\n\n}\n\nfunction setFloat32( dv, value, offset ) {\n\n\tdv.setFloat32( offset.value, value, true );\n\n\toffset.value += 4;\n\n}\n\nfunction setUint64( dv, value, offset ) {\n\n\tdv.setBigUint64( offset.value, BigInt( value ), true );\n\n\toffset.value += 8;\n\n}\n\nfunction setString( dv, string, offset ) {\n\n\tconst tmp = textEncoder.encode( string + '\\0' );\n\n\tfor ( let i = 0; i < tmp.length; ++ i ) {\n\n\t\tsetUint8( dv, tmp[ i ], offset );\n\n\t}\n\n}\n\nfunction decodeFloat16( binary ) {\n\n\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\tfraction = binary & 0x03FF;\n\n\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\texponent ?\n\t\t\t(\n\t\t\t\texponent === 0x1F ?\n\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t) :\n\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t);\n\n}\n\nfunction getFloat16( arr, i ) {\n\n\treturn decodeFloat16( arr[ i ] );\n\n}\n\nfunction getFloat32( arr, i ) {\n\n\treturn arr[ i ];\n\n}\n\nexport { EXRExporter, NO_COMPRESSION, ZIP_COMPRESSION, ZIPS_COMPRESSION };\n","import {DataTexture, WebGLRenderTarget} from 'three'\nimport {EXRExporter, EXRExporterParseOptions} from 'three/examples/jsm/exporters/EXRExporter.js'\nimport {IExportWriter} from '../IExporter'\nimport {IRenderTarget} from '../../rendering'\n\nexport class EXRExporter2 extends EXRExporter implements IExportWriter {\n    async parseAsync(obj: IRenderTarget|DataTexture, options: EXRExporterParseOptions): Promise<Blob> {\n        const target = <IRenderTarget>obj\n        if (target.isWebGLRenderTarget && !target.renderManager) throw new Error('No renderManager on renderTarget')\n        if (!target.isWebGLRenderTarget && !(<DataTexture>obj).isDataTexture) throw new Error('Invalid object type')\n        if (target.isWebGLRenderTarget && target.textures.length > 1 && options.textureIndex === undefined)\n            console.warn('RenderTarget has multiple textures, but no textureIndex specified. Using texture 0.')\n        const res = target.isWebGLRenderTarget ?\n            this.parse(target.renderManager!.webglRenderer, <WebGLRenderTarget>target, options) :\n            this.parse(<DataTexture>obj, options)\n        return new Blob([res], {type: 'image/x-exr'})\n    }\n}\n","import {AssetExporterEventMap} from '../AssetExporter'\nimport {\n    IGeometry,\n    IMaterial,\n    iMaterialCommons,\n    IObject3D,\n    iObjectCommons,\n    ITexture,\n    MeshLine,\n    MeshLineSegments,\n} from '../../core'\nimport {BufferAttribute, BufferGeometry} from 'three'\nimport {AssetImporter} from '../AssetImporter'\nimport {GLTFExporter2Options} from './GLTFExporter2'\nimport {getPartialProps, setPartialProps} from '../../utils'\n\nexport interface AssetExportHooks {\n    objectGeometry?: (obj: IObject3D, geometry: IGeometry, root: IObject3D)=>IGeometry|null|undefined\n    objectGeometryReplace?: (obj: IObject3D, geometry: IGeometry)=>void\n    object?: (obj: IObject3D, root: IObject3D)=>void\n    objectMaterials?: (obj: IObject3D, materials: IMaterial|IMaterial[]|undefined)=>void\n    objectMaterial?: (obj: IObject3D, material: IMaterial, root: IObject3D, materialIndex?: number)=>undefined | (()=>IMaterial)\n    objectMaterialsReplace?: (obj: IObject3D, materials: IMaterial|IMaterial[])=>void\n    replaceTexture?: (obj: IObject3D|IMaterial, texture: ITexture, mapName: string, root: IObject3D|IMaterial)=>ITexture|null\n    revertTextures?: (obj: IObject3D|IMaterial)=>void\n    revertObject?: (obj: IObject3D)=>void\n}\n\nexport const assetExportHook = (e: AssetExporterEventMap['exportFile'], hooks: AssetExportHooks) => {\n    const options = e.exportOptions || {}\n    const mat = (e.obj as IMaterial).isMaterial ? e.obj as IMaterial : null\n    const obj = (e.obj as IObject3D).isObject3D ? e.obj as IObject3D : null\n\n    if (e.state === 'processing') {\n        if (mat) {\n            const maps: Map<string, ITexture> = hooks.replaceTexture ? iMaterialCommons.getMapsForMaterial.call(mat) : null\n            const savedMaps = maps && hooks.replaceTexture ? replaceExternalTextures(maps, mat, mat, hooks.replaceTexture) : null\n            mat.__exportState = {savedMaps}\n        }\n        if (obj) {\n            const {\n                objectList,\n                meshLines,\n                fomMap,\n                geomMap,\n                matCloneMap,\n                savedTextures,\n            } = obj.__exportState = {\n                objectList: new Set<IObject3D>(),\n                meshLines: new Map(),\n                fomMap: new Map(),\n                geomMap: new Map(),\n                matCloneMap: new Map(),\n                savedTextures: new Map(),\n            }\n\n            obj.traverse((obj1: IObject3D) => {\n                if (!obj1?.isObject3D) return\n                objectList.add(obj1)\n                if (obj1.children && obj1._sChildren) {\n                    // @ts-expect-error temp\n                    obj1._tChildren = obj1.children\n                    obj1.children = obj1._sChildren as IObject3D[]\n                }\n            })\n\n            const textures: Map<IObject3D|IMaterial, Map<string, ITexture>> = new Map()\n\n            objectList.forEach(obj1=>{\n                if (options.preserveUUIDs !== false && obj1.uuid) obj1.userData.gltfUUID = obj1.uuid\n\n                hooks.object && hooks.object(obj1, obj)\n\n                // todo handle sProperties for objects as well\n                // if (obj1.userData.sProperties !== undefined) {\n                //     const props = getSProps(obj1, obj1.userData.sProperties)\n                //\n                // }\n\n                processGLTFAnimations(obj1, options)\n\n                const geomOverride = replaceExternalGeometry(obj1, obj, hooks.objectGeometry)\n                if (geomOverride) {\n                    hooks.objectGeometryReplace && hooks.objectGeometryReplace(obj1, geomOverride)\n                    geomMap.set(obj1, obj1.forcedOverrideGeometry)\n                    obj1.forcedOverrideGeometry = geomOverride\n                }\n\n                const current = !meshLines.has(obj1) ? processMeshLines(obj1) : null\n                if (current) meshLines.set(obj1, current)\n\n                hooks.objectMaterials && hooks.objectMaterials(obj1, obj.material)\n\n                const mats = processObjectMaterials(obj1, matCloneMap, textures, obj, hooks.objectMaterial)\n                if (mats !== undefined) {\n                    hooks.objectMaterialsReplace && hooks.objectMaterialsReplace(obj1, mats)\n                    fomMap.set(obj1, obj1.forcedOverrideMaterial)\n                    obj1.forcedOverrideMaterial = mats\n                }\n\n                const textures1: Map<string, ITexture> = iObjectCommons.getMapsForObject3D.call(obj1)\n                textures.set(obj1, textures1)\n            })\n\n            if (hooks.replaceTexture)\n                textures.forEach((textures1, obj1)=>{\n                    const savedMaps = replaceExternalTextures(textures1, obj1, obj, hooks.replaceTexture)\n                    savedTextures.set(obj1, savedMaps)\n                })\n            textures.clear()\n\n        }\n    }\n    if (e.state === 'done' || e.state === 'error') {\n        if (mat && mat.__exportState) {\n            hooks.revertTextures && hooks.revertTextures(mat)\n            revertExternalTextures(mat.__exportState.savedMaps, mat)\n            delete mat.__exportState\n        }\n        if (obj && obj.__exportState) {\n            const {\n                objectList,\n                meshLines,\n                fomMap,\n                geomMap,\n                matCloneMap,\n                savedTextures,\n            } = obj.__exportState\n            delete obj.__exportState\n\n            objectList.forEach(obj1=>{\n                if (options.preserveUUIDs !== false && obj1.userData.gltfUUID) delete obj1.userData.gltfUUID\n\n                revertMeshLines(obj1, meshLines.get(obj1))\n\n                hooks.revertObject && hooks.revertObject(obj1)\n\n                // @ts-expect-error temp\n                if (obj1._tChildren) {\n                    // @ts-expect-error temp\n                    obj1.children = obj1._tChildren\n                    // @ts-expect-error temp\n                    delete obj1._tChildren\n                }\n            })\n            meshLines.clear()\n            objectList.clear()\n            new Set([...matCloneMap.values()]).forEach(m=>{\n                m.dispose && m.dispose()\n            })\n            matCloneMap.clear()\n            fomMap.forEach((fom, obj1)=>{\n                if (fom !== undefined) obj1.forcedOverrideMaterial = fom\n                else delete obj1.forcedOverrideMaterial\n            })\n            fomMap.clear()\n            geomMap.forEach((fom, obj1)=>{\n                if (fom !== undefined) obj1.forcedOverrideGeometry = fom\n                else delete obj1.forcedOverrideGeometry\n            })\n            geomMap.clear()\n\n            // revert external map references\n            if (hooks.revertTextures)\n                savedTextures.forEach((savedMaps, obj1)=>{\n                    hooks.revertTextures && hooks.revertTextures(obj1)\n                    revertExternalTextures(savedMaps, obj1)\n                })\n            savedTextures.clear()\n\n        }\n    }\n}\n\n/**\n * Find all the textures that do not belong to that rootPath (asset) and replace them with null in the material,\n * and save their ids in userData.tpAssetRefIds\n * @param maps\n * @param obj\n */\nfunction replaceExternalTextures(maps: Map<string, ITexture>, obj: IMaterial|IObject3D, root: IObject3D|IMaterial, cb: AssetExportHooks['replaceTexture']) {\n    const extMaps: Record<string, ITexture|null> = {}\n    const savedMaps: Record<string, ITexture> = {}\n    maps.forEach((texture, k) => {\n        if (!cb) return\n        const r = cb(obj, texture, k, root)\n        if (r !== texture) {\n            extMaps[k] = r\n            savedMaps[k] = texture\n        }\n    })\n    setPartialProps(extMaps, obj)\n    return savedMaps\n}\n\nfunction revertExternalTextures(savedMaps: Record<string, ITexture>|null, obj: IObject3D|IMaterial) {\n    savedMaps && setPartialProps(savedMaps, obj)\n}\n\nfunction replaceExternalGeometry(obj1: IObject3D, root: IObject3D, cb?: AssetExportHooks['objectGeometry']) {\n    const geometry = obj1.geometry\n    if (!geometry) return undefined\n\n    let g: IGeometry|null = null\n\n    if (geometry.userData.isPlaceholder) {\n        g = AssetImporter.DummyGeometry\n    } else if (cb) {\n        const g1 = cb(obj1, geometry, root)\n        if (g1) g = g1\n    }\n    if (g && g !== geometry) {\n        return g\n    }\n}\n\n/**\n * save the root where gltf animations are set, this is required since objects can have the same name in diff hierarchies\n * @param obj1\n * @param options\n */\nfunction processGLTFAnimations(obj1: IObject3D, options: GLTFExporter2Options) {\n    if (obj1.animations) {\n        if (!options.animations) options.animations = []\n        for (const animation of obj1.animations) {\n            if (animation.__gltfExport === false) continue\n            const rootRefs: string[] = animation.userData.rootRefs || []\n            if (options.preserveUUIDs !== false && obj1.uuid) {\n                if (!rootRefs.includes(obj1.uuid)) {\n                    rootRefs.push(obj1.uuid)\n                }\n            } else if (obj1.name) {\n                if (!rootRefs.includes(obj1.name)) {\n                    rootRefs.push(obj1.name)\n                }\n            }\n            animation.userData.rootRefs = rootRefs\n            if (!options.animations.includes(animation))\n                options.animations.push(animation)\n        }\n    }\n}\n\nfunction processMeshLines(obj1: IObject3D) {\n    const line1 = (obj1 as any as MeshLine | MeshLineSegments)\n    const geometry = line1.geometry\n\n    // for mesh lines, create a temp line (BufferGeometry) so GLTFExporter correctly saves it as mode = line.\n    if (typeof geometry?.getPositions === 'function'\n        // && !obj1.geometry?.attributes.position\n        && obj1.isLine === undefined && obj1.isLineSegments === undefined\n        && (obj1.isLine2 || obj1.isLineSegments2)\n    ) {\n        const positions = geometry.getPositions()\n        if (positions) {\n            const colors = geometry.getColors && line1.geometry.getColors()\n            const g1 = new BufferGeometry()\n            g1.attributes.position = new BufferAttribute(positions, 3)\n            if (colors) g1.attributes.color = new BufferAttribute(colors, 3)\n            g1.name = geometry.name\n            g1.userData = geometry.userData\n            g1.uuid = geometry.uuid\n            // todo groups? anything else\n            const current = obj1.geometry\n            if (obj1.assetType)\n                obj1._currentGeometry = g1 as any\n            else\n                obj1.geometry = g1 as any\n\n            if ((line1 as MeshLine).isLine2) obj1.isLine = true\n            else if ((line1 as MeshLine).isLineSegments2) {\n                obj1.isLine = true\n                obj1.isLineSegments = true\n            }\n            return current\n        }\n    }\n}\n\nfunction processObjectMaterials(obj1: IObject3D, matCloneMap: Map<IMaterial, IMaterial>, textures: Map<IObject3D | IMaterial, Map<string, ITexture>>, root: IObject3D, cb: AssetExportHooks['objectMaterial']) {\n    if (!obj1.material) return\n    const materials = obj1.material\n    const isArr = Array.isArray(materials)\n    const materialsArr = isArr ? materials : [materials]\n    let mats = isArr ? [...materials] : materials\n\n    const setMaterialRef = (i: number, material: IMaterial, ctor: ()=>IMaterial) => {\n        let mat2 = matCloneMap.get(material)\n        if (!mat2) {\n            mat2 = ctor()\n            matCloneMap.set(material, mat2)\n        }\n        if (isArr) {\n            // @ts-expect-error ts.\n            mats[i] = mat2\n        } else {\n            mats = mat2\n        }\n    }\n\n    materialsArr.forEach((material, i) => {\n        if (material.userData.isPlaceholder) {\n            // material is a dummy placeholder\n            setMaterialRef(i, material, ()=>AssetImporter.DummyMaterial)\n        } else {\n            const r = cb ? cb(obj1, material, root, i) : null\n            if (r) setMaterialRef(i, material, r)\n            else {\n                const textures1: Map<string, ITexture> = iMaterialCommons.getMapsForMaterial.call(material)\n                textures.set(material, textures1)\n\n                // todo do the same sProperties thing for objects as well.\n                if (material.userData.sProperties !== undefined) { // clone the material and save only the specified properties\n                    setMaterialRef(i, material, ()=>{\n                        const mat3: IMaterial = new material.constructor()\n                        mat3.name = material.name\n                        const props = getPartialProps(material, material.userData.sProperties)\n                        setPartialProps(props, mat3)\n                        mat3.userData.uuid = material.uuid\n                        mat3.userData.sProperties = material.userData.sProperties\n                        mat3.userData.rootPath = material.userData.rootPath\n                        mat3.userData.rootPathOptions = material.userData.rootPathOptions\n                        return mat3\n                    })\n                }\n            }\n        }\n    })\n\n    if (!isArr ? mats !== materials : (mats as IMaterial[]).some((m, i) => m !== (materials as IMaterial[])[i])) {\n        return mats\n    }\n    return\n}\n\nfunction revertMeshLines(obj1: IObject3D, g1?: IGeometry) {\n    if (g1 && obj1.geometry) {\n        const g = obj1.geometry\n        if (obj1.assetType)\n            obj1._currentGeometry = g1\n        else\n            obj1.geometry = g1\n        g.dispose(true)\n        if (obj1.isLine) delete obj1.isLine\n        if (obj1.isLineSegments) delete obj1.isLineSegments\n    }\n}\n\n\ndeclare module '../../core/IObject' {\n    interface IObject3D{\n        __exportState?: {\n            objectList: Set<IObject3D>,\n            meshLines: Map<IObject3D, IGeometry>,\n            fomMap: Map<IObject3D, IObject3D['forcedOverrideMaterial']>,\n            geomMap: Map<IObject3D, IObject3D['forcedOverrideGeometry']>,\n            matCloneMap: Map<IMaterial, IMaterial>,\n            savedTextures: Map<IObject3D|IMaterial, Record<string, ITexture>>,\n        }\n    }\n}\ndeclare module '../../core/IMaterial' {\n    interface IMaterial{\n        __exportState?: {\n            savedMaps: Record<string, ITexture>|null\n        }\n    }\n}\n","import {EventDispatcher, WebGLRenderTarget} from 'three'\nimport {IMaterial, IObject3D, ITexture} from '../core'\nimport {BlobExt, ExportFileOptions, IAssetExporter, IExporter, IExportWriter} from './IExporter'\nimport {assetExportHook, AssetExportHooks, EXRExporter2, SimpleJSONExporter, SimpleTextExporter} from './export'\nimport {IRenderTarget} from '../rendering'\nimport {Zippable, zipSync} from 'three/examples/jsm/libs/fflate.module.js'\n\nexport interface AssetExporterEventMap {\n    exporterCreate: {exporter: IExporter, parser: IExportWriter} // todo rename parser to writer\n    exportFile: {\n        obj: IObject3D|IMaterial|ITexture|IRenderTarget,\n        state: 'processing'|'exporting'|'done'|'error',\n        progress?: number, // between 0 and 1\n        error?: any,\n        exportOptions: ExportFileOptions\n    }\n}\n\n/**\n * Asset Exporter\n *\n * Utility class to export objects, materials, textures, render targets, etc.\n * Used in {@link AssetManager} to export assets.\n * @category Asset Manager\n */\nexport class AssetExporter extends EventDispatcher<AssetExporterEventMap> implements IAssetExporter {\n    readonly exporters: IExporter[] = [\n        {ctor: ()=>new SimpleJSONExporter(), ext: ['json']},\n        {ctor: ()=>new SimpleTextExporter(), ext: ['txt', 'text']},\n        {ctor: ()=>new EXRExporter2(), ext: ['exr']},\n        // {ctor: ()=>new EXRExporter2(), ext: ['png', 'jpeg', 'webp']}, // todo\n        // {ctor: ()=>new GLTFDracoExporter(), ext: ['gltf', 'glb']},\n    ]\n\n    addExporter(...exporters: IExporter[]) {\n        for (const exporter of exporters) {\n            if (this.exporters.includes(exporter)) {\n                console.warn('Exporter already added', exporter)\n                return\n            }\n            this.exporters.push(exporter)\n        }\n    }\n    removeExporter(...exporters: IExporter[]) {\n        for (const exporter of exporters) {\n            const i = this.exporters.indexOf(exporter)\n            if (i >= 0) this.exporters.splice(i, 1)\n        }\n    }\n\n    getExporter(...ext: string[]): IExporter|undefined {\n        return this.exporters.find(e=>e.ext.some(e1=>ext.includes(e1)))\n    }\n\n    // this can be set from outside to add custom processing during export, apart from the exportFile event\n    exportHooks: AssetExportHooks = {}\n\n    constructor() {\n        super()\n\n        this.addEventListener('exportFile', (e)=>assetExportHook(e, this.exportHooks))\n    }\n\n    public async exportObject(obj?: IObject3D|IMaterial|ITexture|IRenderTarget, options: ExportFileOptions = {}): Promise<BlobExt|undefined> {\n        if (!obj?.assetType) {\n            console.error('Object has no asset type')\n            return undefined\n        }\n        const excluded: IObject3D[] = []\n        if (obj.assetType === 'model') {\n            obj.traverse((o)=>{\n                // todo this wont work when we are exporting invisible objects as well\n                if (o.userData.excludeFromExport && o.visible) {\n                    o.visible = false\n                    excluded.push(o)\n                }\n            })\n        }\n        const blob = await this._exportFile(obj, options)\n        if (obj.assetType === 'model') {\n            excluded.forEach((o: any)=>o.visible = true)\n        }\n        if ((obj as any)?.userData?.rootSceneModelRoot && options.viewerConfig === false) {\n            delete (obj as any)!.userData!.__exportViewerConfig\n        }\n        return blob\n    }\n\n    // export to blob\n    private async _exportFile(obj: IObject3D|IMaterial|ITexture|IRenderTarget, options: ExportFileOptions = {}): Promise<BlobExt|undefined> {\n        // if ((file as any)?.__imported) return (file as any).__imported // todo: cache exports?\n\n        let res: BlobExt\n        try {\n            this.dispatchEvent({type: 'exportFile', obj, state:'processing', exportOptions: options})\n\n            const processed = await this.processBeforeExport(obj, options)\n            const ext = processed?.typeExt || processed?.ext\n            if (!processed || !ext) {\n                console.error(processed, options, obj)\n                throw new Error(`AssetExporter - Unable to preprocess before export ${ext}`)\n            }\n            if (processed.blob) res = processed.blob\n            else {\n                const writer = this._getWriter(ext)\n\n                this.dispatchEvent({type: 'exportFile', obj, state:'exporting', exportOptions: options})\n                res = await writer.parseAsync(processed.obj, {exportExt: processed.ext ?? ext, ...options}) as BlobExt\n                res.ext = processed.ext\n            }\n\n            res = await this.processAfterExport(res, obj, options)\n\n            this.dispatchEvent({type: 'exportFile', obj, state: 'done', exportOptions: options})\n\n        } catch (e) {\n            console.error('AssetExporter: Unable to Export file', obj)\n            // console.error(e)\n            this.dispatchEvent({type: 'exportFile', obj, state: 'error', error: e, exportOptions: options})\n            throw e\n            return undefined\n        }\n\n        // if (file) (file as any).__imported = res\n\n        return res\n    }\n\n    private _createParser(ext: string): IExportWriter {\n        const exporter = this.exporters.find(e => e.ext.includes(ext))\n        if (!exporter)\n            throw new Error(`No exporter found for extension ${ext}`)\n        const writer = exporter?.ctor(this, exporter)\n        if (!writer) throw new Error(`Unable to create writer for extension ${ext}`)\n        this._cachedWriters.push({ext: exporter.ext, parser: writer})\n        this.dispatchEvent({type: 'exporterCreate', exporter, parser: writer})\n        return writer\n    }\n    private _cachedWriters: {parser: IExportWriter, ext: string[]}[] = []\n    private _getWriter(ext: string): IExportWriter {\n        return this._cachedWriters.find(e => e.ext.includes(ext))?.parser ?? this._createParser(ext)\n    }\n\n    public async processBeforeExport(obj: IObject3D|IMaterial|ITexture|IRenderTarget, options: ExportFileOptions = {}): Promise<{obj:any, ext:string, typeExt?:string, blob?: BlobExt}|undefined> {\n        // if (obj.assetExporterProcessed && !options.forceExporterReprocess) return obj //todo;;;\n\n        switch (obj.assetType) {\n        case 'light':\n            console.error('AssetExporter: light export not implemented')\n            return undefined\n        case 'model':\n            return {obj, ext: options.exportExt ?? 'glb'}\n            // return {obj, ext: 'gltf'}\n        case 'material':\n            return {obj: matToJson(obj as IMaterial), ext: options.exportExt || (obj as IMaterial).constructor?.TypeSlug, typeExt: 'json'}\n        case 'texture':\n            return options.exportExt ? {obj, ext: options.exportExt} : {obj: (obj as ITexture).toJSON(), ext: 'json'}\n        case 'renderTarget':\n            if (!obj.renderManager) return {obj, ext: 'exr'}\n            else {\n                const mime = (options.exportExt || '' !== '') && options.exportExt !== 'auto' ?\n                    options.exportExt === 'exr' ? 'image/x-exr' : 'image/' + options.exportExt : 'auto'\n\n                let blob\n                if (obj.textures.length > 1) {\n                    const zippa: Zippable = {}\n                    for (let i = 0; i < obj.textures.length; i++) {\n                        const expBlob = obj.renderManager!.exportRenderTarget(obj as WebGLRenderTarget, mime, i)\n                        // zippa[(f as File).name] = new Uint8Array(await (f as File).arrayBuffer())\n                        zippa[`texture_${i}.${expBlob.ext}`] = new Uint8Array(expBlob.__buffer || await expBlob.arrayBuffer())\n                    }\n                    const zipped = zipSync(zippa)\n                    blob = new Blob([zipped], {type: 'application/zip'}) as any as BlobExt\n                    blob.ext = 'zip'\n                    blob.__buffer = zipped.buffer\n                } else {\n                    blob = obj.renderManager.exportRenderTarget(obj as WebGLRenderTarget, mime)\n                }\n                return {\n                    obj, ext: blob.ext, blob,\n                }\n            }\n            break\n        default:\n            console.error('AssetExporter: unknown asset type', obj.assetType)\n        }\n        return undefined\n    }\n\n    public async processAfterExport(blob: BlobExt, _obj: IObject3D|IMaterial|ITexture|IRenderTarget, _options: ExportFileOptions = {}): Promise<BlobExt> {\n        return blob\n    }\n\n    dispose(): void {\n        // todo\n    }\n}\n\nexport function matToJson(mat: IMaterial) {\n    const json = mat.toJSON()\n    return json\n}\n","import {EventDispatcher, Material, ShaderChunk} from 'three'\nimport {AnimateTimeMaterial, IMaterial, iMaterialCommons, IMaterialParameters} from '../core'\nimport {downloadFile, safeSetProperty} from 'ts-browser-helpers'\nimport {MaterialExtension} from '../materials'\nimport {generateUUID} from '../three'\nimport {shaderReplaceString, ThreeSerialization} from '../utils'\nimport {upgradeMaterial} from '../core/material/iMaterialCommons'\n\n/**\n * Material Manager\n * Utility class to manage materials.\n * Maintains a library of materials and material templates that can be used to manage or create new materials.\n * Used in {@link AssetManager} to manage materials.\n * @category Asset Manager\n */\nexport class MaterialManager<TEventMap extends object = object> extends EventDispatcher<TEventMap> {\n    private _materials: IMaterial[] = []\n\n    constructor() {\n        super()\n        legacyBumpScaleFixSetup()\n    }\n\n    /**\n     * @deprecated\n     * @param info - uuid or material type\n     * @param params\n     */\n    public findOrCreate(info: string, params?: IMaterialParameters|Material): IMaterial | undefined {\n        let mat = this.findMaterial(info)\n        if (!mat) mat = this.create(info, params)\n        return mat\n    }\n\n    /**\n     * Create a material from the material type\n     * @param type\n     * @param register\n     * @param params\n     */\n    public create<TM extends IMaterial>(type: string, params: IMaterialParameters = {}, register = true, uuid?: string): TM | undefined {\n        const mat = this.findTemplate(type)\n        if (!mat) {\n            console.error('No material template found for type', type)\n            return undefined\n        }\n        const material = this._create<TM>(mat, params)\n        if (uuid) {\n            safeSetProperty(material, 'uuid', uuid, true, true)\n        }\n        if (material && register) this.registerMaterial(material)\n        return material\n    }\n\n    // make global function?\n    protected _create<TM extends IMaterial>(template: IMaterial['constructor'], oldMaterial?: IMaterialParameters|Partial<TM>): TM|undefined {\n\n        if (!template) {\n            console.error('No material template provided')\n            return undefined\n        }\n\n        const material = new template()\n        if (oldMaterial && material) material.setValues(oldMaterial, true)\n\n        return material as TM\n    }\n\n    protected _disposeMaterial = (e: {target?: IMaterial})=>{\n        const mat = e.target\n        if (!mat || mat.assetType !== 'material') return\n        // mat.setDirty()\n        this.unregisterMaterial(mat) // not unregistering on dispose, that has to be done explicitly as its ideally for GPU resources\n    }\n    protected _registerMaterial = (e: {target?: IMaterial})=>{\n        const mat = e.target\n        if (!mat || mat.assetType !== 'material') return\n        this.registerMaterial(mat)\n    }\n\n    registerMaterial(material: IMaterial): void {\n        if (!material) return\n        if (this._materials.includes(material)) return\n        if (!material.assetType) upgradeMaterial.call(material)\n        const mat = this.findMaterial(material.uuid)\n        // todo make an option to return the same material instance and replace it, instead of replacing uuid\n        if (mat) {\n            // console.warn('MaterialManager: imported material uuid already exists, creating new uuid')\n            safeSetProperty(material, 'uuid', generateUUID(), true, true)\n            if (material.userData.uuid) material.userData.uuid = material.uuid\n        }\n        // todo: check for name exists also?\n\n        // console.warn('Registering material', material)\n        // material.addEventListener('dispose', this._disposeMaterial)\n        material.addEventListener('__unregister', this._disposeMaterial)\n        material.addEventListener('__register', this._registerMaterial)\n        // material.addEventListener('materialUpdate', this._materialUpdate) // from set dirty\n        material.registerMaterialExtensions?.(this._materialExtensions)\n        material.setDirty() // this is required to be done here, as it calls refreshTextureRefs\n        this._materials.push(material)\n    }\n\n    registerMaterials(materials: IMaterial[]): void {\n        materials.forEach(material => this.registerMaterial(material))\n    }\n\n    unregisterExtensionsOnRemove = false\n\n    /**\n     * This is done automatically on material dispose.\n     * @param material\n     */\n    unregisterMaterial(material: IMaterial): void {\n        this._materials = this._materials.filter(v=>v.uuid !== material.uuid)\n        if (this.unregisterExtensionsOnRemove) {\n            material.unregisterMaterialExtensions?.(this._materialExtensions)\n        }\n        material.removeEventListener('__unregister', this._disposeMaterial)\n        material.removeEventListener('__register', this._registerMaterial)\n        // material.removeEventListener('materialUpdate', this._materialUpdate)\n    }\n    clearMaterials(): void {\n        [...this._materials].forEach(material => this.unregisterMaterial(material))\n    }\n\n    dispose(disposeRuntimeMaterials = true) {\n        const mats = this._materials\n        this._materials = []\n        for (const material of mats) {\n            if (!disposeRuntimeMaterials && material.userData.runtimeMaterial) {\n                this._materials.push(material)\n                continue\n            }\n            material.dispose()\n        }\n        return\n    }\n\n    findMaterial(uuid: string): IMaterial | undefined {\n        return !uuid ? undefined : this._materials.find(v=>v.uuid === uuid)\n    }\n\n    findMaterialsByName(name: string|RegExp, regex = false): IMaterial[] {\n        return this._materials.filter(v=>\n            typeof name !== 'string' || regex ?\n                v.name.match(typeof name === 'string' ? '^' + name + '$' : name) !== null :\n                v.name === name\n        )\n    }\n\n    getMaterialsOfType<TM extends IMaterial = IMaterial>(typeSlug: string | undefined): TM[] {\n        return typeSlug ? this._materials.filter(v=>v.constructor.TypeSlug === typeSlug) as TM[] : []\n    }\n\n    getAllMaterials(): IMaterial[] {\n        return [...this._materials]\n    }\n\n    /**\n     * Creates a new material if a compatible template is found or apply minimal upgrades and returns the original material.\n     * Also checks from the registered materials, if one with the same uuid is found, it is returned instead with the new parameters.\n     * Also caches the response.\n     * Returns the same material if its already upgraded.\n     * @param material - the material to upgrade/check\n     * @param useSourceMaterial - if false, will not use the source material parameters in the new material. default = true\n     * @param materialTemplate - any specific material template to use instead of detecting from the material type.\n     * @param createFromTemplate - if false, will not create a new material from the template, but will apply minimal upgrades to the material instead. default = true\n     */\n    convertToIMaterial(material: Material&{assetType?:'material', iMaterial?: IMaterial}, {useSourceMaterial = true, materialTemplate, createFromTemplate = true}: {useSourceMaterial?:boolean, materialTemplate?: string, createFromTemplate?: boolean} = {}): IMaterial|undefined {\n        if (!material) return\n        if (material.assetType) return <IMaterial>material\n        if (material.iMaterial?.assetType) return material.iMaterial\n        const uuid = material.userData?.uuid || material.uuid\n        let mat = this.findMaterial(uuid)\n        if (!mat && createFromTemplate !== false) {\n            const ignoreSource = useSourceMaterial === false || !material.isMaterial\n            const template = materialTemplate || (!ignoreSource && material.type ? material.type || 'physical' : 'physical')\n            mat = this.create(template, ignoreSource ? undefined : material)\n        } else if (mat) {\n            // if ((mat as any).iMaterial) mat = (mat as any).iMaterial\n            console.warn('Material with the same uuid already exists, copying properties')\n            if (material.type !== mat!.type) console.error('Material type mismatch, delete previous material first?', material, mat)\n            mat!.setValues(material)\n        }\n        if (mat) {\n            mat.uuid = uuid\n            mat.userData.uuid = uuid\n            material.iMaterial = mat\n        } else {\n            console.warn('Failed to convert material to IMaterial, just upgrading', material, useSourceMaterial, materialTemplate)\n            mat = iMaterialCommons.upgradeMaterial.call(material)\n        }\n        return mat\n    }\n\n    protected _materialExtensions: MaterialExtension[] = []\n\n    registerMaterialExtension(extension: MaterialExtension): void {\n        if (this._materialExtensions.includes(extension)) return\n        this._materialExtensions.push(extension)\n        for (const mat of this._materials) mat.registerMaterialExtensions?.([extension])\n    }\n    unregisterMaterialExtension(extension: MaterialExtension): void {\n        const i = this._materialExtensions.indexOf(extension)\n        if (i < 0) return\n        this._materialExtensions.splice(i, 1)\n        for (const mat of this._materials) mat.unregisterMaterialExtensions?.([extension])\n    }\n    clearExtensions() {\n        [...this._materialExtensions].forEach(v=>this.unregisterMaterialExtension(v))\n    }\n\n    exportMaterial(material: IMaterial, filename?: string, minify = true, download = false): File {\n        const serialized = material.toJSON()\n        const json = JSON.stringify(serialized, null, minify ? 0 : 2)\n        const name = (filename || material.name || 'physical_material') + '.' + material.constructor.TypeSlug\n        const blob = new File([json], name, {type: 'application/json'})\n        if (download) downloadFile(blob)\n        return blob\n    }\n\n    applyMaterial(material: IMaterial, nameRegexOrUuid: string, regex = true, time?: AnimateTimeMaterial): boolean {\n        let currentMats = this.findMaterialsByName(nameRegexOrUuid, regex)\n        if (!currentMats || currentMats.length < 1) currentMats = [this.findMaterial(nameRegexOrUuid) as any]\n        let applied = false\n        for (const c of currentMats) {\n            // console.log(c)\n            if (!c) continue\n            if (c === material) continue\n            if (c.userData.__isVariation) continue\n            const applied2 = this.copyMaterialProps(c, material, time)\n            if (applied2) applied = true\n        }\n        return applied\n    }\n\n    /**\n     * copyProps from material to c\n     * @param c\n     * @param material\n     * @param time\n     */\n    copyMaterialProps(c: IMaterial, material: IMaterial, time?: AnimateTimeMaterial) {\n        let applied = false\n        const mType = Object.getPrototypeOf(material).constructor.TYPE\n        const cType = Object.getPrototypeOf(c).constructor.TYPE\n        // console.log(cType, mType)\n        if (cType === mType) {\n            const n = c.name\n            c.setValues(material, undefined, undefined, time)\n            c.name = n\n            applied = true\n        } else {\n            // todo\n            // if ((c as any)['__' + mType]) continue\n            const newMat = (c as any)['__' + mType] || this.create(mType)\n            if (newMat) {\n                const n = c.name\n                // newMat.setValues(material, undefined, undefined, time)\n                if (newMat.setValues) newMat.setValues(material)\n                else Object.assign(newMat, material)\n                newMat.name = n\n                const meshes = c.appliedMeshes\n                for (const mesh of [...meshes ?? []]) {\n                    if (!mesh) continue\n                    mesh.material = newMat\n                    applied = true\n                }\n                (c as any)['__' + mType] = newMat\n            }\n        }\n        return applied\n    }\n\n\n    /**\n     * @deprecated use {@link ThreeSerialization.SerializableMaterials} directly\n     * @param template\n     */\n    registerMaterialTemplate(template: IMaterial['constructor']): void {\n        if (!template || ThreeSerialization.SerializableMaterials.has(template)) return\n        // todo remove spread after node 22 widespread support\n        const mat = [...ThreeSerialization.SerializableMaterials.values()].find(v=>v.TYPE === template.TYPE)\n        if (mat) {\n            console.warn('Material template with the same type already exists', template, mat)\n        }\n        ThreeSerialization.SerializableMaterials.add(template)\n    }\n\n    /**\n     * @deprecated use {@link ThreeSerialization.SerializableMaterials} directly\n     * @param template\n     */\n    unregisterMaterialTemplate(template: IMaterial['constructor']): void {\n        if (!template) return\n        ThreeSerialization.SerializableMaterials.delete(template)\n    }\n\n    /**\n     * @deprecated use {@link ThreeSerialization.SerializableMaterials} directly\n     * @param type\n     */\n    findTemplate(type: string) {\n        if (!type) return undefined\n        // todo remove spread after node 22 widespread support\n        return [...ThreeSerialization.SerializableMaterials.values()].find(v => v.TYPE === type)\n            || [...ThreeSerialization.SerializableMaterials.values()].find(v => v.TypeAlias?.includes(type))\n    }\n\n}\n\nfunction legacyBumpScaleFixSetup() {\n    const a = `\n\t\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n`\n    ShaderChunk.bumpmap_pars_fragment = shaderReplaceString(ShaderChunk.bumpmap_pars_fragment, a, `\n    #ifdef BUMP_MAP_SCALE_LEGACY\n        ${a.replace(/normalize/g, '')}\n    #else\n        ${a}\n    #endif\n    `)\n}\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* default error routine.  change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: throw new Error( 'THREE.RGBELoader: Read Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_write_error: throw new Error( 'THREE.RGBELoader: Write Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_format_error: throw new Error( 'THREE.RGBELoader: Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: throw new Error( 'THREE.RGBELoader: Memory Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading.  modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\trgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tconst w = rgbe_header_info.width,\n\t\t\th = rgbe_header_info.height,\n\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\n\t\tlet data, type;\n\t\tlet numElements;\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase FloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = floatArray;\n\t\t\t\ttype = FloatType;\n\t\t\t\tbreak;\n\n\t\t\tcase HalfFloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = halfArray;\n\t\t\t\ttype = HalfFloatType;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tthrow new Error( 'THREE.RGBELoader: Unsupported type: ' + this.type );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn {\n\t\t\twidth: w, height: h,\n\t\t\tdata: data,\n\t\t\theader: rgbe_header_info.string,\n\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\texposure: rgbe_header_info.exposure,\n\t\t\ttype: type\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","import {MeshStandardMaterial2, PhysicalMaterial} from '../core'\nimport {Object3D, Texture} from 'three'\n\n// todo needs testing with some more files maybe\nexport function legacySeparateMapSamplerUVFix(config: any, objs: Object3D[]) {\n    const version = (config.version ? config.version as string : '0.0.0').split('.').map(v => parseInt(v))\n    // separate texture map sampler properties added for materials in this version.\n    if (!(config.type === 'ViewerApp' && version[0] === 0 && (version[1] < 7 || version[1] === 7 && version[2].toString()[0] < '6'))) {\n        return\n    }\n    const materials = new Set<any>()\n    objs.forEach(o1 => o1.traverse((o: any) => {\n        if (o.material) materials.add(o.material)\n    }))\n    materials.forEach(material => {\n        const map = material.map as Texture\n        if (!map) return\n        const repeat = map.repeat\n        const offset = map.offset\n        const center = map.center\n        const rotation = map.rotation\n        const others: ((keyof MeshStandardMaterial2) | (keyof PhysicalMaterial))[] = ['alphaMap', 'aoMap', 'bumpMap', 'displacementMap', 'emissiveMap', 'lightMap', 'metalnessMap', 'normalMap', 'roughnessMap', 'transmissionMap']\n        others.forEach(k => {\n            const m = material[k] as Texture\n            if (m) {\n                m.repeat.copy(repeat)\n                m.offset.copy(offset)\n                m.center.copy(center)\n                m.rotation = rotation\n                m.needsUpdate = true\n            }\n        })\n        material.needsUpdate = true\n    })\n}\n","import {type GLTF, GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader'\nimport {ILoader} from '../IImporter'\nimport {LoadingManager} from 'three'\nimport {ImportAddOptions} from '../AssetManager'\nimport {PhysicalMaterial, UnlitLineMaterial, UnlitMaterial} from '../../core'\n\nexport class PolyhavenMaterialGLTFLoader extends GLTFLoader implements ILoader<GLTF, PhysicalMaterial|undefined> {\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n\n        // GLTFLoader.ObjectConstructors.DirectionalLight = DirectionalLight2 as any\n        // GLTFLoader.ObjectConstructors.PointLight = PointLight2 as any\n        // GLTFLoader.ObjectConstructors.SpotLight = SpotLight2 as any\n        GLTFLoader.ObjectConstructors.MeshStandardMaterial = PhysicalMaterial as any\n        GLTFLoader.ObjectConstructors.MeshBasicMaterial = UnlitMaterial as any\n        GLTFLoader.ObjectConstructors.MeshPhysicalMaterial = PhysicalMaterial as any\n        GLTFLoader.ObjectConstructors.LineBasicMaterial = UnlitLineMaterial as any\n        // GLTFLoader.ObjectConstructors.PointsMaterial = PointsMaterial2\n    }\n\n    /**\n     * This is run post parse to extract the result material from the GLTF object\n     * @param res\n     * @param _\n     */\n    transform(res: GLTF, _: ImportAddOptions): PhysicalMaterial|undefined {\n        // find the first PhysicalMaterial in the gltf and return it, if none found return undefined\n        let material: PhysicalMaterial|undefined\n        res.scene.traverse(o => {\n            if (material) return\n            const mat = (o as any).material\n            if (mat && mat.isPhysicalMaterial) {\n                material = mat as PhysicalMaterial\n            }\n        })\n        return material\n    }\n\n}\n","import {ImportAssetOptions, ImportResult, ProcessRawOptions, RootSceneImportResult} from './IAssetImporter'\nimport {\n    BaseEvent,\n    Camera,\n    EventDispatcher,\n    Light,\n    LinearFilter,\n    LinearMipmapLinearFilter,\n    LoadingManager,\n    Object3D,\n    TextureLoader,\n} from 'three'\nimport {ISerializedConfig, IViewerPlugin, type ThreeViewer} from '../viewer'\nimport {AssetImporter, IAssetImporterEventMap} from './AssetImporter'\nimport {getTextureDataType} from '../three'\nimport {IAsset} from './IAsset'\nimport {\n    AddObjectOptions,\n    AmbientLight2,\n    DirectionalLight2,\n    HemisphereLight2,\n    ICamera,\n    iCameraCommons,\n    ILight,\n    iLightCommons,\n    IMaterial,\n    iMaterialCommons,\n    IObject3D,\n    iObjectCommons,\n    ISceneEventMap,\n    ITexture,\n    OrthographicCamera2,\n    PerspectiveCamera2,\n    PointLight2,\n    RectAreaLight2,\n    SpotLight2,\n    upgradeTexture,\n} from '../core'\nimport {Importer} from './Importer'\nimport {MaterialManager} from './MaterialManager'\nimport {\n    DRACOLoader2,\n    FBXLoader2,\n    GLTFLoader2,\n    JSONMaterialLoader,\n    MTLLoader2,\n    OBJLoader2,\n    SimpleJSONLoader,\n    SVGTextureLoader,\n    VideoTextureLoader,\n    ZipLoader,\n} from './import'\nimport {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader.js'\nimport {EXRLoader} from 'three/examples/jsm/loaders/EXRLoader.js'\nimport {Class, getOrCall, ValOrArr} from 'ts-browser-helpers'\nimport {ILoader} from './IImporter'\nimport {AssetExporter} from './AssetExporter'\nimport {IExporter} from './IExporter'\nimport {GLTFExporter2, GLTFWriter2} from './export'\nimport {legacySeparateMapSamplerUVFix} from '../utils/legacy'\nimport type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {GLTFExporterPlugin} from 'three/examples/jsm/exporters/GLTFExporter.js'\nimport {ThreeSerialization} from '../utils'\nimport {PolyhavenMaterialGLTFLoader} from './import/PolyhavenMaterialGLTFLoader'\n\n// todo rename to AssetImporterCacheOptions\nexport interface AssetManagerOptions{\n    /**\n     * simple memory based cache for downloaded files, default = false\n     */\n    simpleCache?: boolean\n    /**\n     * Cache Storage for downloaded files, can use with `caches.open`\n     * When true and by default uses `caches.open('threepipe-assetmanager')`, set to false to disable\n     * @default true\n     */\n    storage?: Cache | Storage | boolean\n}\n\nexport interface AddAssetOptions extends AddObjectOptions{\n    /**\n     * Automatically set any loaded HDR, EXR file as the scene environment map\n     * @default true\n     */\n    autoSetEnvironment?: boolean\n    /**\n     * Automatically set any loaded image(ITexture) file as the scene background\n     */\n    autoSetBackground?: boolean\n}\nexport interface ImportAddOptions extends ImportAssetOptions, AddAssetOptions{}\nexport interface AddRawOptions extends ProcessRawOptions, AddAssetOptions{}\n\nexport interface AssetManagerEventMap{\n    loadAsset: {data: ImportResult}\n    processStateUpdate: object\n}\n\n/**\n * Asset Manager\n *\n * Utility class to manage import, export, and material management.\n * @category Asset Manager\n */\nexport class AssetManager extends EventDispatcher<AssetManagerEventMap> {\n    readonly viewer: ThreeViewer\n    readonly importer: AssetImporter\n    readonly exporter: AssetExporter\n    readonly materials: MaterialManager\n    get storage() {\n        return this.importer.storage\n    }\n\n    constructor(viewer: ThreeViewer, cacheOptions?: AssetManagerOptions) {\n        super()\n        this._sceneUpdated = this._sceneUpdated.bind(this)\n        this.addAsset = this.addAsset.bind(this)\n        this.addRaw = this.addRaw.bind(this)\n        this._loaderCreate = this._loaderCreate.bind(this)\n        this.addImported = this.addImported.bind(this)\n\n        this.importer = new AssetImporter(!!viewer.getPlugin('debug'), cacheOptions)\n        this.exporter = new AssetExporter()\n        this.materials = new MaterialManager()\n        this.viewer = viewer\n        this.viewer.scene.addEventListener('addSceneObject', this._sceneUpdated)\n        this.viewer.scene.addEventListener('materialChanged', this._sceneUpdated)\n        this.viewer.scene.addEventListener('beforeDeserialize', this._sceneUpdated)\n\n        this._setupGltfExtensions()\n        this._setupObjectProcess()\n        this._setupObjectExport()\n        this._setupProcessState()\n        this._addImporters()\n        this._addExporters()\n\n    }\n\n    async addAsset<T extends ImportResult = ImportResult>(assetOrPath?: string | IAsset | IAsset[] | File | File[], options?: ImportAddOptions): Promise<(T | undefined)[]> {\n        if (!this.importer || !this.viewer) return []\n        const imported = await this.importer.import<T>(assetOrPath, options)\n        if (!imported) {\n            const path = typeof assetOrPath === 'string' ? assetOrPath : (assetOrPath as IAsset)?.path\n            if (path && !path.split('?')[0].endsWith('.vjson'))\n                console.warn('Threepipe AssetManager - Unable to import', assetOrPath, imported)\n            return []\n        }\n        return this.loadImported<(T | undefined)[]>(imported, options)\n    }\n\n    // materials: IMaterial[] = []\n    // textures: ITexture[] = []\n\n    // todo move this function to viewer\n    async loadImported<T extends ValOrArr<ImportResult | undefined> = ImportResult>(imported: T, {\n        autoSetEnvironment = true,\n        autoSetBackground = false,\n        ...options\n    }: AddAssetOptions = {}): Promise<T> {\n        const arr: (ImportResult | undefined)[] = Array.isArray(imported) ? imported : [imported]\n        let ret: T = Array.isArray(imported) ? [] : undefined as any\n\n        if (options?.importConfig !== false) {\n            const config = arr.find(v => v?.assetType === 'config') || arr.find(v=>v && !!v.importedViewerConfig)?.importedViewerConfig\n            if (config) legacySeparateMapSamplerUVFix(config, arr.filter(a=>a?.isObject3D) as Object3D[])\n        }\n\n        for (const obj of arr) {\n            if (!obj) {\n                if (Array.isArray(ret)) ret.push(undefined)\n                continue\n            }\n\n            let r = obj\n\n            const rootPath = obj?.__rootBlob ? obj.__rootBlob.filePath || obj.__rootBlob.name : obj.__rootPath || obj.userData?.rootPath || obj.name || ''\n\n            switch (obj.assetType) {\n            case 'material':\n                this.materials.registerMaterial(<IMaterial>obj)\n                break\n            case 'texture':\n                if (autoSetEnvironment && (rootPath?.endsWith('.hdr') || rootPath?.endsWith('.exr')))\n                    this.viewer.scene.environment = <ITexture>obj\n                if (autoSetBackground) this.viewer.scene.background = <ITexture>obj\n                break\n            case 'model':\n            case 'light':\n            case 'camera':\n                r = await this.viewer.addSceneObject(<IObject3D | RootSceneImportResult>obj, options) // todo update references in scene update event\n                break\n            case 'config':\n                if (options?.importConfig !== false) await this.viewer.importConfig(<ISerializedConfig>obj)\n                break\n            default:\n\n                // legacy\n                if (obj.type && typeof obj.type === 'string' && (Array.isArray((obj as any).plugins) ||\n                        (obj as any).type === 'ThreeViewer' || this.viewer.getPlugin((obj as any).type))) {\n                    await this.viewer.importConfig(<ISerializedConfig>obj)\n                }\n                break\n            }\n            this.dispatchEvent({type: 'loadAsset', data: obj})\n            if (Array.isArray(ret)) ret.push(r)\n            else ret = r as T\n        }\n\n        return ret\n    }\n\n    /**\n     * same as {@link loadImported}\n     * @param imported\n     * @param options\n     */\n    async addProcessedAssets<T extends ImportResult | undefined = ImportResult>(imported: (T | undefined)[], options?: AddAssetOptions): Promise<(T | undefined)[]> {\n        return this.loadImported(imported, options)\n    }\n\n    async addAssetSingle<T extends ImportResult = ImportResult>(asset?: string | IAsset | File, options?: ImportAssetOptions): Promise<T | undefined> {\n        return !asset ? undefined : (await this.addAsset<T>(asset, options))?.[0]\n    }\n\n    // processAndAddObjects\n    async addRaw<T extends (ImportResult | undefined) = ImportResult>(res: T | T[], options: AddRawOptions = {}): Promise<(T | undefined)[]> {\n        const r = await this.importer.processRaw<T>(res, options)\n        return this.loadImported<T[]>(r, options)\n    }\n\n    async addRawSingle<T extends ImportResult | undefined = ImportResult | undefined>(res: T, options: AddRawOptions = {}): Promise<T | undefined> {\n        return (await this.addRaw<T>(res, options))?.[0]\n    }\n\n    private _sceneUpdated<T extends keyof ISceneEventMap>(ev: BaseEvent<T> & ISceneEventMap[T]) { // todo: check if objects are added some other way.\n        if (ev.type === 'addSceneObject') {\n            const event = ev as ISceneEventMap['addSceneObject']\n            const target = event.object as ImportResult\n            switch (target.assetType) {\n            case 'material':\n                this.materials.registerMaterial(<IMaterial>target)\n                break\n            case 'texture':\n                break\n            case 'model':\n            case 'light':\n            case 'camera':\n                break\n            default:\n                break\n            }\n        } else if (ev.type === 'materialChanged') {\n            const event = ev as ISceneEventMap['materialChanged']\n            const target = event.material as IMaterial | IMaterial[] | undefined\n            const targets = Array.isArray(target) ? target : target ? [target] : []\n            for (const t of targets) {\n                this.materials.registerMaterial(t)\n            }\n        } else if (ev.type === 'beforeDeserialize') {// todo where is this used? is it needed?\n            const event = ev as ISceneEventMap['beforeDeserialize']\n            // object/material/texture to be deserialized\n            const data = event.data as any\n            const meta = event.meta\n            if (!data.metadata) {\n                console.warn('Invalid data(no metadata)', data)\n            }\n            if (event.material) {\n                if (data.metadata?.type !== 'Material') {\n                    console.warn('Invalid material data', data)\n                }\n                JSONMaterialLoader.DeserializeMaterialJSON(data, this.viewer, meta, event.material).then(() => {\n                    //\n                })\n            }\n\n        } else {\n            console.error('Unexpected')\n        }\n    }\n\n    dispose() {\n        this.importer.dispose()\n        this.materials.dispose()\n        this.processState.clear()\n        this.viewer.scene.removeEventListener('addSceneObject', this._sceneUpdated)\n        this.viewer.scene.removeEventListener('materialChanged', this._sceneUpdated)\n        this.exporter.dispose()\n    }\n\n    protected _addImporters() {\n        const viewer = this.viewer\n        if (!viewer) return\n        const importer = this.importer\n\n        // todo fix - loading manager getHandler matches backwards?\n        const importers: Importer[] = [\n            new Importer(class extends SimpleJSONLoader {\n                async parseAsync(json: Record<string, any>): Promise<any> {\n                    if (json.assetType === 'config') return json // process later\n                    // When a file with .json extension and a .type is imported, we can forward it to other loaders inheriting SimpleJSONLoader that support that type like JSONMaterialLoader\n                    // getOrCall ensures we get all materials registered at runtime\n                    const type = json.type || json.metadata?.type\n                    const imps = importer.importers.filter(i=>{\n                        const t = ((i as Importer).cls as typeof SimpleJSONLoader)?.SupportedJSONTypes\n                        if (t) return getOrCall(t)?.includes(type)\n                    })\n                    for (const imp of imps) {\n                        if (!imp) continue\n                        const loader = imp.ctor(importer) as SimpleJSONLoader\n                        const res = await loader.parseAsync(json)\n                        ;(loader as ILoader).dispose && (loader as ILoader).dispose!()\n                        if (res) return res // loader can return undefined if they don't want to support this file\n                    }\n                    if (json.serializableClassId) { // todo check json.type also as its supported in Serialization? or just do it anyway for any object because it could have nested serialized objects?\n                        const resources = json.resources\n                        if (json.resources) delete json.resources\n                        const meta = resources ? await viewer.loadConfigResources(resources) : undefined\n                        const res = ThreeSerialization.Deserialize(json, undefined, meta)\n                        if (meta) json.resources = meta\n                        if (res) return res\n                    }\n                    return super.parseAsync(json)\n                }\n            }, ['json', 'vjson'], ['application/json'], false),\n\n            new Importer(SVGTextureLoader, ['svg', 'data:image/svg'], ['image/svg+xml'], false), // todo: use ImageBitmapLoader if supported (better performance)\n\n            new Importer(TextureLoader, ['webp', 'png', 'jpeg', 'jpg', 'ico', 'data:image', 'avif', 'bmp', 'gif', 'tiff'], [\n                'image/webp', 'image/png', 'image/jpeg', 'image/gif', 'image/bmp', 'image/tiff', 'image/x-icon', 'image/avif',\n            ], false), // todo: use ImageBitmapLoader if supported (better performance)\n\n            new Importer<JSONMaterialLoader>(JSONMaterialLoader,\n                JSONMaterialLoader.SupportedJSONExtensions,\n                [], false, (loader) => {\n                    if (loader) loader.viewer = this.viewer\n                    return loader\n                }),\n\n            new Importer(class extends RGBELoader {\n                constructor(manager: LoadingManager) {\n                    super(manager)\n                    this.setDataType(getTextureDataType(viewer.renderManager.renderer))\n                }\n            }, ['hdr'], ['image/vnd.radiance'], false),\n\n            new Importer(class extends EXRLoader {\n                constructor(manager: LoadingManager) {\n                    super(manager)\n                    this.setDataType(getTextureDataType(viewer.renderManager.renderer))\n                }\n            }, ['exr'], ['image/x-exr'], false),\n\n            new Importer(FBXLoader2, ['fbx'], ['model/fbx'], true),\n            new Importer(ZipLoader, ['zip', 'glbz', 'gltfz'], ['application/zip', 'model/gltf+zip', 'model/zip'], true), // gltfz and glbz are invented zip files with gltf/glb inside along with resources\n\n            new Importer(OBJLoader2 as any as Class<ILoader>, ['obj'], ['model/obj'], true),\n            new Importer(MTLLoader2 as any as Class<ILoader>, ['mtl'], ['model/mtl'], false),\n\n            new Importer<GLTFLoader2>(GLTFLoader2, ['gltf', 'glb', 'data:model/gltf', 'data:model/glb'], ['model/gltf', 'model/gltf+json', 'model/gltf-binary', 'model/glb'], true, (l, _, i) => l?.setup(this.viewer, i.extensions)),\n\n            new Importer(DRACOLoader2, ['drc'], ['model/mesh+draco', 'model/drc'], true),\n\n            new Importer(VideoTextureLoader, ['mp4', 'ogg', 'mov', 'webm', 'data:video'], ['video/mp4', 'video/ogg', 'video/quicktime', 'video/webm'], true),\n\n            new Importer(PolyhavenMaterialGLTFLoader, ['phmatgltf'], [], true),\n        ]\n\n        this.importer.addImporter(...importers)\n\n    }\n\n    private _gltfExporter = {\n        ext: ['gltf', 'glb'],\n        extensions: [] as (typeof GLTFExporter2.ExportExtensions)[number][],\n        ctor: (_, exporter) => {\n            const ex = new GLTFExporter2()\n            // This should be added at the end.\n            ex.setup(this.viewer, exporter.extensions)\n            return ex\n        },\n    } satisfies IExporter\n\n    protected _addExporters() {\n        const exporters: IExporter[] = [this._gltfExporter]\n\n        this.exporter.addExporter(...exporters)\n    }\n\n    protected _setupObjectProcess() {\n        this.importer.addEventListener('processRaw', (event) => {\n            if (event.data && event.data.isObject3D) {\n                const node = event.data as IObject3D\n                this._loadObjectDependencies(node)\n                return\n            }\n            const mat = event.data as IMaterial\n            if (mat && mat.isMaterial && mat.uuid) {\n                this.materials.registerMaterial(mat)\n            }\n        })\n\n        this.importer.addEventListener('processRawStart', (e)=>processRawStartHook(e, this))\n    }\n\n    protected _setupObjectExport() {\n        // this.exporter.addEventListener('exportFile', ()=>{\n        // })\n    }\n\n    /**\n     * Load the embedded `rootPath` dependencies within this object\n     * @param object\n     * @private\n     */\n    private async _loadObjectDependencies(object: IObject3D) {\n        const deps = [] as IObject3D[]\n        if (!object.traverseModels) {\n            this.viewer.console.error('AssetManager - Object not upgraded, cannot load dependencies', object)\n            return\n        }\n        object.traverseModels && object.traverseModels(m => {\n            if (m.userData.rootPathRefresh && !m._rootPathRefreshed && !m._rootPathRefreshing && m.userData.rootPath) {\n                deps.push(m)\n                return false // to not traverse children\n            }\n            return true\n        }, {visible: false, widgets: true})\n        const pms = deps.map(async m => {\n            m._rootPathRefreshing = true\n            const rootPath = m.userData.rootPath\n            if (!rootPath) return null\n            const rootPathOptions = m.userData.rootPathOptions\n            const res = await this.importer.import(rootPath, {\n                ...rootPathOptions,\n            })\n            if (!res) {\n                throw new Error(`Unable to load asset from url - ${rootPath}`)\n            }\n            return res\n        })\n        const r = await Promise.allSettled(pms)\n        // console.log(r)\n        for (let i = 0; i < r.length; i++) {\n            const res = r[i]\n            const obj = deps[i]\n            delete obj._rootPathRefreshing\n            obj._rootPathRefreshed = true\n            if (res.status === 'rejected') {\n                this.viewer.console.error(`ThreeViewer - Failed to load root path for object ${obj.name}`, res.reason)\n                continue\n            }\n            if (res.status !== 'fulfilled') continue\n            const models = res.value\n            if (!models || !models.length) continue\n            const model = models.find(m => m?.isObject3D)\n            if (!model) {\n                this.viewer.console.warn('AssetManager - No valid model found in root path', res.value)\n                continue\n            }\n            const others = models.filter(m => m && m !== model)\n            const parent = obj.parent\n            const newIndex = parent ? parent.children.indexOf(obj) : -1\n            if (parent) obj.removeFromParent()\n            this.viewer.object3dManager.unregisterObject(obj)\n            if (!model.isObject3D) {\n                this.viewer.console.warn('Non model dependency loaded. Not fully supported yet.')\n                // todo?\n                continue\n            }\n            if (!parent) {\n                this.viewer.console.error('AssetManager - Unexpected error, no parent found for object when loading dependency', obj)\n                // parent = this.viewer.scene.modelRoot\n                continue\n            }\n            if (model._copyFromEmbedded) model._copyFromEmbedded(obj) // todo better name, document this in IObject3D or ImportResult?\n            else {\n                obj.matrix.decompose(model.position, model.quaternion, model.scale)\n                model.name = obj.name // copy name\n                model.userData = {...obj.userData, ...model.userData} // merge userData\n                model._rootPathRefreshed = true // mark as refreshed\n                // @ts-expect-error force update\n                model.uuid = obj.uuid\n            }\n            parent.add(model as IObject3D)\n            const newIndex2 = parent.children.indexOf(model as IObject3D)\n            if (newIndex >= 0 && newIndex2 >= 0 && newIndex !== newIndex2) {\n                parent.children.splice(newIndex2, 1)\n                parent.children.splice(newIndex, 0, model as IObject3D) // add at new index\n            }\n            if (others.length) {\n                for (const other of others) {\n                    if (other?.isObject3D) {\n                        parent.add(other as Object3D)\n                    } else {\n                        this.viewer.console.warn('Non model dependency loaded. Not fully supported yet.', other)\n                    }\n                }\n            }\n        }\n    }\n\n    // region process state\n\n    /**\n     * State of download/upload/process/other processes in the viewer.\n     * Subscribes to importer and exporter by default, more can be added by plugins like {@link FileTransferPlugin}\n     */\n    processState: Map<string, {state: string, progress?: number | undefined}> = new Map()\n\n    /**\n     * Set process state for a path\n     * Progress should be a number between 0 and 100\n     * Pass undefined in value to remove the state\n     * @param path\n     * @param value\n     */\n    setProcessState(path: string, value: {state: string, progress?: number | undefined} | undefined) {\n        if (value === undefined) this.processState.delete(path)\n        else this.processState.set(path, value)\n        this.dispatchEvent({type: 'processStateUpdate'})\n    }\n\n    protected _setupProcessState() {\n        this.importer.addEventListener('importFile', (data) => {\n            if (!data.path || data.path.startsWith('blob:') || data.path.startsWith('data:')) return\n            this.setProcessState(data.path, data.state !== 'done' ? {\n                state: data.state,\n                progress: data.progress ? data.progress * 100 : undefined,\n            } : undefined)\n        })\n        this.importer.addEventListener('processRawStart', (data) => {\n            if (!data.path || data.path.startsWith('blob:') || data.path.startsWith('data:')) return\n            this.setProcessState(data.path, {\n                state: 'processing',\n                progress: undefined,\n            })\n        })\n        this.importer.addEventListener('processRaw', (data) => {\n            if (!data.path || data.path.startsWith('blob:') || data.path.startsWith('data:')) return\n            this.setProcessState(data.path, undefined)\n        })\n        this.exporter.addEventListener('exportFile', (data) => {\n            if (!data.obj.name) return\n            this.setProcessState(data.obj.name, data.state !== 'done' ? {\n                state: data.state,\n                progress: data.progress ? data.progress * 100 : undefined,\n            } : undefined)\n        })\n    }\n\n    // endregion\n\n    // region glTF extensions registration helpers\n\n    gltfExtensions: {\n        name: string\n        import: (parser: GLTFParser, viewer?: ThreeViewer) => GLTFLoaderPlugin,\n        export: (parser: GLTFWriter2) => GLTFExporterPlugin,\n        textures?: Record<string, string|number> // see GLTFDracoExportPlugin\n    }[] = []\n\n    protected _setupGltfExtensions() {\n        this.importer.addEventListener('loaderCreate', this._loaderCreate as any)\n        this.viewer.forPlugin('GLTFDracoExportPlugin', (p)=> {\n            if (!p.addExtension) return\n            for (const gltfExtension of this.gltfExtensions) {\n                p.addExtension(gltfExtension.name, gltfExtension.textures)\n            }\n        })\n    }\n\n    protected _loaderCreate({loader}: {loader: GLTFLoader2}) {\n        if (!loader.isGLTFLoader2) return\n        for (const gltfExtension of this.gltfExtensions) {\n            loader.register(gltfExtension.import)\n        }\n    }\n\n    registerGltfExtension(ext: AssetManager['gltfExtensions'][number]) {\n        const ext1 = this.gltfExtensions.findIndex(e => e.name === ext.name)\n        if (ext1 >= 0) this.gltfExtensions.splice(ext1, 1)\n        this.gltfExtensions.push(ext)\n        this._gltfExporter.extensions.push(ext.export)\n        const exporter2 = this.exporter.getExporter('gltf', 'glb')\n        if (exporter2 && exporter2 !== this._gltfExporter)\n            exporter2.extensions?.push(ext.export)\n    }\n\n    unregisterGltfExtension(name: string) {\n        const ind = this.gltfExtensions.findIndex(e => e.name === name)\n        if (ind < 0) return\n        this.gltfExtensions.splice(ind, 1)\n        const ind1 = this._gltfExporter.extensions.findIndex(e => e.name === name)\n        if (ind1 >= 0) this._gltfExporter.extensions.splice(ind1, 1)\n        const exporter2 = this.exporter.getExporter('gltf', 'glb')\n        if (exporter2?.extensions && exporter2 !== this._gltfExporter) {\n            const ind2 = exporter2.extensions.findIndex(e => e.name === name)\n            if (ind2 >= 0) exporter2.extensions?.splice(ind2, 1)\n        }\n    }\n\n    // endregion\n\n    // region deprecated\n\n    /**\n     * @deprecated use addRaw instead\n     * @param res\n     * @param options\n     */\n    async addImported<T extends (ImportResult | undefined) = ImportResult>(res: T | T[], options: AddRawOptions = {}): Promise<(T | undefined)[]> {\n        console.error('addImported is deprecated, use addRaw instead')\n        return this.addRaw(res, options)\n    }\n\n    /**\n     * @deprecated use addAsset instead\n     * @param path\n     * @param options\n     */\n    public async addFromPath(path: string, options: ImportAddOptions = {}): Promise<any[]> {\n        console.error('addFromPath is deprecated, use addAsset instead')\n        return this.addAsset(path, options)\n    }\n\n    /**\n     * @deprecated use {@link ThreeViewer.exportConfig} instead\n     * @param binary - if set to false, encodes all the array buffers to base64\n     */\n    exportViewerConfig(binary = true): Record<string, any> {\n        if (!this.viewer) return {}\n        console.error('exportViewerConfig is deprecated, use viewer.toJSON instead')\n        return this.viewer.toJSON(binary, undefined)\n    }\n\n    /**\n     * @deprecated use {@link ThreeViewer.exportPluginsConfig} instead\n     * @param filter\n     */\n    exportPluginPresets(filter?: string[]) {\n        console.error('exportPluginPresets is deprecated, use viewer.exportPluginsConfig instead')\n        return this.viewer?.exportPluginsConfig(filter)\n    }\n\n    /**\n     * @deprecated use {@link ThreeViewer.exportPluginConfig} instead\n     * @param plugin\n     */\n    exportPluginPreset(plugin: IViewerPlugin) {\n        console.error('exportPluginPreset is deprecated, use viewer.exportPluginConfig instead')\n        return this.viewer?.exportPluginConfig(plugin)\n    }\n\n    /**\n     * @deprecated use {@link ThreeViewer.importPluginConfig} instead\n     * @param json\n     * @param plugin\n     */\n    async importPluginPreset(json: any, plugin?: IViewerPlugin) {\n        console.error('importPluginPreset is deprecated, use viewer.importPluginConfig instead')\n        return this.viewer?.importPluginConfig(json, plugin)\n    }\n\n    // todo continue from here by moving functions to the viewer.\n    /**\n     * @deprecated use {@link ThreeViewer.importConfig} instead\n     * @param viewerConfig\n     */\n    async importViewerConfig(viewerConfig: any) {\n        return this.viewer?.importConfig(viewerConfig)\n    }\n\n    /**\n     * @deprecated use {@link ThreeViewer.fromJSON} instead\n     * @param viewerConfig\n     */\n    applyViewerConfig(viewerConfig: any, resources?: any) {\n        console.error('applyViewerConfig is deprecated, use viewer.fromJSON instead')\n        return this.viewer?.fromJSON(viewerConfig, resources)\n    }\n\n    /**\n     * @deprecated moved to {@link ThreeViewer.loadConfigResources}\n     * @param json\n     * @param extraResources - preloaded resources in the format of viewer config resources.\n     */\n    async importConfigResources(json: any, extraResources?: any) {\n        if (!this.importer) throw 'Importer not initialized yet.'\n\n        if (json.__isLoadedResources) return json\n\n        return this.viewer?.loadConfigResources(json, extraResources)\n    }\n\n    /**\n     * @deprecated not a plugin anymore\n     */\n    static readonly PluginType = 'AssetManager'\n    // endregion\n\n}\n\nconst processRawStartHook = (event: IAssetImporterEventMap['processRawStart'], manager: AssetManager) => {\n    // console.log('preprocess mat', mat)\n    const res = event.data!\n    const options = event.options! as ProcessRawOptions\n    // if (!res.assetType) {\n    //     if (res.isBufferGeometry) { // for eg stl todo\n    //         res = new Mesh(res, new MeshStandardMaterial())\n    //     }\n    //     if (res.isObject3D) {\n    //     }\n    // }\n    if (res.isObject3D) {\n        const cameras: Camera[] = []\n        const lights: Light[] = []\n        res.traverse((obj: any) => {\n            if (obj.material) {\n                const materials = Array.isArray(obj.material) ? obj.material : [obj.material]\n                const newMaterials = []\n                const textures = []\n                for (const material of materials) {\n                    const mat = manager.materials.convertToIMaterial(material, {createFromTemplate: options.replaceMaterials !== false}) || material\n                    mat.uuid = material.uuid\n                    mat.userData.uuid = material.uuid\n                    newMaterials.push(mat)\n                    const maps: Map<string, ITexture> = iMaterialCommons.getMapsForMaterial.call(mat)\n                    textures.push(...Array.from(maps.values()))\n                }\n                if (Array.isArray(obj.material)) obj.material = newMaterials\n                else obj.material = newMaterials[0]\n                new Set(textures).forEach(t => {\n                    if (typeof t.userData.rootPath === 'string' && t.userData.rootPath.startsWith('blob:')) { // because we are not checking when setting inside three.js fork\n                        delete t.userData.rootPath\n                    }\n                    // embedded texture loaded inside some other loader.\n                    if (t.userData.rootPath && !(t as ImportResult).__rootPath) {\n                        (t as ImportResult).__rootPath = t.userData.rootPath\n                        // todo we are ignoring the promise from process raw\n                        manager.importer.processRawSingle(t, {})\n                    } else {\n                        upgradeTexture.call(t)\n                    }\n                })\n            }\n            if (obj.isCamera) cameras.push(obj)\n            if (obj.isLight) lights.push(obj)\n        })\n        for (const camera of cameras) {\n            if ((camera as Partial<ICamera>).assetType === 'camera') continue\n            // todo: OrthographicCamera\n            if (!camera.parent || options.replaceCameras === false) {\n                iCameraCommons.upgradeCamera.call(camera)\n            } else {\n                const newCamera: ICamera = (camera as any).iCamera ??\n                !(camera as Partial<ICamera>).isOrthographicCamera ?\n                    new PerspectiveCamera2('', manager.viewer.canvas) :\n                    new OrthographicCamera2('', manager.viewer.canvas)\n                if (camera === newCamera) continue\n                camera.parent.children.splice(camera.parent.children.indexOf(camera), 1, newCamera)\n                newCamera.parent = camera.parent as any\n                newCamera.copy(camera as any)\n                camera.parent = null\n                ;(newCamera as any).uuid = camera.uuid\n                newCamera.userData.uuid = camera.uuid\n                ;(camera as any).iCamera = newCamera\n                // console.log('replacing camera', camera, newCamera)\n            }\n        }\n        for (const light of lights) {\n            if ((light as ILight).assetType === 'light') continue\n            if (!light.parent || options.replaceLights === false) {\n                iLightCommons.upgradeLight.call(light)\n            } else {\n                const newLight: ILight | undefined = (light as any).iLight ??\n                (light as any).isDirectionalLight ? new DirectionalLight2() :\n                    (light as any).isPointLight ? new PointLight2() :\n                        (light as any).isSpotLight ? new SpotLight2() :\n                            (light as any).isAmbientLight ? new AmbientLight2() :\n                                (light as any).isHemisphereLight ? new HemisphereLight2() :\n                                    (light as any).isRectAreaLight ? new RectAreaLight2() :\n                                        undefined\n                if (light === newLight || !newLight) continue\n                light.parent.children.splice(light.parent.children.indexOf(light), 1, newLight)\n                newLight.parent = light.parent as any\n                newLight.copy(light as any)\n                light.parent = null\n                ;(newLight as any).uuid = light.uuid\n                newLight.userData.uuid = light.uuid\n                ;(light as any).iLight = newLight\n            }\n        }\n\n        iObjectCommons.upgradeObject3D.call(res)\n    } else if (res.isMaterial) {\n        if (!res.assetType) iMaterialCommons.upgradeMaterial.call(res)\n        // todo update res by generating new material?\n    } else if (res.isTexture) {\n        upgradeTexture.call(res)\n\n        if (event?.options?.generateMipmaps !== undefined)\n            res.generateMipmaps = event?.options.generateMipmaps\n        if (!res.generateMipmaps && !res.isRenderTargetTexture) { // todo: do we need to check more?\n            res.minFilter = res.minFilter === LinearMipmapLinearFilter ? LinearFilter : res.minFilter\n            res.magFilter = res.magFilter === LinearMipmapLinearFilter ? LinearFilter : res.magFilter\n        }\n\n    }\n    // todo other asset/object types?\n}\n","import {\n    IGeometry,\n    iGeometryCommons,\n    ILight,\n    IMaterial,\n    iMaterialCommons,\n    IMaterialEventMap,\n    IObject3D,\n    IObject3DEventMap,\n    iObjectCommons,\n    IScene,\n    ITexture,\n    LegacyPhongMaterial,\n    PhysicalMaterial,\n    UnlitLineMaterial,\n    UnlitMaterial,\n    upgradeTexture,\n} from '../core'\nimport {IObjectExtension} from '../core/IObject'\nimport {Event, Event2, EventDispatcher, VideoTexture} from 'three'\nimport {generateUUID} from '../three'\nimport {object3DTextureProperties, sceneTextureProperties} from '../core/object/iObjectCommons'\nimport {materialTextureProperties, materialTexturePropertiesUserData} from '../core/material/iMaterialCommons'\nimport {safeSetProperty} from 'ts-browser-helpers'\n\n/**\n * Event map for Object3DManager events.\n */\nexport interface Object3DManagerEventMap {\n    'videoAdd': {video: VideoTexture & ITexture}\n    'videoRemove': {video: VideoTexture & ITexture}\n    'objectAdd': {object: IObject3D}\n    'objectRemove': {object: IObject3D}\n    'materialAdd': {material: IMaterial}\n    'materialRemove': {material: IMaterial}\n    'geometryAdd': {geometry: IGeometry}\n    'geometryRemove': {geometry: IGeometry}\n    'textureAdd': {texture: ITexture}\n    'textureRemove': {texture: ITexture}\n    'lightAdd': {light: ILight}\n    'lightRemove': {light: ILight}\n    'dispose': object\n}\n\n/**\n * Manages 3D objects, materials, geometries, textures, and videos in a scene.\n */\nexport class Object3DManager extends EventDispatcher<Object3DManagerEventMap> {\n    private _root: IObject3D | undefined\n    private _objects = new Map<string, IObject3D>()\n    private _objectExtensions: IObjectExtension[] = []\n    private _materials = new Map<string, IMaterial>()\n    private _geometries = new Map<string, IGeometry>()\n    private _textures = new Map<string, ITexture>()\n    private _videos = new Map<string, VideoTexture & ITexture>()\n    private _lights = new Map<string, ILight>()\n\n    // todo wait sometime before disposing to avoid disposing and creating again immediately in the same frame\n    autoDisposeTextures = true\n    autoDisposeMaterials = true\n    autoDisposeGeometries = true\n    autoDisposeObjects = false\n\n    constructor() {\n        super()\n        this._rootChanged = this._rootChanged.bind(this)\n        this._materialChanged = this._materialChanged.bind(this)\n        this._geometryChanged = this._geometryChanged.bind(this)\n        this._texturesChanged = this._texturesChanged.bind(this) // todo add texturesChanged to textures on objects as well like background and environment\n        // this._objAdded = this._objAdded.bind(this)\n    }\n\n    onPostFrame(timeline: {time: number, running: boolean}) {\n        // const delta = time.delta\n        for (const video of this._videos.values()) {\n            const data = video.userData.timeline\n            if (data) {\n                if (!data.enabled) continue\n            }\n            const elem = video.image as HTMLVideoElement\n            const delay = data?.delay || 0\n            const scale = data?.scale || 1\n            const start = data?.start || 0\n            const duration = elem.duration || 1\n            const end = duration - (data?.end || 0)\n            // elem.pause()\n            let t = timeline.time\n            t -= delay\n            t *= scale\n            if (t < start) t = start\n            if (t > end) t = end\n            if (t < 0) t = 0\n            if (t > duration) t = duration\n            const d1 = Math.abs(t - elem.currentTime)\n            if (/* d1 > delta && */d1 > 1 / 60) { // todo determine fps?\n                // console.log(t)\n                elem.currentTime = t\n                if (elem.paused) {\n                    const i1 = (video._playid || 0) + 1 // increment play id to avoid playing the video multiple times\n                    video._playid = i1\n                    elem.play().then(() => {\n                        if (video._playid !== i1) return // if play id changed, do not play the video\n                        if (!elem.paused) {\n                            elem.pause()\n                        }\n                        delete video._playid\n                    })\n                }\n            }\n            if (!timeline.running) {\n                // if the timeline is not running, pause the video\n                if (!elem.paused && !video._playid) {\n                    elem.pause()\n                }\n            }\n        }\n    }\n\n    setRoot(root: IObject3D) {\n        this._root = root\n    }\n\n    registerObject(obj: IObject3D) {\n        if (!obj || !obj.uuid || !obj.isObject3D) return\n        const existing = this.getObject(obj.uuid)\n        if (existing) {\n            if (obj !== existing) {\n                console.warn('Object3DManager - Object with the same uuid already registered', obj, existing)\n                safeSetProperty(obj, 'uuid', generateUUID(), true, true)\n            } else return\n            // return\n        }\n        if (!obj.assetType) {\n            iObjectCommons.upgradeObject3D.call(obj)\n        }\n        this._objects.set(obj.uuid, obj)\n        obj.addEventListener('parentRootChanged', this._rootChanged)\n        obj.addEventListener('materialChanged', this._materialChanged)\n        obj.addEventListener('geometryChanged', this._geometryChanged)\n        obj.addEventListener('texturesChanged', this._texturesChanged)\n        if ((obj as IScene).isScene) {\n            (obj as IScene).addEventListener('backgroundChanged', this._textureChanged)\n            ;(obj as IScene).addEventListener('environmentChanged', this._textureChanged)\n        }\n        this._registerMaterials(obj.materials, obj)\n        this._registerGeometry(obj.geometry, obj)\n        const maps: Map<string, ITexture> = iObjectCommons.getMapsForObject3D.call(obj)\n        if (maps) for (const tex of maps.values()) {\n            this._registerTexture(tex, obj)\n        }\n        if (!obj.objectExtensions) obj.objectExtensions = []\n        const exts = obj.objectExtensions\n        for (const ext of this._objectExtensions) {\n            if (exts.includes(ext)) continue\n            const compatible = ext.isCompatible ? ext.isCompatible(obj) : true\n            if (compatible) {\n                exts.push(ext)\n                ext.onRegister && ext.onRegister(obj)\n            }\n        }\n        this.dispatchEvent({type: 'objectAdd', object: obj})\n        if (obj.isLight) {\n            this._lights.set(obj.uuid, obj as ILight)\n            this.dispatchEvent({type: 'lightAdd', light: obj as ILight})\n        }\n        obj.dispatchEvent({type: '__register' as any}) // todo do same for geom and textures\n    }\n\n    unregisterObject(obj: IObject3D) {\n        if (!obj || !obj.uuid) return false\n        const existing = this._objects.get(obj.uuid)\n        if (!existing) return false\n        if (obj !== existing) {\n            console.error('Object3DManager - Object to unregister is not the same as the registered object', obj, existing)\n            return false\n        }\n        this._objects.delete(obj.uuid)\n        obj.removeEventListener('materialChanged', this._materialChanged)\n        obj.removeEventListener('geometryChanged', this._geometryChanged)\n        obj.removeEventListener('texturesChanged', this._texturesChanged)\n        if ((obj as IScene).isScene) {\n            (obj as IScene).removeEventListener('backgroundChanged', this._textureChanged)\n            ;(obj as IScene).removeEventListener('environmentChanged', this._textureChanged)\n        }\n\n        // obj.removeEventListener('added', this._objAdded)\n        this._unregisterMaterials(obj.materials, obj)\n        this._unregisterGeometry(obj.geometry, obj)\n        const maps: Map<string, ITexture> = iObjectCommons.getMapsForObject3D.call(obj)\n        if (maps) for (const tex of maps.values()) {\n            this._unregisterTexture(tex, obj)\n        }\n        if (this.autoDisposeObjects && obj.userData?.disposeOnIdle !== false) { // todo add disposeOnIdle to types and docs\n            obj.dispose && obj.dispose(false)\n        }\n        this.dispatchEvent({type: 'objectRemove', object: obj})\n        if (obj.isLight && this._lights.has(obj.uuid)) {\n            this._lights.delete(obj.uuid)\n            this.dispatchEvent({type: 'lightRemove', light: obj as ILight})\n        }\n        obj.dispatchEvent({type: '__unregister' as any})\n        return true\n\n        // todo - extensions are not removed from the object, so they can be reused later\n        // if (obj.objectExtensions) {\n        //     for (const ext of this._objectExtensions) {\n        //         const ind1 = obj.objectExtensions.indexOf(ext)\n        //         if (ind1 >= 0) obj.objectExtensions.splice(ind1, 1)\n        //     }\n        // }\n\n        // listener is not removed, it will be used to know when its added back to root. todo - because of this reference to the manager is kept even after dispose, if the object is removed from the scene before dispose. but it would be empty.\n        // obj.removeEventListener('parentRootChanged', this._rootChanged)\n    }\n\n    registerObjectExtension(ext: IObjectExtension) {\n        if (!ext) return\n        if (!ext.uuid) ext.uuid = generateUUID()\n        const ind = this._objectExtensions.includes(ext)\n        if (ind) return\n        this._objectExtensions.push(ext)\n        for (const obj of this._objects.values()) {\n            if (obj.objectExtensions && !obj.objectExtensions.includes(ext)) {\n                const compatible = ext.isCompatible ? ext.isCompatible(obj) : true\n                if (compatible) {\n                    obj.objectExtensions.push(ext)\n                }\n            }\n        }\n    }\n\n    unregisterObjectExtension(ext: IObjectExtension) {\n        if (!ext) return\n        const ind = this._objectExtensions.indexOf(ext)\n        if (ind < 0) return\n        this._objectExtensions.splice(ind, 1)\n        // todo - extensions are not removed from objects at the moment, so they can be reused later\n        // for (const obj of this._objects) {\n        //     if (obj.objectExtensions && obj.objectExtensions.includes(ext)) {\n        //         const ind1 = obj.objectExtensions.indexOf(ext)\n        //         if (ind1 >= 0) obj.objectExtensions.splice(ind1, 1)\n        //     }\n        // }\n    }\n\n    private _rootChanged = (ev: Event<'parentRootChanged', IObject3D>) => {\n        if (!ev.target || !this._root) return\n        const parent = ev.target.parentRoot\n        let inRoot = false\n        if (parent === this._root) inRoot = true\n        else {\n            ev.target.traverseAncestors(a => {\n                if (a === this._root) inRoot = true\n            })\n        }\n        if (inRoot) {\n            this.registerObject(ev.target)\n        } else {\n            this.unregisterObject(ev.target)\n        }\n    }\n\n    // private _objAdded = (ev: Event<'added', IObject3D>) => {\n    //     if (!ev.target) return\n    //     let inRoot = false\n    //     ev.target.traverseAncestors(a => {\n    //         if (a === this._root) inRoot = true\n    //     })\n    //     if (!inRoot) return\n    //     this.registerObject(ev.target)\n    // }\n\n    private _materialChanged = (ev: Event2<'materialChanged', IObject3DEventMap, IObject3D>) => {\n        if (!ev.target) return\n        const obj = ev.target\n\n        const oldMaterials = ev.oldMaterial\n        if (oldMaterials) {\n            if (Array.isArray(oldMaterials)) {\n                this._unregisterMaterials(oldMaterials, obj)\n            } else {\n                this._unregisterMaterial(oldMaterials, obj)\n            }\n        }\n\n        this._registerMaterials(obj.materials, obj)\n    }\n\n    private _geometryChanged = (ev: Event2<'geometryChanged', IObject3DEventMap, IObject3D>) => {\n        if (!ev.target) return\n        const obj = ev.target\n\n        const oldGeometry = ev.oldGeometry\n        if (oldGeometry) this._unregisterGeometry(oldGeometry, obj)\n\n        this._registerGeometry(obj.geometry, obj)\n    }\n\n    // region materials\n\n    private _registerMaterials(mat: IMaterial[]|undefined, mesh: IObject3D) {\n        return mat && mat.forEach(m => this._registerMaterial(m, mesh))\n    }\n\n    private _unregisterMaterials(mat: IMaterial[]|undefined, mesh: IObject3D) {\n        return mat && mat.forEach(m => this._unregisterMaterial(m, mesh))\n    }\n\n    private _registerMaterial(mat: IMaterial, mesh: IObject3D) {\n        if (!mat || !mat.isMaterial || !mesh || !mat.uuid) return\n        if (!mat.assetType) {\n            iMaterialCommons.upgradeMaterial.call(mat)\n        }\n        let meshes = mat.appliedMeshes\n        if (!meshes) {\n            meshes = new Set<IObject3D>()\n            mat.appliedMeshes = meshes\n        }\n        const existing = this.getMaterial(mat.uuid)\n        if (existing) {\n            if (mat !== existing) {\n                console.warn('Object3DManager - Material with the same uuid already registered', mat, existing)\n                safeSetProperty(mat, 'uuid', generateUUID(), true, true)\n            }\n        }\n        const isNewMaterial = !this._materials.has(mat.uuid)\n        meshes.add(mesh)\n        this._materials.set(mat.uuid, mat)\n\n        // Add texturesChanged event listener for new materials\n        if (isNewMaterial) {\n            mat.addEventListener('texturesChanged', this._texturesChanged)\n        }\n\n        const maps: Map<string, ITexture> = /* mat._mapRefs || */iMaterialCommons.getMapsForMaterial.call(mat)\n        if (maps) for (const tex of maps.values()) {\n            this._registerTexture(tex, mat)\n        }\n\n        if (isNewMaterial) {\n            this.dispatchEvent({type: 'materialAdd', material: mat})\n            mat.dispatchEvent({type: '__register' as any})\n        }\n    }\n\n    private _unregisterMaterial(mat: IMaterial, mesh: IObject3D) {\n        if (!mat || !mesh || !mesh.uuid) return\n        const meshes = mat.appliedMeshes\n        if (!meshes) return\n        meshes.delete(mesh)\n        const existing = this.getMaterial(mat.uuid)\n        if (existing && mat !== existing) {\n            console.error('Object3DManager - Material to unregister is not the same as the registered material', mat, existing)\n            return\n        }\n\n        if (meshes.size === 0 && existing) {\n            this._materials.delete(mat.uuid)\n\n            // Remove texturesChanged event listener when material is no longer used\n            mat.removeEventListener('texturesChanged', this._texturesChanged)\n\n            const maps: Map<string, ITexture> = /* mat._mapRefs || */iMaterialCommons.getMapsForMaterial.call(mat)\n            if (maps) for (const tex of maps.values()) {\n                this._unregisterTexture(tex, mat)\n            }\n\n            this.dispatchEvent({type: 'materialRemove', material: mat})\n\n            if (this.autoDisposeMaterials) {\n                mat.dispose(false)\n            }\n            mat.dispatchEvent({type: '__unregister' as any})\n        }\n    }\n\n    private _texturesChanged = (ev: Event2<'texturesChanged', IMaterialEventMap, IMaterial> | Event2<'texturesChanged', IObject3DEventMap, IObject3D>) => {\n        if (!ev.target) return\n        // todo check for changeKey to avoid looping through all textures?\n        const material = ev.target\n\n        const removedTextures = ev.removedTextures\n        if (removedTextures) for (const tex of removedTextures) {\n            this._unregisterTexture(tex, material)\n        }\n\n        const addedTextures = ev.textures // using textures instead of addedTextures here\n        if (addedTextures) for (const tex of addedTextures) {\n            this._registerTexture(tex, material)\n        }\n    }\n    private _textureChanged = (ev: {\n        target: IObject3D|IMaterial,\n        oldTexture: ITexture|null\n        texture: ITexture|null\n    }) => {\n        if (!ev.target) return\n        if (ev.oldTexture) this._unregisterTexture(ev.oldTexture, ev.target)\n        if (ev.texture) this._registerTexture(ev.texture, ev.target)\n    }\n\n    // endregion\n\n    // region geometry\n\n    private _registerGeometry(geom: IGeometry|undefined, mesh: IObject3D) {\n        if (!geom || !geom.isBufferGeometry || !mesh || !mesh.uuid) return\n        if (!geom.assetType) {\n            iGeometryCommons.upgradeGeometry.call(geom)\n        }\n        let meshes = geom.appliedMeshes\n        if (!meshes) {\n            meshes = new Set<IObject3D>()\n            geom.appliedMeshes = meshes\n        }\n        const existing = this.getGeometry(geom.uuid)\n        if (existing) {\n            if (geom !== existing) {\n                console.warn('Object3DManager - Geometry with the same uuid already registered', geom, existing)\n                safeSetProperty(geom, 'uuid', generateUUID(), true, true)\n            }\n        }\n        const isNewGeometry = !this._geometries.has(geom.uuid)\n        meshes.add(mesh)\n        this._geometries.set(geom.uuid, geom)\n\n        if (isNewGeometry) {\n            this.dispatchEvent({type: 'geometryAdd', geometry: geom})\n            geom.dispatchEvent({type: '__register' as any})\n        }\n    }\n\n    private _unregisterGeometry(geom: IGeometry|undefined, mesh: IObject3D) {\n        if (!geom || !mesh || !mesh.uuid) return\n        const meshes = geom.appliedMeshes\n        if (!meshes) return\n        meshes.delete(mesh)\n        const existing = this.getGeometry(geom.uuid)\n        if (existing && geom !== existing) {\n            console.error('Object3DManager - Geometry to unregister is not the same as the registered geometry', geom, existing)\n        }\n\n        if (meshes.size === 0 && this._geometries.has(geom.uuid)) {\n            this._geometries.delete(geom.uuid)\n\n            this.dispatchEvent({type: 'geometryRemove', geometry: geom})\n\n            if (this.autoDisposeGeometries)\n                geom.dispose(false)\n            geom.dispatchEvent({type: '__unregister' as any})\n        }\n    }\n\n    // endregion\n\n    // region textures\n\n    private _registerTexture(tex: ITexture|undefined, obj: IObject3D | IMaterial) {\n        if (!tex || !tex.isTexture || !obj || !obj.uuid) return\n        if (!tex.assetType) upgradeTexture.call(tex)\n        let objects = tex.appliedObjects\n        if (!objects) {\n            objects = new Set<IObject3D|IMaterial>()\n            tex.appliedObjects = objects\n        }\n        const existing = this.getTexture(tex.uuid)\n        if (existing) {\n            if (tex !== existing) {\n                console.warn('Object3DManager - Texture with the same uuid already registered', tex, existing)\n                safeSetProperty(tex, 'uuid', generateUUID(), true, true)\n            }\n        }\n        const isNewTexture = !this._textures.has(tex.uuid)\n        objects.add(obj)\n        this._textures.set(tex.uuid, tex)\n        if (tex.isVideoTexture) this._registerVideo(tex as VideoTexture & ITexture)\n\n        if (isNewTexture) {\n            this.dispatchEvent({type: 'textureAdd', texture: tex})\n            tex.dispatchEvent({type: '__register' as any})\n        }\n    }\n\n    private _unregisterTexture(tex: ITexture|undefined, obj: IObject3D | IMaterial) {\n        if (!tex || !obj || !obj.uuid) return\n        const objects = tex.appliedObjects\n        if (!objects) return\n        objects.delete(obj)\n\n        const existing = this.getTexture(tex.uuid)\n        if (existing && tex !== existing) {\n            console.error('Object3DManager - Texture to unregister is not the same as the registered texture', tex, existing)\n            return\n        }\n\n        if (objects.size === 0 && this._textures.has(tex.uuid)) {\n            this._textures.delete(tex.uuid)\n            if (tex.isVideoTexture) this._videos.delete(tex.uuid)\n\n            this.dispatchEvent({type: 'textureRemove', texture: tex})\n\n            if (tex.userData?.disposeOnIdle !== false && this.autoDisposeTextures && !tex.isRenderTargetTexture && tex.dispose)\n                tex.dispose()\n\n            tex.dispatchEvent({type: '__unregister' as any})\n\n            if (tex.isVideoTexture) {\n                const elem = tex.image as HTMLVideoElement\n                if (elem) {\n                    // elem.pause() // stop the video, todo required?\n                }\n                this.dispatchEvent({type: 'videoRemove', video: tex as VideoTexture & ITexture})\n            }\n        }\n    }\n\n    private _registerVideo(tex: VideoTexture & ITexture) {\n        this._videos.set(tex.uuid, tex)\n        const elem = tex.image as HTMLVideoElement\n        elem.preload = 'auto'\n        elem.autoplay = true\n        // elem.play().then(() => {\n        //     console.log('video started playing', elem)\n        //     elem.pause()\n        // })\n        elem.loop = true\n        elem.muted = true // to avoid autoplay issues in browsers\n        this.dispatchEvent({type: 'videoAdd', video: tex})\n    }\n\n    // endregion textures\n\n    // region utils\n\n    findObject(nameOrUuid: string): IObject3D|undefined {\n        if (!nameOrUuid) return undefined\n        const obj = this.getObject(nameOrUuid)\n        if (obj) return obj\n        const obj1 = this.findObjectsByName(nameOrUuid)\n        if (obj1.length > 1) {\n            console.warn('Multiple objects found with name:', nameOrUuid, obj1)\n            return undefined\n        }\n        return obj1[0]\n    }\n    findObjectsByName(name: string): IObject3D[] {\n        const objs: IObject3D[] = []\n        this._objects.forEach(o=>{\n            if (o.name === name) {\n                objs.push(o)\n            }\n        })\n        return objs\n    }\n    findMaterial(nameOrUuid: string): IMaterial|undefined {\n        if (!nameOrUuid) return undefined\n        const mat = this.getMaterial(nameOrUuid)\n        if (mat) return mat\n        const mats = this.findMaterialsByName(nameOrUuid)\n        if (mats.length > 1) {\n            console.warn('Multiple materials found with name:', nameOrUuid, mats)\n            return undefined\n        }\n        return mats[0]\n    }\n    findMaterialsByName(name: string): IMaterial[] {\n        const mats: IMaterial[] = []\n        this._materials.forEach(m=>{\n            if (m.name === name) {\n                mats.push(m)\n            }\n        })\n        return mats\n    }\n\n    // endregion utils\n\n    dispose() {\n        const objects = [...this._objects.values()]\n        for (const o of objects) {\n            this.unregisterObject(o)\n            o.removeEventListener('parentRootChanged', this._rootChanged)\n            // o.removeEventListener('added', this._objAdded)\n        }\n        this._objectExtensions = []\n        this._objects.clear() // todo should this dispatch objectRemove events?\n        this._materials.clear() // todo should this dispatch materialRemove events?\n        this._geometries.clear() // todo should this dispatch geometryRemove events?\n        // this._root = undefined\n        this.dispatchEvent({type: 'dispose'})\n    }\n\n    static readonly MaterialTextureProperties: Set<string> = materialTextureProperties\n    // todo add from plugins like custom bump map etc.\n    static readonly MaterialTexturePropertiesUserData: Set<string> = materialTexturePropertiesUserData\n\n    static readonly SceneTextureProperties: Set<string> = sceneTextureProperties\n    static readonly Object3DTextureProperties: Set<string> = object3DTextureProperties\n\n    static {\n        new Set([\n            ...UnlitMaterial.MapProperties,\n            ...UnlitLineMaterial.MapProperties,\n            ...PhysicalMaterial.MapProperties,\n            ...LegacyPhongMaterial.MapProperties,\n        ]).forEach(v=>Object3DManager.MaterialTextureProperties.add(v))\n    }\n\n    // region getters\n\n    getObjects() {\n        return [...this._objects.values()]\n    }\n    getObject(uuid: string) {\n        return this._objects.get(uuid)\n    }\n    getObjectExtensions() {\n        return [...this._objectExtensions]\n    }\n    getMaterials() {\n        return [...this._materials.values()]\n    }\n    getMaterial(uuid: string) {\n        return this._materials.get(uuid)\n    }\n    getGeometries() {\n        return [...this._geometries.values()]\n    }\n    getGeometry(uuid: string) {\n        return this._geometries.get(uuid)\n    }\n    getTextures() {\n        return [...this._textures.values()]\n    }\n    getTexture(uuid: string) {\n        return this._textures.get(uuid)\n    }\n    getVideos() {\n        return [...this._videos.values()]\n    }\n    getVideo(uuid: string) {\n        return this._videos.get(uuid)\n    }\n    getLights() {\n        return [...this._lights.values()]\n    }\n    getLight(uuid: string) {\n        return this._lights.get(uuid)\n    }\n\n    // endregion getters\n}\n\n// add _playid to VideoTexture types\ndeclare module 'three' {\n    interface VideoTexture {\n        // used to avoid playing the video multiple times when the currentTime is set\n        // and the video is already playing. this is used in Object3DManager to control video playback\n        // based on timeline events.\n        _playid?: number\n    }\n}\n","import {\n    AddEquation,\n    Color,\n    ColorSpace,\n    ConstantAlphaFactor,\n    CustomBlending,\n    FloatType,\n    HalfFloatType,\n    IUniform,\n    NoBlending,\n    NoColorSpace,\n    NormalBlending,\n    NoToneMapping,\n    OneMinusConstantAlphaFactor,\n    PCFShadowMap,\n    RenderTargetOptions,\n    ShaderChunk,\n    ShaderLib,\n    ShadowMapType,\n    Vector2,\n    Vector4,\n    WebGLRenderer,\n    WebGLRenderTarget,\n    WebGLShadowMap,\n} from 'three'\nimport {EffectComposer2, IPassID, IPipelinePass, sortPasses} from '../postprocessing'\nimport {IRenderTarget} from './RenderTarget'\nimport {RenderTargetManager} from './RenderTargetManager'\nimport {IShaderPropertiesUpdater} from '../materials'\nimport {\n    IRenderManager,\n    type IRenderManagerOptions,\n    IRenderManagerUpdateEvent,\n    IScene,\n    ITexture,\n    IWebGLRenderer,\n    upgradeWebGLRenderer,\n} from '../core'\nimport {\n    base64ToArrayBuffer,\n    canvasFlipY,\n    Class,\n    getOrCall,\n    onChange2,\n    serializable,\n    serialize,\n} from 'ts-browser-helpers'\nimport {\n    uiButton,\n    uiConfig,\n    uiDropdown,\n    uiFolderContainer,\n    uiMonitor,\n    UiObjectConfig,\n    uiSlider,\n    uiToggle,\n} from 'uiconfig.js'\nimport {bindToValue, generateUUID, textureDataToImageData} from '../three'\nimport {BlobExt, EXRExporter2} from '../assetmanager'\nimport {IRenderManagerEventMap, RendererBlitOptions} from '../core/IRenderer'\n\n@serializable('RenderManager')\n@uiFolderContainer('Render Manager')\nexport class RenderManager<TE extends IRenderManagerEventMap = IRenderManagerEventMap> extends RenderTargetManager<IRenderManagerEventMap&TE> implements IShaderPropertiesUpdater, IRenderManager<IRenderManagerEventMap&TE> {\n    private readonly _isWebGL2: boolean\n    private readonly _composer: EffectComposer2\n    private readonly _context: WebGLRenderingContext\n    @uiMonitor('Render Size')\n    private readonly _renderSize = new Vector2(512, 512) // this is updated automatically.\n    protected readonly _renderer: IWebGLRenderer<this>\n    private _renderScale = 1.\n    @uiSlider('Render Scale', [0.1, 8], 0.05) // keep here in code so its at the top in the UI\n    get renderScale(): number {\n        return this._renderScale\n    }\n    set renderScale(value: number) {\n        if (value !== this._renderScale) {\n            this._renderScale = value\n            this.setSize(undefined, undefined, true)\n        }\n    }\n\n    @serialize()\n    @uiDropdown('Shadow Map Type', ['BasicShadowMap', 'PCFShadowMap', 'PCFSoftShadowMap', 'VSMShadowMap'].map((v, i) => ({label: v, value: i})), {tags: ['advanced']})\n    @bindToValue({obj: 'shadowMap', key: 'type', onChange: RenderManager.prototype._shadowMapTypeChanged})\n        shadowMapType: ShadowMapType\n\n    @bindToValue({obj: 'renderer', key: 'shadowMap'})\n        shadowMap: WebGLShadowMap\n\n    private _shadowMapTypeChanged() {\n        this.resetShadows()\n        this.reset()\n    }\n\n    @uiConfig(undefined, {label: 'Passes', tags: ['advanced'], order: 1000})\n    private _passes: IPipelinePass[] = []\n    private _pipeline: IPassID[] = []\n    private _passesNeedsUpdate = true\n    private _frameCount = 0\n    private _lastTime = 0\n    private _totalFrameCount = 0\n\n    public static readonly POWER_PREFERENCE: WebGLPowerPreference = 'high-performance'\n\n    get renderer() {return this._renderer}\n\n    /**\n     * Use total frame count, if this is set to true, then frameCount won't be reset when the viewer is set to dirty.\n     * Which will generate different random numbers for each frame during postprocessing steps. With TAA set properly, this will give a smoother result.\n     */\n    @uiToggle() @serialize() stableNoise = false\n\n    public frameWaitTime = 0 // time to wait before next frame // used by canvas recorder //todo/\n\n    protected _dirty = true\n\n    /**\n     * Set autoBuildPipeline = false to be able to set the pipeline manually.\n     */\n    @onChange2(RenderManager.prototype.rebuildPipeline)\n    public autoBuildPipeline = true\n\n    @uiButton('Rebuild Pipeline', {sendArgs: false, tags: ['advanced']})\n    rebuildPipeline(setDirty = true): void {\n        this._passesNeedsUpdate = true\n        if (setDirty) {\n            this._updated({change: 'rebuild'})\n            this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n        }\n    }\n\n    /**\n     * Regenerates the render pipeline by resolving dependencies and sorting the passes.\n     * This is called automatically when the passes are changed.\n     */\n    private _refreshPipeline(): IPassID[] {\n        if (!this.autoBuildPipeline) return this._pipeline\n        const ps = this._passes\n        try {\n            this._pipeline = sortPasses(ps)\n        } catch (e) {\n            console.error('RenderManager: Unable to sort rendering passes', e)\n        }\n        return this._pipeline\n    }\n\n    animationLoop(time: number, frame?:XRFrame) {\n        const deltaTime = time - this._lastTime\n        this._lastTime = time\n        this.frameWaitTime -= deltaTime\n        if (this.frameWaitTime > 0) return\n        this.frameWaitTime = 0\n        this.dispatchEvent({type: 'animationLoop', deltaTime, time, renderer: this._renderer, xrFrame: frame})\n    }\n\n    constructor({canvas, alpha = true, renderScale = 1, powerPreference, targetOptions}:IRenderManagerOptions) {\n        super()\n        this.animationLoop = this.animationLoop.bind(this)\n        // this._xrPreAnimationLoop = this._xrPreAnimationLoop.bind(this)\n        this._renderSize = new Vector2(canvas.clientWidth, canvas.clientHeight)\n        this._renderScale = renderScale\n        this._renderer = this._initWebGLRenderer(canvas, alpha, targetOptions?.stencilBuffer ?? false, powerPreference)\n        this._context = this._renderer.getContext()\n        this._isWebGL2 = this._renderer.capabilities.isWebGL2\n        if (!this._isWebGL2) console.error('RenderManager: WebGL 1 is not officially supported anymore. Some features may not work.')\n        this.resetShadows()\n\n        const composerTarget = this.createTarget<WebGLRenderTarget>(targetOptions, false)\n        composerTarget.texture.name = 'EffectComposer.rt1'\n        this._composer = new EffectComposer2(this._renderer, composerTarget)\n\n        // if (animationLoop) this.addEventListener('animationLoop', animationLoop) // todo: from viewer\n    }\n\n    protected _initWebGLRenderer(canvas: HTMLCanvasElement, alpha: boolean, stencil: boolean, powerPreference?: WebGLPowerPreference): IWebGLRenderer<this> {\n        const renderer = new WebGLRenderer({\n            canvas,\n            antialias: false,\n            alpha,\n            premultipliedAlpha: false, // todo: see this, maybe use this with rgbm mode.\n            preserveDrawingBuffer: true,\n            powerPreference: powerPreference ?? RenderManager.POWER_PREFERENCE,\n            stencil,\n        })\n        // renderer.info.autoReset = false // Not supported by ExtendedRenderPass\n\n        // renderer.useLegacyLights = false\n        renderer.setAnimationLoop(this.animationLoop)\n        renderer.onContextLost = (event: WebGLContextEvent) => {\n            this.dispatchEvent({type: 'contextLost', event})\n        }\n        renderer.onContextRestore = () => {\n            // console.log('restored')\n            this.dispatchEvent({type: 'contextRestored'})\n        }\n\n        renderer.setSize(this._renderSize.width, this._renderSize.height, false)\n        renderer.setPixelRatio(this._renderScale)\n\n        renderer.toneMapping = NoToneMapping\n        renderer.toneMappingExposure = 1\n        renderer.outputColorSpace = NoColorSpace // or SRGBColorSpace\n\n        renderer.shadowMap.enabled = true\n        renderer.shadowMap.type = PCFShadowMap // dont use VSM if need ground: https://github.com/mrdoob/three.js/issues/17473\n        // renderer.shadowMap.type = BasicShadowMap // use?  THREE.PCFShadowMap. dont use VSM if need ground: https://github.com/mrdoob/three.js/issues/17473\n        renderer.shadowMap.autoUpdate = false\n\n        return upgradeWebGLRenderer.call(renderer, this)\n    }\n\n    setSize(width?: number, height?: number, force = false) {\n        if (!force &&\n            (width ? Math.abs(width - this._renderSize.width) : 0) +\n            (height ? Math.abs(height - this._renderSize.height) : 0) < 0.1\n        ) return\n\n        if (width) this._renderSize.width = width\n        if (height) this._renderSize.height = height\n        if (!(this.webglRenderer.xr.enabled && this.webglRenderer.xr.isPresenting)) {\n            this._renderer.setSize(this._renderSize.width, this._renderSize.height, false)\n            this._renderer.setPixelRatio(this._renderScale)\n        }\n        this._composer.setPixelRatio(this._renderScale, false)\n        this._composer.setSize(this._renderSize.width, this._renderSize.height)\n\n        this.resizeTrackedTargets()\n\n        // console.log('setSize', {...this._renderSize}, this._trackedTargets.length)\n\n        this.dispatchEvent({type: 'resize'})\n        this._updated({change: 'size', data: this._renderSize.toArray()})\n        this.reset()\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 0)\n\n    }\n\n    // render(scene: RenderScene): void {\n    //     const camera = scene.activeCamera\n    //     const activeScene = scene.activeScene\n    //     if(!camera) return\n    //     this._renderer.render(scene.threeScene, camera)\n    //     // todo gizmos\n    // }\n\n    /**\n     * Default value for renderToScreen in {@link render}\n     */\n    defaultRenderToScreen = true\n\n    render(scene: IScene, renderToScreen?: boolean): void {\n        if (this._passesNeedsUpdate) {\n            this._refreshPipeline()\n            this.refreshPasses()\n        }\n        for (const pass of this._passes) {\n            if (pass.enabled && pass.beforeRender) pass.beforeRender(scene, scene.renderCamera, this)\n        }\n        this._composer.renderToScreen = renderToScreen ?? this.defaultRenderToScreen\n        this.dispatchEvent({type: 'preRender', scene, renderToScreen: this._composer.renderToScreen})\n        this._composer.render()\n        this.dispatchEvent({type: 'postRender', scene, renderToScreen: this._composer.renderToScreen})\n        this._composer.renderToScreen = true\n        if (renderToScreen) {\n            this.incRenderToScreen()\n        }\n        this._dirty = false\n    }\n\n    // todo better name\n    incRenderToScreen() {\n        this._frameCount += 1\n        this._totalFrameCount += 1\n    }\n\n    onPostFrame = () => {\n        for (const pass of this._passes) {\n            if (pass.enabled && pass.onPostFrame) pass.onPostFrame?.(this)\n        }\n    }\n\n    get needsRender(): boolean {\n        if (this.renderSize.x < 1 || this.renderSize.y < 1) return false\n        this._dirty = this._dirty || this._passes.findIndex(value => getOrCall(value.dirty)) >= 0 // todo: check for enabled passes only.\n        return this._dirty\n    }\n\n    setDirty(reset = false): void {\n        this._dirty = true\n        if (reset) this.reset()\n        // do NOT call _updated from here.\n    }\n\n    reset(): void {\n        this._frameCount = 0\n        this._dirty = true\n        // do NOT call _updated from here.\n    }\n\n    resetShadows(): void {\n        this._renderer.shadowMap.needsUpdate = true\n    }\n\n    refreshPasses(): void {\n        if (!this._passesNeedsUpdate) return\n        this._passesNeedsUpdate = false\n        const p = []\n        for (const passId of this._pipeline) {\n            const a = this._passes.find(value => value.passId === passId)\n            if (!a) {\n                console.warn('Unable to find pass: ', passId)\n                continue\n            }\n            p.push(a)\n        }\n        [...this._composer.passes].forEach(p1=>this._composer.removePass(p1))\n        p.forEach(p1=>this._composer.addPass(p1))\n        this._updated({change: 'passRefresh'})\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    }\n\n    dispose(clear = true): void {\n        super.dispose(clear)\n        this._renderer.dispose()\n    }\n\n    updateShaderProperties(material: {defines: Record<string, string|number|undefined>, uniforms: {[name: string]: IUniform}}): this {\n        if (material.uniforms.currentFrameCount) material.uniforms.currentFrameCount.value = this.frameCount\n        if (!this.stableNoise) {\n            if (material.uniforms.frameCount) material.uniforms.frameCount.value = this._totalFrameCount\n            else console.warn('RenderManager: no uniform: frameCount')\n        } else {\n            if (material.uniforms.frameCount) material.uniforms.frameCount.value = this.frameCount\n            else console.warn('RenderManager: no uniform: frameCount')\n        }\n        return this\n    }\n\n    // region Passes\n\n    registerPass(pass: IPipelinePass, replaceId = true): void {\n        if (replaceId) {\n            for (const pass1 of [...this._passes]) {\n                if (pass.passId === pass1.passId) this.unregisterPass(pass1)\n            }\n        }\n        this._passes.push(pass)\n        pass.onRegister?.(this)\n        this.rebuildPipeline(false)\n        this._updated({change: 'registerPass', pass})\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    }\n\n    unregisterPass(pass: IPipelinePass): void {\n        const i = this._passes.indexOf(pass)\n        if (i >= 0) {\n            pass.onUnregister?.(this)\n            this._passes.splice(i, 1)\n            this.rebuildPipeline(false)\n            this._updated({change: 'unregisterPass', pass})\n            this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n        }\n    }\n\n    // endregion\n\n    // region Getters and Setters\n\n    get frameCount(): number {\n        return this._frameCount\n    }\n    get totalFrameCount(): number {\n        return this._totalFrameCount\n    }\n    resetTotalFrameCount(): void {\n        this._totalFrameCount = 0\n    }\n    set pipeline(value: IPassID[]) {\n        this._pipeline = value\n        if (this.autoBuildPipeline) {\n            console.warn('RenderManager: pipeline changed, but autoBuildPipeline is true. This will not have any effect.')\n        }\n        this.rebuildPipeline()\n    }\n    get pipeline(): IPassID[] {\n        return this._pipeline\n    }\n    get composer(): EffectComposer2 {\n        return this._composer\n    }\n    get passes(): IPipelinePass[] {\n        return this._passes\n    }\n    get isWebGL2(): boolean {\n        return this._isWebGL2\n    }\n    get composerTarget(): IRenderTarget {\n        return this._composer.renderTarget1\n    }\n    get composerTarget2(): IRenderTarget {\n        return this._composer.renderTarget2\n    }\n\n    /**\n     * The size set in the three.js renderer.\n     * Final size is renderSize * renderScale\n     */\n    get renderSize(): Vector2 {\n        return this._renderSize\n    }\n\n    get context(): WebGLRenderingContext {\n        return this._context\n    }\n\n    /**\n     * Same as {@link renderer}\n     */\n    get webglRenderer(): WebGLRenderer {\n        return this._renderer\n    }\n\n    /**\n     * @deprecated will be removed in the future\n     */\n    @serialize()\n    get useLegacyLights(): boolean {\n        return this._renderer.useLegacyLights\n    }\n    set useLegacyLights(v: boolean) {\n        this._renderer.useLegacyLights = v\n        this._updated({change: 'useLegacyLights', data: v})\n        this.resetShadows()\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    }\n\n    get clock() {\n        return this._composer.clock\n    }\n\n    // endregion\n\n    // region Utils\n\n    /**\n     * blit - blits a texture to the screen or another render target.\n     * @param destination - destination target, or screen if undefined or null\n     * @param source - source Texture\n     * @param viewport - viewport and scissor\n     * @param material - override material\n     * @param clear - clear before blit\n     * @param respectColorSpace - does color space conversion when reading and writing to the target\n     * @param blending - Note - Set to NormalBlending if transparent is set to false\n     * @param transparent\n     * @param opacity - opacity of the material, if not set, uses the material's opacity\n     * @param blendAlpha - custom blending factor, if set, overrides blending. The material will use CustomBlending with ConstantAlphaFactor and OneMinusConstantAlphaFactor, useful to blend between textures.\n     */\n    blit(destination: IRenderTarget|undefined|null, {source, viewport, material, clear = true, respectColorSpace = false, blending = NoBlending, transparent = true, opacity, blendAlpha}: RendererBlitOptions = {}): void {\n        const copyPass = !respectColorSpace ? this._composer.copyPass : this._composer.copyPass2\n        const {renderToScreen, material: oldMaterial, uniforms: oldUniforms, clear: oldClear} = copyPass\n        if (material) {\n            copyPass.material = material\n        }\n        const oldTransparent = copyPass.material.transparent\n        const oldViewport = !destination ? this._renderer.getViewport(new Vector4()) : destination.viewport.clone()\n        const oldScissor = !destination ? this._renderer.getScissor(new Vector4()) : destination.scissor.clone()\n        const oldScissorTest = !destination ? this._renderer.getScissorTest() : destination.scissorTest\n        const oldAutoClear = this._renderer.autoClear\n        const oldTarget = this._renderer.getRenderTarget()\n        const oldBlending = copyPass.material.blending\n        const oldOpacity = copyPass.material.uniforms.opacity?.value ?? 1\n        const oldBlendAlpha = copyPass.material.blendAlpha\n        const oldBlendSrc = copyPass.material.blendSrc\n        const oldBlendDst = copyPass.material.blendDst\n        const oldBlendEquation = copyPass.material.blendEquation\n\n        if (viewport) {\n            if (!destination) {\n                this._renderer.setViewport(viewport)\n                this._renderer.setScissor(viewport)\n                this._renderer.setScissorTest(true)\n            } else {\n                destination.viewport.copy(viewport)\n                destination.scissor.copy(viewport)\n                destination.scissorTest = true\n            }\n        }\n        this._renderer.autoClear = false\n        copyPass.material.blending = !transparent ? NormalBlending : blending\n        copyPass.uniforms = copyPass.material.uniforms\n        copyPass.renderToScreen = false\n        copyPass.clear = clear\n        copyPass.material.transparent = transparent\n        copyPass.material.needsUpdate = true\n        if (copyPass.material.uniforms.opacity && opacity !== undefined) {\n            copyPass.material.uniforms.opacity.value = opacity\n        }\n\n        if (blendAlpha !== undefined) {\n            // blendAlpha is custom blending factor\n            copyPass.material.blending = CustomBlending\n            copyPass.material.blendSrc = ConstantAlphaFactor\n            copyPass.material.blendDst = OneMinusConstantAlphaFactor\n            copyPass.material.blendEquation = AddEquation\n            copyPass.material.blendAlpha = blendAlpha\n        }\n\n        this._renderer.renderWithModes({\n            sceneRender: true,\n            opaqueRender: true,\n            shadowMapRender: false,\n            backgroundRender: false,\n            transparentRender: true,\n            transmissionRender: false,\n        }, ()=>{\n            copyPass.render(this._renderer, <WebGLRenderTarget>destination || null, {texture: source} as any, 0, false)\n        })\n        if (copyPass.material.uniforms.opacity && opacity !== undefined) {\n            copyPass.material.uniforms.opacity.value = oldOpacity\n        }\n        copyPass.renderToScreen = renderToScreen\n        copyPass.clear = oldClear\n        copyPass.material.blending = oldBlending\n        copyPass.material.blendSrc = oldBlendSrc\n        copyPass.material.blendDst = oldBlendDst\n        copyPass.material.blendEquation = oldBlendEquation\n        copyPass.material.blendAlpha = oldBlendAlpha\n        copyPass.material.transparent = oldTransparent\n        copyPass.material = oldMaterial\n        copyPass.uniforms = oldUniforms\n        this._renderer.autoClear = oldAutoClear\n        if (viewport) {\n            if (!destination) {\n                this._renderer.setViewport(oldViewport)\n                this._renderer.setScissor(oldScissor)\n                this._renderer.setScissorTest(oldScissorTest)\n            } else {\n                destination.viewport.copy(oldViewport)\n                destination.scissor.copy(oldScissor)\n                destination.scissorTest = oldScissorTest\n            }\n        }\n        this._renderer.setRenderTarget(oldTarget) // todo: active cubeface etc\n    }\n\n    clearColor({r, g, b, a, target, depth = true, stencil = true, viewport}:\n                   {r?: number, g?: number, b?: number, a?: number, target?: IRenderTarget, depth?: boolean, stencil?: boolean, viewport?: Vector4}): void {\n        const color = this._renderer.getClearColor(new Color())\n        const alpha = this._renderer.getClearAlpha()\n        this._renderer.setClearColor(new Color(r ?? color.r, g ?? color.g, b ?? color.b), a ?? alpha)\n        const lastTarget = this._renderer.getRenderTarget()\n        const activeCubeFace = this._renderer.getActiveCubeFace()\n        const activeMipLevel = this._renderer.getActiveMipmapLevel()\n\n        const oldViewport = !target ? this._renderer.getViewport(new Vector4()) : target.viewport.clone()\n        const oldScissor = !target ? this._renderer.getScissor(new Vector4()) : target.scissor.clone()\n        const oldScissorTest = !target ? this._renderer.getScissorTest() : target.scissorTest\n        if (viewport) {\n            if (!target) {\n                this._renderer.setViewport(viewport)\n                this._renderer.setScissor(viewport)\n                this._renderer.setScissorTest(true)\n            } else {\n                target.viewport.copy(viewport)\n                target.scissor.copy(viewport)\n                target.scissorTest = true\n            }\n        }\n\n        this._renderer.setRenderTarget((target as WebGLRenderTarget) ?? null)\n        this._renderer.clear(true, depth, stencil)\n        if (target && typeof target.clear === 'function') {\n            // WebGLCubeRenderTarget\n            target.clear(this._renderer, true, depth, stencil)\n        } else {\n            this._renderer.setRenderTarget((target as any as WebGLRenderTarget) ?? null)\n            this._renderer.clear(true, depth, stencil)\n        }\n\n        if (viewport) {\n            if (!target) {\n                this._renderer.setViewport(oldViewport)\n                this._renderer.setScissor(oldScissor)\n                this._renderer.setScissorTest(oldScissorTest)\n            } else {\n                target.viewport.copy(oldViewport)\n                target.scissor.copy(oldScissor)\n                target.scissorTest = oldScissorTest\n            }\n        }\n\n        this._renderer.setRenderTarget(lastTarget, activeCubeFace, activeMipLevel)\n        this._renderer.setClearColor(color, alpha)\n    }\n\n\n    /**\n     * If target is a `{texture}` / `{textures}` wrapper without framebuffer dimensions,\n     * blits the texture to a temporary render target and calls the callback with it.\n     * Otherwise returns undefined (caller should proceed with the original target).\n     */\n    private _withResolvedTarget<T>(target: WebGLRenderTarget|IRenderTarget|{texture?: ITexture, textures?: ITexture[]}, textureIndex: number, fn: (rt: WebGLRenderTarget) => T): T | undefined {\n        if ((target as WebGLRenderTarget).width && (target as WebGLRenderTarget).height) return undefined\n        const tex = ((target as any).textures?.[textureIndex] ?? (target as any).texture) as ITexture\n        if (!tex) throw new Error('RenderManager: target has no texture')\n        const w = tex.image?.width || tex.source?.data?.width\n        const h = tex.image?.height || tex.source?.data?.height\n        const tempTarget = this.getTempTarget(w && h ? {size: {width: w, height: h}, type: tex.type} : {sizeMultiplier: 1, type: tex.type})\n        this.blit(tempTarget, {source: tex, clear: true})\n        const result = fn(tempTarget as WebGLRenderTarget)\n        this.releaseTempTarget(tempTarget)\n        return result\n    }\n\n    /**\n     * Copies a render target to a new/existing canvas element.\n     * Also supports `{texture}` or `{textures}` wrappers — these are blitted to a temporary render target first.\n     * Note: this will clamp the values to [0, 1] and converts to srgb for float and half-float render targets.\n     * @param target\n     * @param textureIndex - index of the texture to use in the render target (only in case of multiple render target)\n     * @param canvas - optional canvas to render to, if not provided a new canvas will be created.\n     */\n    renderTargetToCanvas(target: WebGLRenderTarget|IRenderTarget|{texture?: ITexture, textures?: ITexture[]}, textureIndex = 0, canvas?: HTMLCanvasElement): HTMLCanvasElement {\n        const resolved = this._withResolvedTarget(target, textureIndex, (rt) => this.renderTargetToCanvas(rt, 0, canvas))\n        if (resolved) return resolved\n\n        canvas = canvas ?? document.createElement('canvas')\n        const texture = ((target as WebGLRenderTarget).textures?.[textureIndex] ?? (target as WebGLRenderTarget).texture) as ITexture\n        canvas.width = (target as WebGLRenderTarget).width\n        canvas.height = (target as WebGLRenderTarget).height\n        const ctx = canvas.getContext('2d')\n        if (!ctx) throw new Error('Unable to get 2d context')\n        const imageData = ctx.createImageData(canvas.width, canvas.height, {colorSpace: ['display-p3', 'srgb'].includes(texture.colorSpace) ? <PredefinedColorSpace>texture.colorSpace : undefined})\n        if (texture.type === HalfFloatType || texture.type === FloatType) {\n            const buffer = this.renderTargetToBuffer(target as any, textureIndex)\n            textureDataToImageData({data: buffer, width: canvas.width, height: canvas.height}, texture.colorSpace, imageData) // this handles converting to srgb\n        } else {\n            // todo: handle rgbm to srgb conversion?\n            this._renderer.readRenderTargetPixels(target as any, 0, 0, canvas.width, canvas.height, imageData.data, undefined, textureIndex)\n        }\n\n        ctx.putImageData(imageData, 0, 0)\n\n        return canvas\n    }\n\n    /**\n     * Converts a render target to a png/jpeg data url string.\n     * Note: this will clamp the values to [0, 1] and converts to srgb for float and half-float render targets.\n     * @param target\n     * @param mimeType\n     * @param quality\n     * @param textureIndex - index of the texture to use in the render target (only in case of multiple render target)\n     */\n    renderTargetToDataUrl(target: WebGLRenderTarget|IRenderTarget|{texture?: ITexture, textures?: ITexture[]}, mimeType = 'image/png', quality = 90, textureIndex = 0): string {\n        const texture = ((target as any).textures?.[textureIndex] ?? (target as any).texture) as ITexture\n        const canvas = this.renderTargetToCanvas(target, textureIndex)\n\n        const string = (texture.flipY ? canvas : canvasFlipY(canvas)).toDataURL(mimeType, quality) // intentionally inverted ternary\n        canvas.remove()\n        return string\n    }\n\n    /**\n     * Rend pixels from a render target into a new Uint8Array|Uint16Array|Float32Array buffer\n     * @param target - render target to read from\n     * @param textureIndex - index of the texture to use in the render target (only in case of multiple render target)\n     */\n    renderTargetToBuffer(target: WebGLRenderTarget, textureIndex = 0): Uint8Array|Uint16Array|Float32Array {\n        const texture = (target.textures?.[textureIndex] ?? target.texture) as ITexture\n        const buffer =\n            texture.type === HalfFloatType ?\n                new Uint16Array(target.width * target.height * 4) :\n                texture.type === FloatType ?\n                    new Float32Array(target.width * target.height * 4) :\n                    new Uint8Array(target.width * target.height * 4)\n        this._renderer.readRenderTargetPixels(target, 0, 0, target.width, target.height, buffer, undefined, textureIndex)\n        return buffer\n    }\n\n    /**\n     * Exports a render target to a blob. The type is automatically picked from exr to png based on the render target.\n     * Also supports `{texture}` or `{textures}` wrappers — these are blitted to a temporary color render target for export.\n     * @param target - render target to export, or a `{texture}` / `{textures}` wrapper\n     * @param mimeType - mime type to use.\n     * If auto (default), then it will be picked based on the render target type.\n     * @param textureIndex - index of the texture to use in the render target (only in case of multiple render target)\n     */\n    exportRenderTarget(target: WebGLRenderTarget | IRenderTarget | {texture?: ITexture, textures?: ITexture[]}, mimeType = 'auto', textureIndex = 0): BlobExt {\n        const resolved = this._withResolvedTarget(target, textureIndex, (rt) => this.exportRenderTarget(rt, mimeType, 0))\n        if (resolved) return resolved\n        const rt = target as WebGLRenderTarget\n        const hdrFormats = ['image/x-exr']\n        const texture = (rt.textures?.[textureIndex] ?? rt.texture) as ITexture\n        let hdr = texture.type === HalfFloatType || texture.type === FloatType\n        if (mimeType === 'auto') {\n            mimeType = hdr ? 'image/x-exr' : 'image/png'\n        }\n        if (!hdrFormats.includes(mimeType)) hdr = false\n        let buffer: ArrayBuffer\n        if (!hdr) {\n            const url = this.renderTargetToDataUrl(rt, mimeType === 'auto' ? undefined : mimeType, 90, textureIndex)\n            buffer = base64ToArrayBuffer(url.split(',')[1]) as ArrayBuffer\n            mimeType = url.split(';')[0].split(':')[1]\n        } else {\n            if (mimeType !== 'image/x-exr') {\n                console.warn('RenderManager: mimeType ', mimeType, ' is not supported for HDR. Using EXR instead')\n                mimeType = 'image/x-exr'\n            }\n            const exporter = new EXRExporter2()\n            buffer = exporter.parse(this._renderer, rt, {textureIndex}).buffer as ArrayBuffer\n        }\n        const b = new Blob([buffer], {type: mimeType}) as BlobExt\n        b.ext = mimeType === 'image/x-exr' ? 'exr' : mimeType.split('/')[1]\n        b.__buffer = buffer\n        return b\n    }\n\n    // endregion\n\n\n    // region Events Dispatch\n\n    uiConfig?: UiObjectConfig\n    private _updated(data?: IRenderManagerUpdateEvent) {\n        this.dispatchEvent({...data, type: 'update'})\n    }\n\n    // endregion\n\n    protected _createTargetClass(clazz: Class<WebGLRenderTarget>, size: number[], options: RenderTargetOptions): IRenderTarget {\n        const processNewTarget = this._processNewTarget\n        const disposeTarget = this.disposeTarget.bind(this)\n        return new class RenderTarget extends clazz implements IRenderTarget {\n            isTemporary?: boolean\n            sizeMultiplier?: number\n            uuid: string\n            readonly assetType = 'renderTarget'\n            name = 'RenderTarget'\n            // texture: ValOrArr<Texture&{_target: IRenderTarget}>\n            declare textures: ITexture[]\n            get texture(): ITexture {\n                return this.textures[0]\n            }\n            set texture(value: ITexture) {\n                this.textures[0] = value\n            }\n\n            constructor(public readonly renderManager: IRenderManager, ...ps: any[]) {\n                super(...ps)\n                this.uuid = generateUUID()\n                const ops = ps[ps.length - 1] as RenderTargetOptions\n                const colorSpace = ops?.colorSpace\n                this._initTexture(colorSpace)\n            }\n\n            private _initTexture(colorSpace?: ColorSpace) {\n                const init = (t: ITexture)=>{\n                    if (colorSpace !== undefined) t.colorSpace = colorSpace\n                    if (!t.userData) t.userData = {}\n                    t._target = this\n                    t.toJSON = () => ({ // todo use readRenderTargetPixels as data url or data buffer.\n                        isRenderTargetTexture: true,\n                    }) // so that it doesn't get serialized\n                }\n                if (Array.isArray(this.textures) && this.textures.length > 1) {\n                    this.textures.forEach(init)\n                } else {\n                    init(this.texture)\n                }\n            }\n\n            setSize(w: number, h: number, depth?: number) {\n                super.setSize(Math.floor(w), Math.floor(h), depth)\n                // console.log('setSize', w, h, depth)\n                return this\n            }\n\n            clone(trackTarget = true): any {\n                if (this.isTemporary) throw 'Cloning temporary render targets not supported' // todo why?\n                if (Array.isArray(this.texture)) throw 'Cloning multiple render targets not supported'\n                // Note: todo: webgl render target.clone messes up the texture, by not copying isRenderTargetTexture prop and maybe some other stuff. So its better to just create a new one\n                // const cloned = super.clone() as IRenderTarget\n                const cloned = new (this.constructor as Class<typeof this>)(this.renderManager)\n                cloned.copy(this as any)\n                cloned._initTexture((Array.isArray(this.texture) ? this.texture[0] : this.texture)?.colorSpace)\n                const tex = cloned.texture\n                if (Array.isArray(tex)) tex.forEach(t => t.isRenderTargetTexture = true)\n                else tex.isRenderTargetTexture = true\n                return processNewTarget(cloned, this.sizeMultiplier || 1, trackTarget)\n            }\n\n            // copy(source: IRenderTarget|RenderTarget): this {\n            //     super.copy(source as any)\n            //     return this\n            // }\n\n            // Note - by default unregister need to be false.\n            dispose(unregister = false) {\n                if (unregister === true) disposeTarget(this, true)\n                else super.dispose()\n            }\n\n            // required for uiconfig.js. see UiConfigMethods.getValue\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            _ui_isPrimitive = true\n\n        }(this, ...size, options)\n    }\n\n    static ShaderChunk = ShaderChunk\n    static ShaderLib = ShaderLib\n\n    /**\n     * @deprecated use renderScale instead\n     */\n    get displayCanvasScaling() {\n        console.error('displayCanvasScaling is deprecated, use renderScale instead')\n        return this.renderScale\n    }\n    /**\n     * @deprecated use renderScale instead\n     */\n    set displayCanvasScaling(value) {\n        console.error('displayCanvasScaling is deprecated, use renderScale instead')\n        this.renderScale = value\n    }\n\n}\n","import {IRenderTarget, RenderManager} from '../rendering'\nimport {HalfFloatType, LinearFilter, NoColorSpace, RGBM16ColorSpace, UnsignedByteType} from 'three'\nimport {IRenderManagerOptions, IScene} from '../core'\nimport {ExtendedRenderPass, ScreenPass, TViewerScreenShader} from '../postprocessing'\nimport {uiFolderContainer, UiObjectConfig} from 'uiconfig.js'\nimport {MaterialExtension} from '../materials'\nimport {onChange3} from 'ts-browser-helpers'\nimport {IRenderManagerEventMap} from '../core/IRenderer'\n\nexport interface ViewerRenderManagerOptions extends IRenderManagerOptions {\n    rgbm?: boolean,\n    msaa?: boolean | number,\n    depthBuffer?: boolean,\n    stencilBuffer?: boolean,\n    zPrepass?: boolean,\n    screenShader?: TViewerScreenShader\n    maxHDRIntensity?: number\n}\n\nexport interface ViewerRenderManagerEventMap extends IRenderManagerEventMap{\n    gbufferUnpackExtensionChanged: {\n        key: string;\n        value: any;\n        oldValue: any;\n        // target: TTarget;\n    }\n}\n\n@uiFolderContainer('Render Manager')\nexport class ViewerRenderManager extends RenderManager<ViewerRenderManagerEventMap> {\n    readonly rgbm: boolean\n    readonly msaa: boolean | number\n    readonly depthBuffer: boolean\n    readonly zPrepass: boolean\n    readonly maxHDRIntensity: number\n    readonly renderPass: ExtendedRenderPass\n    readonly screenPass: ScreenPass\n    declare uiConfig: UiObjectConfig\n\n    static DEFAULT_MSAA_SAMPLES = 4\n\n    constructor({rgbm = true, msaa = false, depthBuffer = true, stencilBuffer = false, ...options}: ViewerRenderManagerOptions) {\n        super({\n            ...options,\n            targetOptions: {\n                samples: 0,\n                // samples: msaa ? typeof msaa !== 'number' ? ViewerRenderManager.DEFAULT_MSAA_SAMPLES : msaa : 0,\n                colorSpace: rgbm ? RGBM16ColorSpace : NoColorSpace,\n                type: rgbm ? UnsignedByteType : HalfFloatType,\n                depthBuffer: depthBuffer,\n                stencilBuffer: stencilBuffer,\n                generateMipmaps: /* msaa ? true : */false, // todo: hack for now, fix blurTransmissionTarget in ExtendedRenderPass\n                minFilter: /* msaa ? LinearMipMapLinearFilter : */LinearFilter, // todo: hack for now, fix blurTransmissionTarget in ExtendedRenderPass\n            },\n        })\n        this.rgbm = rgbm\n        this.msaa = msaa && this.isWebGL2\n        this.depthBuffer = depthBuffer\n        this.zPrepass = options.zPrepass || false\n        this.maxHDRIntensity = options.maxHDRIntensity ?? (rgbm ? 16 : 72)\n\n        let doTransmissionFix = true // const for debugging, todo could be made into a static prop maybe?\n        if (!this._renderer.userData) {\n            doTransmissionFix = false\n            this._renderer.userData = {__isIWebGLRenderer: true}\n        }\n        this._renderer.userData.renderTransmissionPass = !doTransmissionFix // hack. used in WebGLRenderer.js\n\n        this.renderPass = new ExtendedRenderPass(this)\n        this.screenPass = new ScreenPass(options.screenShader || '')\n        this.registerPass(this.renderPass)\n        this.registerPass(this.screenPass)\n    }\n\n    /**\n     * Reference to the gbuffer target, if it exists. This can be set by plugins like {@link DepthBufferPlugin}, {@link GBufferPlugin}\n     */\n    gbufferTarget: IRenderTarget | undefined\n    /**\n     * The extension that can be used to upload and unpack the values in gbuffer target(s), if it exists. This can be set by plugins like {@link DepthBufferPlugin}, {@link GBufferPlugin}\n     * Note: this should not be changed after set by some plugin.\n     */\n    @onChange3(ViewerRenderManager.prototype._gbufferUnpackExtensionChanged)\n        gbufferUnpackExtension: MaterialExtension | undefined\n\n    private _gbufferUnpackExtensionChanged(params: any) {\n        this.dispatchEvent({type: 'gbufferUnpackExtensionChanged', ...params})\n    }\n\n    render(scene: IScene, renderToScreen?: boolean): void {\n        const cbf = this.screenPass.clipBackgroundForce\n        if (this.rgbm) {\n            const val = !scene.background && !scene.backgroundColor\n            if (val !== cbf) this.screenPass.clipBackgroundForce = val\n        }\n        super.render(scene, renderToScreen)\n    }\n}\n","import {now} from 'ts-browser-helpers'\nimport {animate, type AnimationOptions, Driver, KeyframeOptions, PlaybackOptions} from '@repalash/popmotion' // todo: its not able to import from fork anymore since animateKeyframes is used, it can be imported from main.\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport type {FrameFadePlugin} from '../pipeline/FrameFadePlugin'\nimport type {ProgressivePlugin} from '../pipeline/ProgressivePlugin'\nimport {generateUUID} from '../../three'\nimport {\n    animateCameraToViewLinear,\n    animateCameraToViewSpherical,\n    EasingFunctions,\n    extractAnimationKey,\n    IAnimationObject,\n    IAnimSet,\n    makeSetterFor,\n} from '../../utils'\nimport {ICamera, ICameraView} from '../../core'\nimport {Vector3} from 'three'\nimport {animateKeyframes} from '../../utils/animation'\n\nexport interface AnimationResult{\n    id: string\n    promise: Promise<string>\n    options: AnimationOptions<any>\n    stop: () => void\n    anims: AnimationResult[]\n    stopped?: boolean\n    // completed: boolean\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    _stop?: () => void\n}\n\n/**\n * Popmotion plugin\n *\n * Provides animation capabilities to the viewer using the popmotion library: https://popmotion.io/\n *\n * Overrides the driver in popmotion to sync with the viewer and provide ways to keep track and stop animations.\n *\n * @category Plugins\n */\nexport class PopmotionPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'PopmotionPlugin'\n    enabled = true\n\n    toJSON: any = undefined // disable serialization\n    fromJSON: any = undefined // disable serialization\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n        this._postFrame = this._postFrame.bind(this)\n    }\n\n    // private _animating = false\n    private _lastFrameTime = 0 // for post frame\n    private _lastPreFrameTime = 0 // for pre frame\n    private _updaters: {u: ((timestamp: number) => void), time: number}[] = []\n    private _timelineUpdaters: {u: ((timestamp: number) => void), time: number}[] = []\n\n    dependencies = []\n\n    private _fadeDisabled = false\n\n    /**\n     * Disable the frame fade plugin while animation is running\n     */\n    disableFrameFade = true\n\n    autoIncrementTime = true\n\n    // Same code used in CameraViewPlugin\n    private _postFrame = ()=>{\n        if (!this._viewer) return\n        if (this.isDisabled() || Object.keys(this._updaters).length < 1) {\n            this._lastFrameTime = 0\n            // console.log('not anim')\n            if (this._fadeDisabled) {\n                this._viewer.getPlugin<FrameFadePlugin>('FrameFade')?.enable(this)\n                this._fadeDisabled = false\n            }\n            return\n        }\n\n        let delta\n        if (this.autoIncrementTime) {\n            const time = now() / 1000.0\n            if (this._lastFrameTime < 1) this._lastFrameTime = time - 1.0 / 60.0\n            delta = time - this._lastFrameTime\n\n            this._lastFrameTime = time\n\n            const d = this._viewer.getPlugin<ProgressivePlugin>('Progressive')?.postFrameConvergedRecordingDelta()\n            if (d && d > 0) delta = d\n            if (d === 0) delta = 0 // not converged yet.\n            // if d < 0: not recording, do nothing\n\n        } else {\n            const time = this._viewer.timeline.time\n            // if (this._lastFrameTime < 1) this._lastFrameTime = time - 1.0 / 60.0\n            delta = time - this._lastFrameTime\n\n            this._lastFrameTime = time\n        }\n\n        // todo: scrolling\n        // delta = delta * (this.animateOnScroll ? this._scrollAnimationState : 1)\n\n        delta *= 1000\n\n        // delta = 16.666 // testing\n\n        if (Math.abs(delta) <= 0.0001) return\n\n        this._updaters.forEach(u=>{\n            let dt = delta\n            if (u.time + dt < 0) dt = -u.time\n            u.time += dt\n            if (Math.abs(dt) > 0.001)\n                u.u(dt)\n        })\n\n        if (!this._fadeDisabled && this.disableFrameFade) {\n            const ff = this._viewer.getPlugin<FrameFadePlugin>('FrameFade')\n            if (ff) {\n                ff.disable(this)\n                this._fadeDisabled = true\n            }\n        }\n\n        // todo: scrolling\n        // if (this._scrollAnimationState < 0.001) this._scrollAnimationState = 0\n        // else this._scrollAnimationState *= 1.0 - this.scrollAnimationDamping\n    }\n    private _preFrame = ()=>{\n        if (!this._viewer) return\n        if (this.isDisabled() || Object.keys(this._timelineUpdaters).length < 1) {\n            this._lastPreFrameTime = 0\n            return\n        }\n\n        const time = this._viewer.timeline.time * 1000\n        // if (this._lastPreFrameTime < 1) this._lastPreFrameTime = time - 1.0 / 60.0\n        const delta = time - this._lastPreFrameTime\n\n        this._lastPreFrameTime = time\n\n        if (Math.abs(delta) <= 0.0001) return\n\n        // dont clamp delta\n\n        this._timelineUpdaters.forEach(u=>{\n            let dt = delta\n            if (u.time !== time) dt = time - u.time\n            if (u.time + dt < 0) dt = -u.time\n            u.time += dt\n            if (Math.abs(dt) > 0.001) u.u(dt)\n        })\n    }\n\n    readonly defaultDriver: Driver = (update)=>{\n        return {\n            start: ()=>this._updaters.push({u:update, time:0}),\n            stop: ()=> {\n                const index = this._updaters.findIndex(u => u.u === update)\n                if (index >= 0) this._updaters.splice(index, 1)\n            },\n        }\n    }\n    readonly timelineDriver: Driver = (update)=> ({\n        start: () => this._timelineUpdaters.push({u: update, time: 0}),\n        stop: () => {\n            const index = this._timelineUpdaters.findIndex(u => u.u === update)\n            if (index >= 0) this._timelineUpdaters.splice(index, 1)\n        },\n    })\n\n\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n        viewer.addEventListener('postFrame', this._postFrame)\n        viewer.addEventListener('preFrame', this._preFrame)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        viewer.removeEventListener('postFrame', this._postFrame)\n        super.onRemove(viewer)\n    }\n\n    readonly animations: Record<string, AnimationResult> = {}\n\n    animate<V>(options1: AnimationOptions<V> & {target?: any, key?: string/* , delay?: number, canComplete?: boolean*/}, animateFunc?: typeof animate | typeof animateKeyframes): AnimationResult {\n        const {target, key, ...options} = {...options1} as ((typeof options1) & {lastOnUpdate?: (a:V)=>void})\n        let from = options.from\n        let to = options.to\n        if (target !== undefined) {\n            if (key === undefined) throw new Error('PopmotionPlugin - key must be defined when animating in target')\n            if (!(key in target)) {\n                this._viewer?.console.warn('PopmotionPlugin - key not present in target, creating', key, target)\n                target[key] = from ?? 0\n            }\n            const setter = makeSetterFor(target, key)\n            const fromVal = ()=>target[key]\n            options.lastOnUpdate = options.onUpdate\n            options.onUpdate = (val: V)=>{\n                setter(val)\n                options.lastOnUpdate && options.lastOnUpdate(val)\n            }\n            if (from === undefined && (!Array.isArray(to) || to.length < 2)) from = fromVal()\n        }\n\n        const a = this.createAnimationResult(options)\n        a.promise = new Promise<void>((resolve, reject) => {\n            const end2 = ()=>{\n                try {\n                    options.onEnd && options.onEnd()\n                } catch (e: any) {\n                    reject(e)\n                    return false\n                }\n                return true\n            }\n            //\n            // const kf = []\n            // const off = []\n            // if (from !== undefined) {\n            //     kf.push(from)\n            //     off.push(0)\n            //     console.log('from', from, options)\n            // }\n            // if (Array.isArray(to)) {\n            //     kf.push(...to)\n            //     const opOff = (options as KeyframeOptions).offset || []\n            //     for (const n of opOff) {\n            //         off.push(n)\n            //     }\n            //     if (to.length !== opOff.length) {\n            //         console.warn('PopmotionPlugin - to and offset length mismatch', kf, off, options)\n            //         for (let i = opOff.length; i < to.length; i++) {\n            //             off.push(1)\n            //         }\n            //     }\n            // } else {\n            //     if (to !== undefined) {\n            //         kf.push(to)\n            //         off.push(1)\n            //     }\n            // }\n\n            // from = kf[0] as any\n            const from1 = from ?? (Array.isArray(to) ? to[0] : from)\n            if (from1 === undefined) {\n                console.warn('from is undefined', options)\n                resolve()\n                return\n            }\n            const isBool = typeof from1 === 'boolean'\n            // const duration = (options as KeyframeOptions).duration\n            // if (duration !== undefined && delay !== undefined && delay > 0 && kf.length > 0) {\n            //     kf.splice(1, 0, from)\n            //     off.splice(1, 0, delay / (duration + delay))\n            // }\n            // console.log(kf, off)\n\n            if (Array.isArray(to) && to.length < 2) {\n                to = to[0] as any\n            }\n\n            const opts: AnimationOptions<V> = {\n                ...options,\n                driver: options.driver || this.defaultDriver,\n                // duration: duration !== undefined ? duration + (delay || 0) : undefined,\n                // to: !isBool ? [...kf] as any : kf.map((v: number)=>v >= 1 ? true : false) as any,\n                to: to as any,\n                from: from,\n                // from: undefined,\n                // to: options.to,\n                // from: options.from,\n                // offset: [...off],\n                onUpdate: (v)=>{\n                    if (!options.onUpdate) return\n                    // console.log(v)\n                    if (isBool) options.onUpdate((v as number) >= 1 ? true : false as any)\n                    else options.onUpdate(v)\n                },\n                onComplete: async()=>{\n                    // a.completed = true\n                    // this._drivers[a.id]?.stop()\n                    try {\n                        // if (isBool && !this.animations[uuid].stopped) options.onUpdate?.(to as any)\n                        options.onComplete && await options.onComplete()\n                    } catch (e: any) {\n                        if (!end2()) return\n                        reject(e)\n                        return\n                    }\n                    if (!end2()) return\n                    resolve()\n                },\n                onStop: async()=>{\n                    try {\n                        options.onStop && await options.onStop()\n                    } catch (e: any) {\n                        if (!end2()) return\n                        reject(e)\n                        return\n                    }\n                    resolve()\n                },\n            }\n            const anim = animateFunc ? animateFunc(opts) : animate(opts)\n            a._stop = anim.stop\n            a.options = opts\n        }).then(()=>{\n            delete this.animations[a.id]\n            return a.id\n        })\n\n        return a\n    }\n\n    async animateAsync<V>(options: AnimationOptions<V>& {target?: any, key?: string}, animations?: AnimationResult[]): Promise<string> {\n        const anim = this.animate(options)\n        if (animations) animations.push(anim)\n        return anim.promise\n    }\n\n    // region animation utils\n\n    /**\n     * Similar to animate, but specifically for numbers, defaults from 0 to 1. Also calls onUpdate with the delta value.\n     * @param options\n     */\n    animateNumber(options: Omit<PlaybackOptions<number> & KeyframeOptions<number>, 'from'|'to'|'onUpdate'> & {\n        from?: number,\n        to?: number,\n        onUpdate?: (value: number, delta: number) => void\n    }): AnimationResult {\n        let lastVal = options.from ?? 0\n        return this.animate({\n            ...options,\n            from: lastVal,\n            to: options.to ?? 1,\n            onUpdate: (v: number) => {\n                const dv = v - lastVal\n                lastVal = v\n                options.onUpdate && options.onUpdate(v, dv)\n            },\n        })\n    }\n\n    timeout(ms: number, options?: AnimationOptions<number>/* &{delay?: number, canComplete?: boolean}*/): AnimationResult {\n        return this.animate({\n            from: 0, to: ms, duration: ms,\n            ...options,\n        })\n    }\n\n    async animateTargetAsync<T>(target: T, key: keyof T, options: AnimationOptions<T[keyof T]>, animations?: AnimationResult[]): Promise<string> {\n        const anim = this.animate({...options, target, key: key as string})\n        if (animations) animations.push(anim)\n        return anim.promise\n    }\n\n    /**\n     * @deprecated - use {@link animate} instead\n     * @param target\n     * @param key\n     * @param options\n     */\n    animateTarget<T>(target: T, key: keyof T, options: AnimationOptions<T[keyof T]>/* &{delay?: number, canComplete?: boolean}*/): AnimationResult {\n        return this.animate({...options, target, key: key as string})\n    }\n\n    /**\n     * Animate camera to a target view.\n     * @param camera\n     * @param view\n     * @param spherical - use spherical interpolation (default true)\n     * @param options - animation options. `normalizeDuration` scales duration based on travel distance\n     *   and skips animation if camera is already at target. Default false when duration is provided, true otherwise.\n     */\n    animateCamera(camera: ICamera, view: ICameraView, spherical = true, options?: Partial<AnimationOptions<any>> & {normalizeDuration?: boolean}) {\n        const anim = spherical ?\n            animateCameraToViewSpherical(camera, view) :\n            animateCameraToViewLinear(camera, view)\n\n        let duration = ((options as KeyframeOptions)?.duration ?? 1000) * (view.duration ?? 1)\n\n        if (options?.normalizeDuration && duration > 0) {\n            const currentPos = camera.getWorldPosition(new Vector3())\n            const totalTravel = currentPos.distanceTo(view.position) + camera.target.distanceTo(view.target)\n            if (totalTravel < 0.001) {\n                // Already at target — complete instantly\n                anim.onComplete?.()\n                const result = this.createAnimationResult()\n                result.promise = Promise.resolve(result.id).then(() => {\n                    delete this.animations[result.id]\n                    return result.id\n                })\n                return result\n            }\n            // Scale duration relative to camera-to-target distance (scene scale)\n            const viewSize = Math.max(currentPos.distanceTo(camera.target), 0.1)\n            duration = Math.max(100, duration * Math.min(1, totalTravel / viewSize))\n        }\n\n        return this.animate({\n            ease: EasingFunctions.linear,\n            ...anim, ...options,\n            duration,\n        })\n    }\n\n    async animateCameraAsync(camera: ICamera, view: ICameraView, spherical = true, options?: Partial<AnimationOptions<any>> & {normalizeDuration?: boolean}, animations?: AnimationResult[]) {\n        const anim = this.animateCamera(camera, view, spherical, options)\n        if (animations) animations.push(anim)\n        return anim.promise\n    }\n\n    // endregion animation utils\n\n    createAnimationResult(options: AnimationOptions<any> = {}) {\n        const uuid = generateUUID()\n        return this.animations[uuid] = {\n            id: uuid,\n            options: options,\n            stop: () => this.stopAnimationResult(uuid),\n            stopped: false,\n            ['_stop']: () => {\n                return\n            },\n            anims: [] as AnimationResult[],\n            promise: undefined as any,\n            // completed: false,\n        }\n    }\n\n    stopAnimationResult(uuid: string) {\n        const a1 = this.animations[uuid]\n        if (!a1 || a1.stopped) return\n        if (!a1._stop) console.warn('Animation not started')\n        else if (typeof a1._stop === 'function') a1._stop()\n        a1.anims?.forEach(anim => anim.stop())\n        a1.stopped = true\n    }\n\n    // region animation object\n\n    animateObject<V>(o: IAnimationObject<V>, delay?: number, canComplete = true, driver?: Driver, delay2?: number): AnimationResult {\n        // if (typeof o.animate === 'function' && _external) {\n        //     return o.animate(delay, canComplete)\n        // }\n        const {key: key1, tar, onChange: accOnUpdate} = extractAnimationKey(o)\n        let key = key1\n        if (tar && key && !(key in tar)) {\n            console.error('PopmotionPlugin invalid key', key, tar, o)\n            // throw ''\n            key = undefined\n        }\n\n        const a = this.createAnimationResult(o.options)\n        if (canComplete) o.result = a\n        delay = (delay || 0) + ((delay2 ?? o.delay) || 0)\n        a.anims = o.animSet ? [...a.anims, this.animateSet(o.animSet, o.animSetParallel ?? false, delay, canComplete, driver)] : a.anims\n        const oUpdaters = o.updater ?? []\n\n        const opts = !key || !tar ? {\n            to: [0, 1],\n        } : {\n            target: tar, key,\n            to: o.values,\n            offset: o.offsets,\n        }\n\n        // todo add repeat, repeatDelay, repeatType by changing `to` and duration\n\n        a.anims.push(this.animate({\n            ...opts,\n            driver,\n            ease: typeof o.ease === 'string' ? EasingFunctions[o.ease] : o.ease,\n            duration: o.duration,\n            ...o.options,\n            // @ts-expect-error implemented in animateKeyframes\n            canComplete, delay,\n            onUpdate: (v) => {\n                o.options.onUpdate && o.options.onUpdate(v as any)\n                accOnUpdate && accOnUpdate()\n                oUpdaters.forEach(value => value && value())\n            },\n        }, animateKeyframes)) // animateKeyframes implements delay and canComplete\n\n        a.promise = Promise.all(a.anims.map(async n=>n.promise)).then(()=>{\n            // a.completed = true\n            a.anims = []\n            delete this.animations[a.id]\n            if (o.result === a) o.result = undefined\n            return a.id\n        })\n        return a\n    }\n\n    animateSet(anims: IAnimSet, parallel = false, delay1 = 0, canComplete = true, driver?: Driver): AnimationResult {\n        const a = this.createAnimationResult()\n        if (parallel) {\n            a.anims = anims.map(anim => this.animateObject(anim, delay1, canComplete, driver))\n        } else {\n            let d = delay1\n            for (const anim of anims) {\n                a.anims.push(this.animateObject(anim, d, canComplete, driver))\n                const {\n                    delay = 0,\n                    duration = 0,\n                    options,\n                } = anim\n\n                d += delay + duration + (duration + (options.repeatDelay || 0)) * (options.repeat || 0)\n            }\n        }\n        a.promise = Promise.all(a.anims.map(async n=>n.promise)).then(()=>{\n            // a.completed = true\n            a.anims = []\n            delete this.animations[a.id]\n            return a.id\n        })\n        return a\n    }\n\n    // endregion animation object\n\n}\n","import {EventListener2, Spherical, Vector3} from 'three'\nimport {IEvent, now, objectHasOwn, onChange, serialize} from 'ts-browser-helpers'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiButton, uiFolderContainer, uiInput, uiMonitor, uiToggle} from 'uiconfig.js'\nimport {OrbitControls3} from '../../three'\nimport {IScene, ISceneEventMap} from '../../core'\n\n/**\n * Interaction Prompt Plugin\n *\n * A plugin that adds a hand pointer icon over the canvas that moves to prompt the user to interact with the 3d scene.\n * Pointer icon from [google/model-viewer](https://github.com/google/model-viewer)\n *\n * The pointer is automatically shown when some object is in the scene and the camera is not moving.\n * The animation starts after a delay and stops on user interaction. It then restarts after a delay after the user stops interacting\n *\n * The plugin provides several options and functions to configure the automatic behaviour or trigger the animation manually.\n * TODO - create example\n * @category Plugins\n */\n@uiFolderContainer('Interaction Prompt')\nexport class InteractionPromptPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'InteractionPromptPlugin'\n    @serialize()\n    @uiToggle() enabled\n\n    currentSphericalPosition?: Spherical\n    animationRunning = false\n    cursorEl?: HTMLElement\n    // interactionsDisabled = false\n\n    /**\n     * Animation duration in ms\n     */\n    @serialize()\n    @uiInput() animationDuration = 2000\n\n    /**\n     * Animation distance in pixels\n     */\n    @serialize()\n    @uiInput() animationDistance = 80\n\n    @serialize()\n    @uiInput() animationPauseDuration = 6000\n\n    /**\n     * Camera Rotation distance in radians.\n     */\n    @serialize()\n    @uiInput() rotationDistance = 0.3\n\n    /**\n     * Move the pointer icon up or down.\n     * Y offset in the range -1 to 1.\n     * 0 is the center of the screen, -1 is the top and 1 is the bottom.\n     */\n    @serialize()\n    @uiInput() yOffset = 0\n\n    /**\n     * Autostart after camera stop\n     */\n    @serialize()\n    @uiToggle() autoStart = true\n\n    /**\n     * Time in ms to wait before auto start after the camera stops.\n     */\n    @serialize()\n    @uiInput() autoStartDelay = 30000\n\n    /**\n     * Auto stop on user interaction pointer down or wheel\n     */\n    @serialize()\n    @uiToggle() autoStop = true\n\n    /**\n     * Auto start on scene object load. This requires {@link autoStart} to be true\n     */\n    @serialize()\n    @uiToggle() autoStartOnObjectLoad = true\n\n    @serialize()\n    @uiToggle() autoStartOnObjectLoadDelay = 3000\n\n    @uiMonitor() currentTime = 0\n\n    @uiMonitor() lastActionTime = Infinity\n\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n\n    // private _xDamper = new Damper(50)\n\n    /**\n     * Pointer icon svg\n     * Note: This is directly added to the DOM\n     */\n    @onChange(InteractionPromptPlugin.prototype._pointerIconChanged)\n        pointerIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"transform: translate(-50%, -25%);\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"25\" height=\"36\">\n    <defs>\n        <path id=\"A\" d=\"M.001.232h24.997V36H.001z\"></path>\n    </defs>\n    <g transform=\"translate(-11 -4)\" fill=\"none\" fill-rule=\"evenodd\">\n        <path fill-opacity=\"0\" fill=\"#fff\" d=\"M0 0h44v44H0z\"></path>\n        <g transform=\"translate(11 3)\">\n            <path d=\"M8.733 11.165c.04-1.108.766-2.027 1.743-2.307a2.54 2.54 0 0 1 .628-.089c.16 0 .314.017.463.044 1.088.2 1.9 1.092 1.9 2.16v8.88h1.26c2.943-1.39 5-4.45 5-8.025a9.01 9.01 0 0 0-1.9-5.56l-.43-.5c-.765-.838-1.683-1.522-2.712-2-1.057-.49-2.226-.77-3.46-.77s-2.4.278-3.46.77c-1.03.478-1.947 1.162-2.71 2l-.43.5a9.01 9.01 0 0 0-1.9 5.56 9.04 9.04 0 0 0 .094 1.305c.03.21.088.41.13.617l.136.624c.083.286.196.56.305.832l.124.333a8.78 8.78 0 0 0 .509.953l.065.122a8.69 8.69 0 0 0 3.521 3.191l1.11.537v-9.178z\" fill-opacity=\".5\" fill=\"#e4e4e4\"></path>\n            <path d=\"M22.94 26.218l-2.76 7.74c-.172.485-.676.8-1.253.8H12.24c-1.606 0-3.092-.68-3.98-1.82-1.592-2.048-3.647-3.822-6.11-5.27-.095-.055-.15-.137-.152-.23-.004-.1.046-.196.193-.297.56-.393 1.234-.6 1.926-.6a3.43 3.43 0 0 1 .691.069l4.922.994V10.972c0-.663.615-1.203 1.37-1.203s1.373.54 1.373 1.203v9.882h2.953c.273 0 .533.073.757.21l6.257 3.874c.027.017.045.042.07.06.41.296.586.77.426 1.22M4.1 16.614c-.024-.04-.042-.083-.065-.122a8.69 8.69 0 0 1-.509-.953c-.048-.107-.08-.223-.124-.333l-.305-.832c-.058-.202-.09-.416-.136-.624l-.13-.617a9.03 9.03 0 0 1-.094-1.305c0-2.107.714-4.04 1.9-5.56l.43-.5c.764-.84 1.682-1.523 2.71-2 1.058-.49 2.226-.77 3.46-.77s2.402.28 3.46.77c1.03.477 1.947 1.16 2.712 2l.428.5a9 9 0 0 1 1.901 5.559c0 3.577-2.056 6.636-5 8.026h-1.26v-8.882c0-1.067-.822-1.96-1.9-2.16-.15-.028-.304-.044-.463-.044-.22 0-.427.037-.628.09-.977.28-1.703 1.198-1.743 2.306v9.178l-1.11-.537C6.18 19.098 4.96 18 4.1 16.614M22.97 24.09l-6.256-3.874c-.102-.063-.218-.098-.33-.144 2.683-1.8 4.354-4.855 4.354-8.243 0-.486-.037-.964-.104-1.43a9.97 9.97 0 0 0-1.57-4.128l-.295-.408-.066-.092a10.05 10.05 0 0 0-.949-1.078c-.342-.334-.708-.643-1.094-.922-1.155-.834-2.492-1.412-3.94-1.65l-.732-.088-.748-.03a9.29 9.29 0 0 0-1.482.119c-1.447.238-2.786.816-3.94 1.65a9.33 9.33 0 0 0-.813.686 9.59 9.59 0 0 0-.845.877l-.385.437-.36.5-.288.468-.418.778-.04.09c-.593 1.28-.93 2.71-.93 4.222 0 3.832 2.182 7.342 5.56 8.938l1.437.68v4.946L5 25.64a4.44 4.44 0 0 0-.888-.086c-.017 0-.034.003-.05.003-.252.004-.503.033-.75.08a5.08 5.08 0 0 0-.237.056c-.193.046-.382.107-.568.18-.075.03-.15.057-.225.1-.25.114-.494.244-.723.405a1.31 1.31 0 0 0-.566 1.122 1.28 1.28 0 0 0 .645 1.051C4 29.925 5.96 31.614 7.473 33.563a5.06 5.06 0 0 0 .434.491c1.086 1.082 2.656 1.713 4.326 1.715h6.697c.748-.001 1.43-.333 1.858-.872.142-.18.256-.38.336-.602l2.757-7.74c.094-.26.13-.53.112-.794s-.088-.52-.203-.76a2.19 2.19 0 0 0-.821-.91\" fill-opacity=\".6\" fill=\"#000\"></path>\n            <path d=\"M22.444 24.94l-6.257-3.874a1.45 1.45 0 0 0-.757-.211h-2.953v-9.88c0-.663-.616-1.203-1.373-1.203s-1.37.54-1.37 1.203v16.643l-4.922-.994a3.44 3.44 0 0 0-.692-.069 3.35 3.35 0 0 0-1.925.598c-.147.102-.198.198-.194.298.004.094.058.176.153.23 2.462 1.448 4.517 3.22 6.11 5.27.887 1.14 2.373 1.82 3.98 1.82h6.686c.577 0 1.08-.326 1.253-.8l2.76-7.74c.16-.448-.017-.923-.426-1.22-.025-.02-.043-.043-.07-.06z\" fill=\"#fff\"></path>\n            <g transform=\"translate(0 .769)\">\n                <mask id=\"B\" fill=\"#fff\">\n                    <use xlink:href=\"#A\"></use>\n                </mask>\n                <path d=\"M23.993 24.992a1.96 1.96 0 0 1-.111.794l-2.758 7.74c-.08.22-.194.423-.336.602-.427.54-1.11.87-1.857.872h-6.698c-1.67-.002-3.24-.633-4.326-1.715-.154-.154-.3-.318-.434-.49C5.96 30.846 4 29.157 1.646 27.773c-.385-.225-.626-.618-.645-1.05a1.31 1.31 0 0 1 .566-1.122 4.56 4.56 0 0 1 .723-.405l.225-.1a4.3 4.3 0 0 1 .568-.18l.237-.056c.248-.046.5-.075.75-.08.018 0 .034-.003.05-.003.303-.001.597.027.89.086l3.722.752V20.68l-1.436-.68c-3.377-1.596-5.56-5.106-5.56-8.938 0-1.51.336-2.94.93-4.222.015-.03.025-.06.04-.09.127-.267.268-.525.418-.778.093-.16.186-.316.288-.468.063-.095.133-.186.2-.277L3.773 5c.118-.155.26-.29.385-.437.266-.3.544-.604.845-.877a9.33 9.33 0 0 1 .813-.686C6.97 2.167 8.31 1.59 9.757 1.35a9.27 9.27 0 0 1 1.481-.119 8.82 8.82 0 0 1 .748.031c.247.02.49.05.733.088 1.448.238 2.786.816 3.94 1.65.387.28.752.588 1.094.922a9.94 9.94 0 0 1 .949 1.078l.066.092c.102.133.203.268.295.408a9.97 9.97 0 0 1 1.571 4.128c.066.467.103.945.103 1.43 0 3.388-1.67 6.453-4.353 8.243.11.046.227.08.33.144l6.256 3.874c.37.23.645.55.82.9.115.24.185.498.203.76m.697-1.195c-.265-.55-.677-1.007-1.194-1.326l-5.323-3.297c2.255-2.037 3.564-4.97 3.564-8.114 0-2.19-.637-4.304-1.84-6.114-.126-.188-.26-.37-.4-.552-.645-.848-1.402-1.6-2.252-2.204C15.472.91 13.393.232 11.238.232A10.21 10.21 0 0 0 5.23 2.19c-.848.614-1.606 1.356-2.253 2.205-.136.18-.272.363-.398.55C1.374 6.756.737 8.87.737 11.06c0 4.218 2.407 8.08 6.133 9.842l.863.41v3.092l-2.525-.51c-.356-.07-.717-.106-1.076-.106a5.45 5.45 0 0 0-3.14.996c-.653.46-1.022 1.202-.99 1.983a2.28 2.28 0 0 0 1.138 1.872c2.24 1.318 4.106 2.923 5.543 4.772 1.26 1.62 3.333 2.59 5.55 2.592h6.698c1.42-.001 2.68-.86 3.134-2.138l2.76-7.74c.272-.757.224-1.584-.134-2.325\" fill-opacity=\".05\" fill=\"#000\" mask=\"url(#B)\"></path>\n            </g>\n        </g>\n    </g>\n</svg>`\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n\n        // legacy, required for files. remove later? todo use OldPluginType\n        {\n            if (objectHasOwn(viewer.plugins, 'InteractionPointerPlugin')) {\n                delete viewer.plugins.InteractionPointerPlugin\n            }\n\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            const p = this\n            Object.defineProperty(viewer.plugins, 'InteractionPointerPlugin', {\n                get(): any {\n                    console.warn('InteractionPromptPlugin: PluginType renamed from InteractionPointerPlugin to InteractionPromptPlugin. Please update your code/vjson.')\n                    return p\n                },\n                configurable: true, // required to be able to delete\n            })\n        }\n\n        this.lastActionTime = Infinity\n        viewer.addEventListener('preFrame', this._preFrame)\n\n        viewer.container.addEventListener('pointerdown', this._pointerDown, true) // true is for capturing, this is required to enable orbit controls. https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#capture\n        viewer.container.addEventListener('wheel', this._pointerDown, true)\n\n        viewer.scene.addEventListener('addSceneObject', this._addSceneObject)\n        viewer.scene.addEventListener('mainCameraUpdate', this._mainCameraUpdate)\n        this._initializeCursor()\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        this.stopAnimation()\n        viewer.removeEventListener('preFrame', this._preFrame)\n        viewer.container.removeEventListener('pointerdown', this._pointerDown, true)\n        viewer.container.removeEventListener('wheel', this._pointerDown, true)\n        viewer.scene.removeEventListener('addSceneObject', this._addSceneObject)\n        viewer.scene.removeEventListener('mainCameraUpdate', this._mainCameraUpdate)\n        if (this.cursorEl) {\n            this.cursorEl.remove()\n        }\n        return super.onRemove(viewer)\n    }\n\n    private _mainCameraUpdate = (e: any)=>{\n        if (this.isDisabled()) return\n        if (e.change === 'deserialize' && this.animationRunning) {\n            this.stopAnimation({reset: false}) // reset is false so that the new camera position is not reset\n            this.startAnimation()\n        } else if (this._startedOnce) {\n            this.lastActionTime = now()\n        }\n    }\n\n    private _startedOnce = false\n    private _addSceneObject: EventListener2<'addSceneObject', ISceneEventMap, IScene> = ()=>{\n        if (this.autoStartOnObjectLoad && !this._startedOnce) {\n            this.lastActionTime = now() - this.autoStartDelay + this.autoStartOnObjectLoadDelay\n        }\n    }\n\n    protected _pointerIconChanged() {\n        if (!this.cursorEl) return\n        this.cursorEl.innerHTML = this.pointerIcon\n    }\n\n    private _initializeCursor() {\n        this.cursorEl = document.createElement('div')\n        this.cursorEl.style.position = 'absolute'\n        this.cursorEl.style.top = '0'\n        this.cursorEl.style.left = '0'\n        this.cursorEl.style.width = '10px'\n        this.cursorEl.style.height = '10px'\n        this.cursorEl.style.opacity = '0'\n        // this.cursorEl.style.transition = 'opacity 0.25s ease-in-out'\n        // this.cursorEl.innerHTML = this.pointerIcon\n        this._pointerIconChanged()\n        this._viewer!.container.appendChild(this.cursorEl)\n    }\n\n    @serialize()\n        onlyOnOrbitControls = true\n\n    private _orbitWarning = false\n\n    @uiButton() startAnimation = () => {\n        if (!this._viewer || !this.cursorEl || this.isDisabled()) return\n        if ((this._viewer.scene.mainCamera.controls as OrbitControls3)?.type !== 'OrbitControls' && this.onlyOnOrbitControls) {\n            if (!this._orbitWarning) console.warn('InteractionPromptPlugin requires OrbitControls, to run anyway, set onlyOnOrbitControls to false')\n            this._orbitWarning = true\n            return\n        }\n        if (this._viewer.scene.modelRoot.children.length === 0) return\n        this.currentSphericalPosition = new Spherical().setFromVector3(new Vector3().subVectors(\n            this._viewer.scene.mainCamera.position,\n            this._viewer.scene.mainCamera.target\n        ))\n        this.cursorEl.style.opacity = '1'\n        this.currentTime = 0\n        this.animationRunning = true\n        this._startedOnce = true\n        this._viewer.scene.mainCamera.setInteractions(false, InteractionPromptPlugin.PluginType)\n        // if (this._viewer.scene.mainCamera.interactionsEnabled) {\n        //     this.interactionsDisabled = true\n        //     this._viewer.scene.mainCamera.interactionsEnabled = false\n        // }\n    }\n\n    @uiButton() stopAnimation = async({reset = true}: {reset?: boolean} = {}) => {\n        if (!this._viewer || !this.cursorEl) return // dont check for enabled here.\n        this.animationRunning = false\n        this.cursorEl.style.opacity = '0'\n        if (this.currentSphericalPosition && reset) {\n            this._viewer.scene.mainCamera.position.setFromSpherical(this.currentSphericalPosition).add(this._viewer.scene.mainCamera.target)\n            this._viewer.scene.mainCamera.setDirty()\n            this.currentSphericalPosition = undefined\n        }\n        this._viewer.scene.mainCamera.setInteractions(true, InteractionPromptPlugin.PluginType)\n        // if (this.interactionsDisabled) {\n        //     this._viewer.scene.mainCamera.interactionsEnabled = true\n        //     this.interactionsDisabled = false\n        // }\n        return this._viewer.doOnce('postFrame')\n    }\n\n    private _pointerDown = () => {\n        if (this.isDisabled()) return\n        if (this.autoStop) this.stopAnimation({reset: false}) // todo dont reset only on pointer drag, not down\n        this.lastActionTime = now()\n    }\n    private _x = 0\n    private _preFrame = async(ev: IEvent<any>) => {\n        if (!this._viewer || !this.cursorEl) return\n        if (this.isDisabled() && this.animationRunning) {\n            this.stopAnimation()\n        }\n        if (this.isDisabled()) return\n\n        if (!this.animationRunning && this.autoStart && this.lastActionTime + this.autoStartDelay < now())\n            this.startAnimation()\n\n        if (!this.animationRunning) return\n\n        if (this.currentTime <= this.animationDuration) {\n            this.cursorEl.style.opacity = '1'\n            // this.currentTime = this._xDamper.update(this.currentTime, this.currentTime + ev.deltaTime, 50, 0)\n            const x = this.currentTime / this.animationDuration\n            this._x = Math.sin(Math.PI * 2 * x) // this._xDamper.update( this._x,newX , ev.deltaTime , 1)\n            if (x < 0.25 || x > 0.75) {\n                this._x *= this._x * Math.sign(this._x)\n            }\n        } else {\n            this.cursorEl.style.opacity = '0'\n            this._x = 0\n        }\n        if (this.currentTime <= this.animationDuration + 50) { // because of precision issues. we need _x to be 0\n            const sphericalPosition = this.currentSphericalPosition!.clone()\n            sphericalPosition.theta += this._x * this.rotationDistance\n            this._viewer.scene.mainCamera.position.setFromSpherical(sphericalPosition).add(this._viewer.scene.mainCamera.target)\n            this._viewer.scene.mainCamera.setDirty()\n        }\n\n        const canvasBounds = this._viewer.container.getBoundingClientRect()\n\n        const cursorX = canvasBounds.width / 2 + -this._x * Math.min(this.animationDistance, canvasBounds.width / 4)\n        const cursorY = canvasBounds.height / 2 + this.yOffset * canvasBounds.height / 2\n        this.cursorEl.style.transform = `translate(${Math.floor(cursorX)}px, ${Math.floor(cursorY)}px)`\n\n        this.currentTime += ev.deltaTime\n\n        if (this.currentTime > this.animationDuration + this.animationPauseDuration) {\n            this.currentTime = 0\n        }\n    }\n}\n","import {Object3D, Vector3} from 'three'\nimport {Easing} from '@repalash/popmotion'\nimport {AViewerPluginEventMap, AViewerPluginSync, type ThreeViewer} from '../../viewer'\nimport {Box3B} from '../../three'\nimport {onChange, onChange3, serialize, timeout} from 'ts-browser-helpers'\nimport {generateUiConfig, uiButton, uiDropdown, uiInput, UiObjectConfig, uiSlider, uiToggle} from 'uiconfig.js'\nimport {EasingFunctions, EasingFunctionType} from '../../utils'\nimport {CameraView, createCameraPath, ICamera, ICameraView, IGeometry, IMaterial, IObject3D, ITexture} from '../../core'\nimport {AnimationResult, PopmotionPlugin} from './PopmotionPlugin'\nimport {InteractionPromptPlugin} from '../interaction/InteractionPromptPlugin'\nimport {getFittingDistance} from '../../three/utils/camera'\n\nexport interface CameraViewPluginOptions{duration?: number, ease?: EasingFunctionType, interpolateMode?: 'spherical'|'linear'}\n\nexport interface CameraViewPluginEventMap extends AViewerPluginEventMap{\n    viewChange: {view: CameraView}\n    startViewChange: {view: CameraView}\n\n    viewAdd: {view: CameraView}\n    viewDelete: {view: CameraView}\n    viewUpdate: {view: CameraView}\n\n    update: {key?: string}\n}\n\n/**\n * Camera View Plugin\n *\n * Provides API to save, interact and animate and loop between with multiple camera states/views using the {@link PopmotionPlugin}.\n *\n */\nexport class CameraViewPlugin extends AViewerPluginSync<CameraViewPluginEventMap> {\n    static readonly PluginType = 'CameraViews'\n\n    enabled = true\n\n    // get dirty() { // todo: issue with recorder convergeMode?\n    //     return this._animating\n    // }\n\n    constructor(options: CameraViewPluginOptions = {}) {\n        super()\n        this.addCurrentView = this.addCurrentView.bind(this)\n        this.resetToFirstView = this.resetToFirstView.bind(this)\n        this.animateAllViews = this.animateAllViews.bind(this)\n        // this.recordAllViews = this.recordAllViews.bind(this)\n        // this._wheel = this._wheel.bind(this)\n        // this._pointerMove = this._pointerMove.bind(this)\n        this._postFrame = this._postFrame.bind(this)\n        this.setDirty = this.setDirty.bind(this)\n\n        this.animDuration = options.duration ?? this.animDuration\n        this.animEase = options.ease ?? this.animEase\n        this.interpolateMode = options.interpolateMode ?? this.interpolateMode\n    }\n\n\n\n    @serialize('cameraViews')\n    private _cameraViews: CameraView[] = []\n    get cameraViews(): CameraView[] {\n        return this._cameraViews\n    }\n    get camViews(): CameraView[] {\n        return this._cameraViews\n    }\n\n    @onChange(CameraViewPlugin.prototype._animationLoop)\n    /**\n     * Loop all views indefinitely.\n     */\n    @serialize() @uiToggle('Loop All Views') viewLooping = false\n    /**\n     * Pauses time between view changes when animating all views or looping.\n     */\n    @onChange3('setDirty')\n    @serialize() @uiInput('View Pause Time') viewPauseTime = 200\n\n    /**\n     * {@link EasingFunctions}\n     */\n    @onChange3('setDirty')\n    @serialize() @uiDropdown('Ease', Object.keys(EasingFunctions).map((label:string)=>({label}))) animEase: EasingFunctionType = 'easeInOutSine' // ms\n    @onChange3('setDirty')\n    @serialize() @uiSlider('Duration', [10, 10000], 10) animDuration = 1000 // ms\n    @onChange3('setDirty')\n    @serialize() @uiDropdown('Interpolation', ['spherical', 'linear'/* , 'spline (dev)'*/].map((label:string)=>({label, value: label.split(' ')[0]})))\n        interpolateMode: 'spherical'|'linear'|'spline' = 'spherical'\n    // todo spline\n    // @serialize() @uiDropdown('Spline Curve', ['centripetal', 'chordal', 'catmullrom'].map((label:string)=>({label})), (t: CameraViewPlugin)=>({hidden: ()=>t.interpolateMode !== 'spline', onChange: ()=>t.uiConfig?.uiRefresh?.()}))\n    //     splineCurve: 'centripetal'|'chordal'|'catmullrom' = 'chordal'\n\n\n    // not used\n    @serialize()\n    // @onChange3('setDirty')\n    // @uiSlider('RotationOffset', [0.2, 0.75], 0.01)\n        rotationOffset = 0.25\n\n    private _animating = false\n    get animating(): boolean {\n        return this._animating\n    }\n\n    dependencies = [PopmotionPlugin]\n\n    // private _updaters: {u: ((timestamp: number) => void), time: number}[] = []\n    // private _lastFrameTime = 0 // for post frame\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n\n        // todo: move to PopmotionPlugin\n        // todo: remove event listener\n        viewer.addEventListener('preFrame', (_: any)=>{\n            // console.log(ev.deltaTime)\n\n            // this._updaters.forEach(u=>{\n            //     let dt = ev.deltaTime\n            //     if (u.time + dt < 0) dt = -u.time\n            //     u.time += dt\n            //     if (Math.abs(dt) > 0.001)\n            //         u.u(dt)\n            // })\n\n        })\n\n        viewer.addEventListener('postFrame', this._postFrame)\n        // window.addEventListener('wheel', this._wheel)\n        // window.addEventListener('pointermove', this._pointerMove)\n\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n\n        viewer.removeEventListener('postFrame', this._postFrame)\n        // window.removeEventListener('wheel', this._wheel)\n        // window.removeEventListener('pointermove', this._pointerMove)\n\n        return super.onRemove(viewer)\n    }\n\n    @uiButton('Reset To First View', {sendArgs: false})\n    public async resetToFirstView(duration = 100) {\n        if (this.isDisabled()) return\n        this._currentView = undefined\n        await this.animateToView(0, duration)\n        await timeout(2)\n    }\n\n    @uiButton('Add Current View')\n    async addCurrentView() {\n        if (this.isDisabled()) return\n        const camera = this._viewer?.scene.mainCamera\n        if (!camera) return\n        const view = this.getView(camera)\n        this.addView(view)\n        view.name = 'View ' + this._cameraViews.length\n        return view\n    }\n\n    addView(view: CameraView, force = false) {\n        view.addEventListener('setView', this._viewSetView as any)\n        view.addEventListener('updateView', this._viewUpdateView as any)\n        view.addEventListener('deleteView', this._viewDeleteView as any)\n        view.addEventListener('animateView', this._viewAnimateView as any)\n        view.addEventListener('update', this._viewUpdated)\n        const incl = this._cameraViews.includes(view)\n        if (!incl || force) {\n            if (!incl) this._cameraViews.push(view)\n            this.setDirty({key: 'cameraViews', change: 'viewAdd'})\n            this.dispatchEvent({type: 'viewAdd', view})\n        }\n    }\n\n    deleteView(view: CameraView, force = false) {\n        const i = this._cameraViews.indexOf(view)\n        view.removeEventListener('setView', this._viewSetView as any)\n        view.removeEventListener('updateView', this._viewUpdateView as any)\n        view.removeEventListener('deleteView', this._viewDeleteView as any)\n        view.removeEventListener('animateView', this._viewAnimateView as any)\n        view.removeEventListener('update', this._viewUpdated)\n        if (i >= 0 || force) {\n            if (i >= 0) this._cameraViews.splice(i, 1)\n            this.setDirty({key: 'cameraViews', change: 'viewDelete'})\n            this.dispatchEvent({type: 'viewDelete', view})\n        }\n    }\n\n\n    getView(camera?: ICamera, worldSpace = true, view?: CameraView) {\n        camera = camera || this._viewer?.scene.mainCamera\n        if (!camera) return view ?? new CameraView()\n        return camera.getView(worldSpace, view)\n    }\n\n    setView(view: ICameraView, camera?: ICamera) {\n        camera = camera || this._viewer?.scene.mainCamera\n        if (!camera) return\n        camera.setView(view)\n    }\n\n    private _currentView: CameraView | undefined\n\n    @uiButton('Focus Next', {sendArgs: false}) focusNext = (wrap = true)=>{\n        if (this._animating) return\n        if (this._cameraViews.length < 2) return\n        let index = this._cameraViews.findIndex(v=>v === this._currentView)\n        if (index < 0) index = -1 // first view\n        index = index + 1\n        if (!wrap) index = Math.min(index, this._cameraViews.length - 1)\n        else index = index % this._cameraViews.length\n        this.animateToView(index)\n    }\n    @uiButton('Focus Previous', {sendArgs: false}) focusPrevious = (wrap = true)=> {\n        if (this._animating) return\n        if (this._cameraViews.length < 2 || !this._currentView) return\n        let index = this._cameraViews.findIndex(v=>v === this._currentView)\n        if (index < 0) index = 0 // last view\n        index = index - 1\n        if (!wrap) index = Math.max(index, 0)\n        else index = (index + this._cameraViews.length) % this._cameraViews.length\n        this.animateToView(index)\n    }\n\n    private _popAnimations: AnimationResult[] = []\n\n    async animateToView(_view: CameraView|number|string, duration?: number, easing?: Easing|EasingFunctionType, camera?: ICamera, throwOnStop = false, normalizeDuration?: boolean) {\n        camera = camera || this._viewer?.scene.mainCamera\n        if (!camera) return\n        // if (this._currentView === view) return // todo: also check if the camera is at the correct position and orientation, till then use resetToFirstView to reset current view\n        if (this._animating) {\n            this._popAnimations.forEach(a=>a?.stop && a.stop()) // don't call stopAllAnimations here, as it sets viewLooping to false and changes config.\n            this._popAnimations = []\n            let i = 0\n            while (this._animating) {\n                await timeout(100)\n                if (i++ > 20) { // 2s timeout\n                    break\n                }\n            }\n            if (this._animating) {\n                console.warn('Unable to stop all animations, maybe because of viewLooping?')\n                return\n            }\n        }\n        const view = typeof _view === 'number' ? this._cameraViews[_view] :\n            typeof _view === 'string' ? this._cameraViews.find(v=>v.name === _view) :\n                _view\n        if (!view) {\n            this._viewer?.console.warn('Invalid view', _view)\n            return\n        }\n\n        normalizeDuration = normalizeDuration ?? duration === undefined\n\n        const interactionPrompt = this._viewer?.getPlugin(InteractionPromptPlugin)\n        if (interactionPrompt && interactionPrompt.animationRunning) {\n            await interactionPrompt.stopAnimation({reset: true})\n        }\n\n        this._currentView = view\n        this._animating = true\n\n        camera.setInteractions && camera.setInteractions(false, CameraViewPlugin.PluginType) // todo: also for seekOnScroll\n\n        if (!camera.userData.autoLookAtTarget) {\n            console.warn('CameraViewPlugin: camera autoLookAtTarget is disabled, camera look at might not be correct during animation')\n        }\n\n        this.dispatchEvent({type: 'startViewChange', view})\n\n        const popmotion = this._viewer?.getPlugin(PopmotionPlugin)\n        if (!popmotion) throw new Error('PopmotionPlugin not found')\n\n        const ease: any = (typeof easing === 'function' ? easing : EasingFunctions[easing || this.animEase]) as (x: number) => number\n        // const ease = (x:number)=>x\n        // const driver = this._driver\n        this._popAnimations = []\n\n        // const viewIndex = this.camViews.indexOf(view)\n        // let interpolateMode = this.interpolateMode\n        // if (viewIndex < 0) {\n        //     if (interpolateMode === 'spline') {\n        //         console.warn('CameraViewPlugin - Cannot animate along a spline with external camera view, fallback to spherical')\n        //         interpolateMode = 'spherical'\n        //     }\n        // }\n        //\n        // if (interpolateMode === 'spline') {\n        //     const points = this.camViews.map(c=>c.position.clone())\n        //     const spline = new CatmullRomCurve3(points, true, this.splineCurve)\n        //\n        //     const getPosition = (t: number)=>{\n        //         const v = new Vector3()\n        //         const ip = 1. / points.length\n        //         const i = viewIndex === 0 ? points.length : viewIndex\n        //         const d = (i - 1) * ip\n        //         spline.getPointAt(d + t * ip, v)\n        //         return v\n        //     }\n        //\n        //     pms.push(animateAsync({\n        //         // from: camera.position.clone(),\n        //         // to: view.position.clone(),\n        //         from: 0,\n        //         to: 1,\n        //         duration, ease, driver,\n        //         onUpdate: (v) => camera.position = getPosition(v),\n        //         onComplete: () => camera.position = getPosition(1), // camera.position = view.position,\n        //         onStop: ()=> {\n        //             throw new Error('Animation stopped')\n        //         },\n        //     }, popAnimations))\n        //     // if (new Vector3().subVectors(camera.cameraObject.up, view.up).length() > 0.1)\n        //     // pms.push(animateAsync({\n        //     //     from: camera.cameraObject.up.clone(),\n        //     //     to: view.up.clone(),\n        //     //     duration, ease, driver,\n        //     //     onUpdate: (v) => camera.cameraObject.up.copy(v),\n        //     //     onComplete: () => camera.cameraObject.up.copy(view.up),\n        //     // }))\n        //     // if (new Vector3().subVectors(camera.target, view.target).length() > 0.1)\n        //     pms.push(animateAsync({\n        //         from: camera.target.clone(),\n        //         to: view.target.clone(),\n        //         duration, ease, driver,\n        //         onUpdate: (v) => {\n        //             camera.target = v\n        //             camera.targetUpdated()\n        //         },\n        //         onComplete: () => {\n        //             camera.target = view.target\n        //             camera.targetUpdated()\n        //         },\n        //     }, popAnimations))\n        // }\n\n        await popmotion.animateCameraAsync(camera, view, this.interpolateMode === 'spherical', {ease, duration, normalizeDuration}, this._popAnimations)\n            .catch((e)=>{\n                // console.error(e)\n                if (throwOnStop) throw e\n            })\n\n        this._viewer?.scene.mainCamera.setInteractions(true, CameraViewPlugin.PluginType)\n        this._animating = false\n\n        this._viewer?.setDirty()\n\n        this.dispatchEvent({type: 'viewChange', view})\n\n        await timeout(10)\n    }\n\n    @uiButton('Animate All Views')\n    async animateAllViews() {\n        if (this.isDisabled()) return\n        if (this.viewLooping || this._cameraViews.length < 2) return\n        while (this._viewQueue.length > 0) this._viewQueue.pop()\n        this._viewQueue.push(...this._cameraViews)\n        this._viewQueue.push(this._viewQueue.shift()!)\n        this._infiniteLooping = false\n        await this._animationLoop()\n        this._infiniteLooping = true\n    }\n\n    @uiButton('Stop All Animations')\n    async stopAllAnimations() {\n        this.viewLooping = false\n        this._popAnimations.forEach(a => a?.stop?.())\n        this._popAnimations = []\n        while (this._animating || this._animationLooping) {\n            await timeout(100)\n        }\n    }\n\n    fromJSON(data: any, meta?: any): this | null {\n        this._cameraViews.forEach(v=>this.deleteView(v)) // deserialize pushes to the existing array\n        if (super.fromJSON(data, meta)) {\n            this._cameraViews.forEach(v=>this.addView(v, true))\n            this.uiConfig?.uiRefresh?.()\n            return this\n        }\n        return null\n    }\n\n    setDirty(ops?: any): any {\n        this.uiConfig?.uiRefresh?.(false, 'postFrame')\n        this.dispatchEvent({...ops, type: 'update'})\n    }\n\n    public async animateToObject(selected?: Object3D, distanceMultiplier = 4, duration?: number, ease?: Easing|EasingFunctionType, distanceBounds = {min: 0.5, max: 5.0}) {\n        if (!this._viewer) return\n        const bbox = new Box3B().expandByObject(selected || this._viewer.scene.modelRoot, false, true)\n        const center = bbox.getCenter(new Vector3())\n        const size = bbox.getSize(new Vector3())\n        const radius = size.length() / 2\n        await this.animateToTarget(Math.min(distanceBounds.max, Math.max(distanceBounds.min, radius * distanceMultiplier)), center, duration, ease)\n    }\n\n    private _resolveSelectedObjects(selected?: Object3D|Object3D[]|IMaterial|IMaterial[]|ITexture|ITexture[]|IGeometry|IGeometry[]): IObject3D[] {\n        return (Array.isArray(selected) ? selected : selected ? [selected] : [])\n            .flatMap(o =>\n                (o as ITexture)?.isTexture ? [...(o as ITexture).appliedObjects?.values() || []] : o)\n            .flatMap(o =>\n                (o as IMaterial)?.isMaterial ? [...(o as IMaterial).appliedMeshes?.values() || []] :\n                    (o as IGeometry)?.isBufferGeometry ? [...(o as IGeometry).appliedMeshes?.values() || []] :\n                    o as IObject3D)\n            .filter(Boolean)\n    }\n\n    /**\n     * Animates the camera to fit the selected objects in the viewport.\n     * When `duration` is 0, the view is set instantly via {@link ICamera.fitObject}.\n     * Accepts Object3D, materials, textures, or geometries (resolved to their applied meshes).\n     * @param selected - objects to fit. Falls back to the scene model root.\n     * @param distanceMultiplier - padding multiplier on the fitting distance (default 1.5)\n     * @param duration - animation duration in ms. Pass 0 for instant. Defaults to animDuration.\n     * @param ease - easing function or name\n     * @param distanceBounds - min/max clamp on the final distance\n     */\n    public async animateToFitObject(selected?: Object3D|Object3D[]|IMaterial|IMaterial[]|ITexture|ITexture[]|IGeometry|IGeometry[], distanceMultiplier = 1.5, duration?: number, ease?: Easing|EasingFunctionType, distanceBounds = {min: 0.5, max: 50.0}) {\n        if (!this._viewer) return\n        const selectedArray = this._resolveSelectedObjects(selected)\n        const objects = !selectedArray.length ? [this._viewer.scene.modelRoot] : selectedArray\n\n        if (duration === 0) {\n            this._viewer.scene.mainCamera.fitObject(objects, distanceMultiplier, distanceBounds)\n            return\n        }\n\n        const bbox = new Box3B().expandByObject(objects[0], false, true)\n        for (let i = 1; i < objects.length; i++) {\n            bbox.expandByObject(objects[i], false, true)\n        }\n        const cameraZ = getFittingDistance(this._viewer.scene.mainCamera, bbox)\n        const center = bbox.getCenter(new Vector3()) // world position\n\n        const scale = bbox.getSize(new Vector3())\n        if (scale.lengthSq() <= 0) { // It could be a light or camera with no geometry\n            objects[0].getWorldPosition(center)\n        }\n        await this.animateToTarget(Math.min(distanceBounds.max, Math.max(distanceBounds.min, cameraZ * distanceMultiplier)), center, duration, ease)\n    }\n\n    /**\n     *\n     * @param distanceFromTarget - in world units\n     * @param center - target (center) of the view in world coordinates\n     * @param duration - in milliseconds\n     * @param ease\n     */\n    public async animateToTarget(distanceFromTarget: number, center: Vector3, duration?: number, ease?: Easing|EasingFunctionType) {\n        const view = this.getView() // world space\n        view.target.copy(center)\n        const direction = new Vector3().subVectors(view.target, view.position).normalize()\n        view.position.copy(direction.multiplyScalar(-distanceFromTarget).add(view.target))\n        if (duration === 0) {\n            this.setView(view)\n            this._viewer?.setDirty()\n            return\n        }\n        await this.animateToView(view, duration, ease, undefined, false, true)\n    }\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Camera Views',\n        // expanded: true,\n        children: [\n            ()=>[...this._cameraViews.map(view => view.uiConfig)],\n            ...generateUiConfig(this) || [],\n        ],\n    }\n\n    get animationLooping(): boolean {\n        return this._animationLooping\n    }\n    private _viewQueue: CameraView[] = []\n    private _animationLooping = false\n    private _infiniteLooping = true\n    private async _animationLoop() {\n        if (this._animationLooping) return\n        this._animationLooping = true\n        while (this.viewLooping || !this._infiniteLooping) {\n            if (this.isDisabled()) break\n            if (this._cameraViews.length < 1) break\n            if (this._viewQueue.length === 0) {\n                if (this._infiniteLooping) this._viewQueue.push(...this._cameraViews)\n                else break\n            }\n            await this.animateToView(this._viewQueue.shift()!)\n            await timeout(2 + this.viewPauseTime) // ms delay\n        }\n        this._animationLooping = false\n    }\n\n\n    protected _viewSetView = ({view, camera}: {view?: CameraView, camera?: ICamera}) => {\n        if (!view) {\n            this._viewer?.console.warn('Invalid view', view)\n            return\n        }\n        this.setView(view, camera)\n    }\n\n    protected _viewUpdateView = ({view, camera}: {view: CameraView, camera?: ICamera}) => {\n        if (!view) {\n            this._viewer?.console.warn('Invalid view', view)\n            return\n        }\n        const name = view.name\n        this.getView(camera, view.isWorldSpace ?? true, view)\n        view.name = name\n    }\n\n    protected _viewDeleteView = ({view}: {view: CameraView}) => {\n        if (!view) {\n            this._viewer?.console.warn('Invalid view', view)\n            return\n        }\n        this.deleteView(view)\n    }\n\n    protected _viewAnimateView = async({view, camera, duration, easing, throwOnStop}: {view: CameraView, camera?: ICamera, duration?: number, easing?: Easing|EasingFunctionType, throwOnStop?: boolean}) => {\n        if (!view) {\n            this._viewer?.console.warn('Invalid view', view)\n            return\n        }\n        return this.animateToView(view, duration || this.animDuration, easing || this.animEase, camera, throwOnStop)\n    }\n\n    protected _viewUpdated = async(e: {target: ICameraView, key?: string}) => {\n        if (!this._cameraViews.includes(e.target as any)) return\n        this.dispatchEvent({type: 'viewUpdate', view: e.target as CameraView})\n        this.setDirty({key: 'cameraViews', change: 'viewUpdate'})\n    }\n\n\n    // region deprecated\n\n    /**\n     * @deprecated - renamed to {@link getView} or {@link ICamera.getView}\n     * @param camera\n     * @param worldSpace\n     */\n    getCurrentCameraView(camera?: ICamera, worldSpace = true) {\n        return this.getView(camera, worldSpace)\n    }\n\n    /**\n     * @deprecated - renamed to {@link setView} or {@link ICamera.setView}\n     * @param view\n     */\n    setCurrentCameraView(view: CameraView) {\n        return this.setView(view)\n    }\n\n\n    /**\n     * @deprecated - use {@link animateToView} instead\n     * @param view\n     */\n    async focusView(view: CameraView) {\n        return this.animateToView(view)\n    }\n\n    // endregion\n\n    private _lastAnimTime = -1\n\n    protected _postFrame() {\n        if (!this.enabled || !this._viewer) return\n        const camera = this._viewer.scene.mainCamera\n        if (!camera) return\n        if (!this._viewer.timeline.shouldRun() || !this._cameraViews.length) {\n            camera.setInteractions(true, CameraViewPlugin.PluginType + '-postFrame')\n            this._lastAnimTime = -1\n            return\n        }\n        camera.setInteractions(false, CameraViewPlugin.PluginType + '-postFrame')\n\n        const time = this._viewer.timeline.time\n        // const delta = this._viewer.timeline.delta || 0\n\n        if (time == this._lastAnimTime) return\n        this._lastAnimTime = time\n\n        const timeline = []\n        const viewDuration = this.animDuration || 1000\n        const pauseTime = this.viewPauseTime || 0\n        const views = this._cameraViews\n        let time1 = 0\n        for (let i = 0; i < views.length; i++) {\n            const view = views[i]\n            const duration = Math.max(2, view.duration * viewDuration) / 1000\n            timeline.push({\n                time: time1,\n                index: i,\n                duration: duration,\n            })\n            time1 += duration + pauseTime / 1000\n        }\n        const selectedTime = timeline\n            .sort((a, b) => -a.time + b.time)\n            .find(t => t.time <= time)\n        if (!selectedTime) return // todo?\n\n        const viewIndex = selectedTime.index\n\n        const start = selectedTime.time\n        const duration = selectedTime.duration ?? 0.5\n\n        const t = duration < 1e-6 ? 1 : (time - start) / duration\n        // const dt = duration < 1e-6 ? 0 : delta / duration\n\n        if (t > 1) return // todo?\n\n        // todo cache path\n        const {getPosition, getTarget} = createCameraPath(this.camViews)\n\n        getPosition(t, viewIndex, camera.position)\n        getTarget(t, viewIndex, camera.target)\n        camera.setDirty()\n\n        return true\n    }\n\n    // region to be ported to other plugins\n\n    // /**\n    //  * For slight rotation of camera when seekOnScroll is enabled\n    //  */\n    // private _pointerMove(ev: PointerEvent) {\n    //     if (this.isDisabled()) return\n    //     if (!this._animating && this.seekOnScroll) {\n    //         const cam = this._viewer?.scene.mainCamera\n    //         if (!cam) return\n    //         const s = new Spherical()\n    //         const p = cam.position\n    //         const t = cam.target\n    //         const q = new Quaternion().setFromUnitVectors(cam.cameraObject.up, new Vector3(0, 1, 0))\n    //         const qi = q.clone().invert()\n    //         const offset = p.clone().sub(t)\n    //         offset.applyQuaternion(q)\n    //         s.setFromVector3(offset)\n    //         s.theta += this.rotationOffset * ev.movementX / this._viewer!.canvas!.clientWidth\n    //         s.phi += this.rotationOffset * ev.movementY / this._viewer!.canvas!.clientHeight\n    //         s.makeSafe()\n    //         offset.setFromSpherical(s)\n    //         offset.applyQuaternion(qi)\n    //         p.copy(t).add(offset)\n    //         cam.setDirty()\n    //     }\n    // }\n\n    // // @uiToggle() @serialize()\n    // animateOnScroll = false // buggy\n    //\n    // @uiToggle() @serialize()\n    // seekOnScroll = false\n\n    // private _scrollAnimationState = 0\n    // scrollAnimationDamping = 0.1\n    // private _wheel(ev: any | WheelEvent) {\n    //     if (this.isDisabled()) return\n    //     if (this.seekOnScroll && !this._animating) {\n    //         // if (ev.deltaY > 0) this.focusNext(false)\n    //         // else this.focusPrevious(false)\n    //     } else if (Math.abs(ev.deltaY) > 0.001) {\n    //         this._scrollAnimationState = -1. * Math.sign(ev.deltaY)\n    //     }\n    // }\n\n\n    // private _driver: Driver = (update)=>{\n    //     return {\n    //         start: ()=>this._updaters.push({u:update, time:0}),\n    //         stop: ()=> this._updaters.splice(this._updaters.findIndex(u=>u.u === update), 1),\n    //     }\n    // }\n\n    // private _fadeDisabled = false\n\n    // todo: same code used in PopmotionPlugin, merge somehow\n    // private _postFrame() {\n    //     if (!this._viewer) return\n    //     if (this.isDisabled() || !this._animating) {\n    //         this._lastFrameTime = 0\n    //         if (this._fadeDisabled) {\n    //             this._viewer.getPluginByType<FrameFadePlugin>('FrameFade')?.enable(CameraViewPlugin.PluginType)\n    //             this._fadeDisabled = false\n    //         }\n    //         // console.log('not anim')\n    //         return\n    //     }\n    //     const time = now() / 1000.0\n    //     if (this._lastFrameTime < 1) this._lastFrameTime = time - 1.0 / 60.0\n    //     let delta = time - this._lastFrameTime\n    //     this._lastFrameTime = time\n    //     delta = delta * (this.animateOnScroll ? this._scrollAnimationState : 1)\n    //\n    //     const d = this._viewer.getPluginByType<ProgressivePlugin>('Progressive')?.postFrameConvergedRecordingDelta()\n    //     if (d && d > 0) delta = d\n    //     if (d === 0) return // not converged yet.\n    //     // if d < 0: not recording, do nothing\n    //\n    //     delta *= 1000\n    //\n    //     // delta = 16.666\n    //\n    //     // console.log(delta)\n    //     // console.log(dt)\n    //     //\n    //\n    //     if (delta <= 0) return\n    //\n    //     this._updaters.forEach(u=>{\n    //         let dt = delta\n    //         if (u.time + dt < 0) dt = -u.time\n    //         u.time += dt\n    //         if (Math.abs(dt) > 0.001)\n    //             u.u(dt)\n    //     })\n    //     if (this._scrollAnimationState < 0.001) this._scrollAnimationState = 0\n    //     else this._scrollAnimationState *= 1.0 - this.scrollAnimationDamping\n    //\n    //     if (!this._fadeDisabled) {\n    //         const ff = this._viewer.getPluginByType<FrameFadePlugin>('FrameFade')\n    //         if (ff) {\n    //             ff.disable(CameraViewPlugin.PluginType)\n    //             this._fadeDisabled = true\n    //         }\n    //     }\n    // }\n\n    // @uiButton('Record All Views')\n    // public async recordAllViews(onStart?: ()=>void, downloadOnEnd = true) {\n    //     if (this.isDisabled()) return\n    //     const recorder = this._viewer?.getPluginByType<CanvasRecorderPlugin>('CanvasRecorder')\n    //     if (!recorder || !recorder.enabled) return\n    //     if (this._cameraViews.length < 1) return\n    //     if (recorder.isRecording()) {\n    //         console.error('CanvasRecorderPlugin is already recording')\n    //         return\n    //     }\n    //     let looping = false\n    //     if (this.viewLooping) {\n    //         looping = true\n    //         this.viewLooping = false\n    //     }\n    // await this.resetToFirstView()\n    //     return new Promise<Blob|undefined>((resolve, reject) => {\n    //         const listener2 = ()=>{\n    //             recorder.removeEventListener('start', listenerStart)\n    //             recorder.removeEventListener('stop', listener2)\n    //             recorder.removeEventListener('error', listenerError)\n    //         }\n    //         const listenerStart = async() => {\n    //             listener2()\n    //             onStart?.()\n    //             await this.animateAllViews()\n    //             const blob = await recorder.stopRecording()\n    //             if (looping) this.viewLooping = true\n    //             if (downloadOnEnd) {\n    //                 const name = await this._viewer?.prompt('Canvas Recorder: Save file as', 'recording.mp4')\n    //                 if (name !== null && blob) await this._downloadBlob(blob, name || 'recording.mp4')\n    //             }\n    //             resolve(blob)\n    //         }\n    //         const listenerError = async() => {\n    //             listener2()\n    //             reject()\n    //         }\n    //         recorder.addEventListener('start', listenerStart)\n    //         recorder.addEventListener('stop', listener2)\n    //         recorder.addEventListener('error', listenerError)\n    //         if (!recorder.startRecording()) {\n    //             console.error('cannot start recording')\n    //             return\n    //         }\n    //     })\n    // }\n\n    // private async _downloadBlob(blob: Blob, name: string) {\n    //     const tr = this._viewer?.getPluginByType<FileTransferPlugin>('FileTransferPlugin')\n    //     if (!tr) {\n    //         this._viewer?.console.error('FileTransferPlugin required to export/download file')\n    //         return\n    //     }\n    //     await tr.exportFile(blob, name)\n    // }\n\n    // endregion\n}\n","import {AViewerPluginEventMap, type ThreeViewer} from '../../viewer/'\n// noinspection ES6PreferShortImport\nimport {AViewerPluginSync} from '../../viewer/AViewerPlugin'\nimport {Dropzone} from '../../utils'\nimport {uiButton, uiConfig, uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {AddAssetOptions, ImportFilesOptions, ImportResult, ImportAddOptions, GLTFLoader2} from '../../assetmanager'\nimport {parseFileExtension, serialize} from 'ts-browser-helpers'\n\nexport interface DropzonePluginOptions {\n    /**\n     * The DOM element to attach the dropzone to.\n     */\n    domElement?: HTMLElement\n    /**\n     * Allowed file extensions. If undefined, all files are allowed.\n     */\n    allowedExtensions?: string[]\n    /**\n     * Automatically import assets when dropped.\n     * @default true\n     */\n    autoImport?: boolean\n    /**\n     * Automatically add dropped and imported assets to the scene.\n     * Works only if {@link autoImport} is true.\n     * @default true\n     */\n    autoAdd?: boolean\n    /**\n     * Import options for the {@link AssetImporter.importFiles}, used when importing files.\n     */\n    importOptions?: ImportFilesOptions\n    /**\n     * Add options for the {@link RootScene.addObject}, used when adding assets to the scene.\n     */\n    addOptions?: AddAssetOptions\n}\n\nexport interface DropzonePluginEventMap extends AViewerPluginEventMap{\n    drop: {\n        files: Map<string, File>\n        imported?: Map<string, (ImportResult | undefined)[]>\n        assets?: (ImportResult | undefined)[]\n        nativeEvent: DragEvent\n    }\n}\n\n/**\n * Dropzone Plugin\n *\n * Adds a dropzone to the viewer for importing assets.\n *\n * Automatically imports and adds assets to the scene, the behavior can be configured.\n * @category Plugins\n */\n@uiFolderContainer('Dropzone')\nexport class DropzonePlugin extends AViewerPluginSync<DropzonePluginEventMap> {\n    static readonly PluginType = 'Dropzone'\n    static readonly OldPluginType = 'DropzonePlugin' // todo swap\n    declare uiConfig: UiObjectConfig\n    @uiToggle() @serialize() enabled = true\n    private _inputEl?: HTMLInputElement\n    private _dropzone?: Dropzone\n    private _allowedExtensions: string[]|undefined = undefined // undefined and empty array is different.\n\n    /**\n     * Automatically import assets when dropped.\n     */\n    @serialize() autoImport = true\n    /**\n     * Automatically add dropped and imported assets to the scene.\n     * Works only if {@link autoImport} is true.\n     */\n    @uiToggle() @serialize() autoAdd = true\n\n    /**\n     * Import options for the {@link AssetImporter.importFiles}\n     */\n    @uiConfig() @serialize() importOptions: ImportFilesOptions = {\n        autoImportZipContents: true,\n        forceImporterReprocess: false,\n        useMeshLines: GLTFLoader2.UseMeshLines,\n        createUniqueNames: GLTFLoader2.CreateUniqueNames,\n    }\n\n    /**\n     * Add options for the {@link RootScene.addObject}\n     */\n    @uiConfig() @serialize() addOptions: AddAssetOptions = {\n        autoCenter: true,\n        importConfig: true,\n        autoScale: true,\n        autoScaleRadius: 2,\n        centerGeometries: false, // in the whole hierarchy\n        centerGeometriesKeepPosition: true, // this centers while keeping world position\n        license: '',\n        clearSceneObjects: false,\n        disposeSceneObjects: false,\n        autoSetBackground: false,\n        autoSetEnvironment: true,\n    }\n\n    /**\n     * Allowed file extensions. If undefined, all files are allowed.\n     */\n    get allowedExtensions(): string[] | undefined {\n        return this._allowedExtensions\n    }\n\n    set allowedExtensions(value: string[] | undefined) {\n        this._allowedExtensions = value\n        if (this._inputEl) this._inputEl.accept = value ? value.map(v=>'.' + v).join(', ') : ''\n    }\n\n    /**\n     * Prompt for file selection using the browser file dialog.\n     */\n    @uiButton('Select Local files')\n    public promptForFile(): void {\n        if (this.isDisabled()) return\n        this.allowedExtensions = this._allowedExtensions\n        this._inputEl?.click()\n    }\n\n    /**\n     * Prompt for file url.\n     */\n    @uiButton('Import from URL')\n    public async promptForUrl(): Promise<void> {\n        if (this.isDisabled() || !this._viewer) return\n        const res = await this._viewer.dialog.prompt('Enter URL: Enter a public URL for a 3d file with extension', '', true)\n        if (!res || !res.length) return\n        await this.load(res, {}, true)\n    }\n\n    async load(res: string, options?: ImportAddOptions, dialog = false) {\n        if (!this._viewer) {\n            console.warn('DropzonePlugin: viewer not set')\n            return\n        }\n        if (this.autoImport) {\n            const manager = this._viewer.assetManager\n            const ext = parseFileExtension(res)\n            if (this._allowedExtensions && !this._allowedExtensions.includes(ext)) {\n                dialog && await this._viewer.dialog.alert(`DropzonePlugin: file extension ${ext} not allowed`)\n                return\n            }\n            const imported = await manager.importer.import(res, {\n                ...this.importOptions,\n                ...options ?? {},\n            })\n            const toAdd = [...imported ?? []].flat(2).filter(v => !!v) ?? []\n            if (this.autoAdd) {\n                return await manager.loadImported(toAdd, {\n                    ...this.addOptions,\n                    ...options ?? {},\n                })\n            }\n            return toAdd\n        } else {\n            dialog && await this._viewer.dialog.alert('DropzonePlugin: autoImport is disabled, file was not imported')\n        }\n    }\n\n    private _domElement?: HTMLElement\n    constructor(options?: DropzonePluginOptions) {\n        super()\n        if (!options) return\n        this._domElement = options.domElement\n        this.allowedExtensions = options.allowedExtensions\n        this.autoImport = options.autoImport ?? this.autoImport\n        this.autoAdd = options.autoAdd ?? this.autoAdd\n        this.importOptions = {...this.importOptions, ...options.importOptions}\n        this.addOptions = {...this.addOptions, ...options.addOptions}\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._inputEl = document.createElement('input')!\n        this._inputEl.type = 'file'\n        if (!this._domElement) this._domElement = viewer.canvas\n        this._dropzone = new Dropzone(this._domElement, this._inputEl, {\n            drop: this._onFileDrop.bind(this),\n        })\n        this.allowedExtensions = this._allowedExtensions\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        this._dropzone?.destroy()\n        this._dropzone = undefined\n        this._inputEl = undefined\n        super.onRemove(viewer)\n    }\n\n    private async _onFileDrop({files, nativeEvent}: {files: Map<string, File>, nativeEvent: DragEvent}) {\n        if (!files) return\n        if (this.isDisabled()) return\n        const viewer = this._viewer\n        if (!viewer) return\n        if (this._allowedExtensions !== undefined) {\n            for (const file of files.keys()) {\n                if (!this._allowedExtensions.includes(file.split('.').pop()?.toLowerCase() ?? '')) {\n                    files.delete(file)\n                }\n            }\n        }\n        if (files.size < 1) return\n        const manager = viewer.assetManager\n        let imported: Map<string, (ImportResult | undefined)[]>|undefined\n        let assets: (ImportResult | undefined)[]|undefined\n        if (this.autoImport) {\n            imported = await manager.importer.importFiles(files, {\n                allowedExtensions: this.allowedExtensions, ...this.importOptions,\n            })\n            if (this.autoAdd) {\n                const toAdd = [...imported?.values() ?? []].flat(2).filter(v=>!!v) ?? []\n                assets = await manager.loadImported(toAdd, {...this.addOptions})\n            }\n        }\n        this.dispatchEvent({type: 'drop', files, imported, assets, nativeEvent})\n    }\n\n}\n","// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n    // John Hable's filmic operator from Uncharted 2 video game\n    color *= toneMappingExposure;\n    return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( 1.0 ) ) );\n}\nvec3 CustomToneMapping( vec3 color ) { return Uncharted2ToneMapping( color ); }\n","int getToneMapBit(in int number) {\n    #ifdef WebGL2Context\n    return (number/2) % 2;\n    #else\n    return int(mod(floor(float(number)/2.), 2.));\n    #endif\n}\n\nvec3 TonemappingSaturation(vec3 rgb) {\n    const vec3 W = vec3(0.2125, 0.7154, 0.0721);\n    vec3 intensity = vec3(dot(rgb, W));\n    return mix(intensity, rgb, toneMappingSaturation);\n}\n\nvec3 TonemappingContrast(vec3 color){\n    return (color - vec3(0.5)) * toneMappingContrast + vec3(0.5);\n}\n\nvec4 ToneMapping(in vec4 color) {\n    vec4 outColor = color;\n\n    #if defined( TONE_MAPPING )\n\n    outColor.rgb = toneMapping(outColor.rgb);\n    outColor.rgb = TonemappingContrast(outColor.rgb);\n    outColor.rgb = TonemappingSaturation(outColor.rgb);\n\n    #endif\n\n    return outColor;\n}\n","bool doTonemap = true;\n#ifdef HAS_GBUFFER\n#ifdef GBUFFER_HAS_FLAGS\ndoTonemap = getToneMapBit(getGBufferFlags(vUv).a) > 0;\n#endif\n#if TONEMAP_BACKGROUND < 1 // todo - || (defined(CLIP_BACKGROUND) && CLIP_BACKGROUND > 0) || defined(CLIP_BACKGROUND_FORCE)\nif(isBackground) doTonemap = false; // isBackground defined in ScreenPass\n#endif\n#endif\nif(doTonemap) diffuseColor = ToneMapping(diffuseColor);\n","import {IPassID, IPipelinePass} from '../../postprocessing'\nimport {AViewerPluginEventMap, AViewerPluginSync, ISerializedConfig, ThreeViewer} from '../../viewer'\nimport {onChange, serialize} from 'ts-browser-helpers'\nimport {SerializationMetaType, wrapThisFunction2} from '../../utils'\nimport {uiToggle} from 'uiconfig.js'\nimport {ICamera, IRenderManager, IScene} from '../../core'\n\n/**\n * Pipeline Pass Plugin\n *\n * Base class for creating a plugin that registers a custom pass to the main render pipeline\n *\n * @category Plugins\n */\nexport abstract class PipelinePassPlugin<T extends IPipelinePass, TPassId extends IPassID, TEvent extends AViewerPluginEventMap = AViewerPluginEventMap, TViewer extends ThreeViewer=ThreeViewer> extends AViewerPluginSync<TEvent, TViewer> {\n    abstract passId: TPassId\n\n    @serialize()\n    @uiToggle('Enabled')\n    @onChange(PipelinePassPlugin.prototype.setDirty)\n        enabled = true\n\n    // @uiConfig()\n    @serialize('pass')\n    protected _pass?: T\n    protected abstract _createPass():T\n\n    /**\n     * This function is called every frame before composer render, if this pass is being used in the pipeline\n     * @param _\n     * @param _1\n     * @param _2\n     */\n    protected _beforeRender(_?: IScene, _1?: ICamera, _2?: IRenderManager): boolean {\n        if (!this._pass) return false\n        this._pass.enabled = !this.isDisabled()\n        return this._pass.enabled\n    }\n\n    constructor() {\n        super()\n        this._beforeRender = this._beforeRender.bind(this)\n    }\n    onAdded(viewer: TViewer): void {\n        super.onAdded(viewer)\n\n        this._pass = this._createPass()\n        this._pass.onDirty?.push(viewer.setDirty)\n        this._pass.beforeRender = wrapThisFunction2(this._beforeRender, this._pass.beforeRender)\n        viewer.renderManager.registerPass(this._pass)\n    }\n\n    onRemove(viewer: TViewer): void {\n        if (this._pass) {\n            viewer.renderManager.unregisterPass(this._pass)\n            if (this._pass.dispose) this._pass.dispose()\n        }\n        this._pass = undefined\n        super.onRemove(viewer)\n    }\n\n    get pass(): T | undefined {\n        return this._pass\n    }\n\n    toJSON(meta?: SerializationMetaType): ISerializedConfig&{pass?: any} {\n        return super.toJSON(meta)\n    }\n\n    fromJSON(data: ISerializedConfig&{pass?: any}, meta?: SerializationMetaType): this|null|Promise<this|null> {\n        return super.fromJSON(data, meta)\n    }\n\n    setDirty() {\n        if (this._pass) this._pass.enabled = !this.isDisabled()\n        this._viewer?.setDirty()\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 100) // adding delay for a few frames, so render target(if any can update)\n    }\n\n}\n","#ifndef UNPACK_GBUFFER_SNIPPET\n#define UNPACK_GBUFFER_SNIPPET\n\n//precision highp usampler2D;\n\nuniform sampler2D tNormalDepth;\n//float unpack16(vec2 value) {\n//    return (\n//    value.x*0.996108949416342426275150501169264316558837890625 +\n//    value.y*0.00389105058365758760263730664519243873655796051025390625\n//    );\n//}\nfloat unpack16(vec2 value){\n    return value.x+value.y/255.0;\n}\n\nvec3 unpackNormal(vec2 enc) {\n    vec2 fenc = enc*4.0-2.0;\n    float f = dot(fenc, fenc);\n    float g = sqrt(1.0-f/4.0);\n    return vec3(fenc*g, 1.0-f/2.0);\n}\nfloat unpackDepth(vec2 uncodedDepth) {\n    float x = unpack16(uncodedDepth.xy);\n    return x*x;\n}\n#define getDepth(uv) unpackDepth(texture2D(tNormalDepth, uv).xy)\n\nvoid getDepthNormal(const in vec2 uv, out float depth, out vec3 normal){\n    vec4 uncodedDepth = texture2D(tNormalDepth, uv);\n    depth = unpackDepth(uncodedDepth.xy);\n    normal = unpackNormal(uncodedDepth.zw);\n}\nvec3 getViewNormal(const in vec2 uv ) {\n    //    #if DEPTH_NORMAL_TEXTURE == 1\n    return unpackNormal( texture2D( tNormalDepth, uv ).zw );\n    //    #else\n    //    return unpackRGBToNormal( texture2D( tNormal, uv ).xyz );\n    //    #endif\n}\n#if defined(GBUFFER_HAS_FLAGS) && GBUFFER_HAS_FLAGS == 1\nuniform sampler2D tGBufferFlags;\n#endif\nivec4 getGBufferFlags(const in vec2 uv){\n    #if defined(GBUFFER_HAS_FLAGS) && GBUFFER_HAS_FLAGS == 1\n    return ivec4(texture2D(tGBufferFlags, uv) * 255.);\n    #else\n    return ivec4(1);\n    #endif\n}\n\n#if defined(GBUFFER_HAS_DEPTH_TEXTURE) && GBUFFER_HAS_DEPTH_TEXTURE == 1\n// NOT TESTED\nuniform sampler2D tGBufferDepthTexture;\n// needs <packing>. Its made sure that its included in the unpackExtension\nfloat getDepthTexture( vec2 coord, float cameraNear, float cameraFar ) {\n    float fragCoordZ = texture2D( tGBufferDepthTexture, coord ).x;\n    float viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n    return viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n}\n#endif\n\n//#if DEPTH_NORMAL_TEXTURE == 1\n//uniform sampler2D tNormalDepth;\n//#else\n//uniform sampler2D tNormal;\n//#endif\n\n//float decodeDepth( const in vec2 uv ) {\n//    vec4 uncodedDepth;\n//    #if DEPTH_PACKING_MODE == 2\n//    uncodedDepth = texture2D( tNormalDepth, uv );\n//    #else\n//    uncodedDepth = texture2D( tDepth, uv );\n//    #endif\n//\n//    #if DEPTH_PACKING_MODE == 0\n//    return uncodedDepth.x;\n//    #elif DEPTH_PACKING_MODE == 1\n//    #if LINEAR_DEPTH == 1\n//    return pow2(unpackRGBAToDepth(uncodedDepth));\n//    #else\n//    return unpackRGBAToDepth( uncodedDepth );\n//    #endif\n//    #else\n//    return pow2(unpack16(uncodedDepth.xy));\n//    #endif\n//}\n#endif\n","import {\n    ClampToEdgeWrapping,\n    Color,\n    DepthTexture,\n    FloatType,\n    IUniform,\n    NoBlending,\n    Texture,\n    TextureDataType,\n    UnsignedByteType,\n    UnsignedIntType,\n    UnsignedShortType,\n    WebGLRenderTarget,\n} from 'three'\nimport {GBufferRenderPass} from '../../postprocessing'\nimport {ThreeViewer, ViewerRenderManager} from '../../viewer'\nimport {MaterialExtension} from '../../materials'\nimport {PipelinePassPlugin} from '../base/PipelinePassPlugin'\nimport {uiFolderContainer, uiImage} from 'uiconfig.js'\nimport {shaderReplaceString} from '../../utils'\nimport GBufferUnpack from './shaders/GBufferPlugin.unpack.glsl'\nimport {ICamera, IMaterial, IObject3D, IRenderManager, IScene, ITexture} from '../../core'\nimport {GBufferMaterial, GBufferUpdater} from './GBufferMaterial'\nimport {IRenderTarget} from '../../rendering'\n\nexport type GBufferPluginTarget = WebGLRenderTarget & IRenderTarget\n// export type GBufferPluginTarget = WebGLRenderTarget\nexport type GBufferPluginPass = GBufferRenderPass<'gbuffer', GBufferPluginTarget|undefined>\n\n/**\n * G-Buffer Plugin\n *\n * Adds a pre-render pass to render the g-buffer(depth+normal+flags) to render target(s) that can be used as gbuffer and for postprocessing.\n * @category Plugins\n */\n@uiFolderContainer('G-Buffer Plugin')\nexport class GBufferPlugin\n    extends PipelinePassPlugin<GBufferPluginPass, 'gbuffer'> {\n\n    readonly passId = 'gbuffer'\n    public static readonly PluginType = 'GBuffer'\n\n    target?: GBufferPluginTarget\n\n    // @uiConfig({readOnly: true}) //  todo: fix bug in uiconfig or tpImageGenerator because of which 0 index is not showing in the UI, when we uncomment this\n    textures: Texture[] = []\n\n    @uiImage(undefined, {readOnly: true})\n    get normalDepthTexture(): ITexture|undefined {\n        return this.textures[0]\n    }\n\n    @uiImage(undefined, {readOnly: true})\n    get flagsTexture(): ITexture|undefined {\n        return this.textures[1]\n    }\n\n    @uiImage(undefined, {readOnly: true})\n    get depthTexture(): (ITexture&DepthTexture)|undefined {\n        return this.target?.depthTexture\n    }\n\n    // @uiConfig() // not supported in this material yet\n    material?: GBufferMaterial\n\n    // @onChange(GBufferPlugin.prototype._depthPackingChanged)\n    // @uiDropdown('Depth Packing', threeConstMappings.DepthPackingStrategies.uiConfig) packing: DepthPackingStrategies\n\n    // @onChange2(GBufferPlugin.prototype._createTargetAndMaterial)\n    // @uiDropdown('Buffer Type', threeConstMappings.TextureDataType.uiConfig)\n    readonly bufferType: TextureDataType // cannot be changed after creation (for now)\n\n    // @uiToggle()\n    // @onChange2(GBufferPlugin.prototype._createTargetAndMaterial)\n    readonly isPrimaryGBuffer: boolean // cannot be changed after creation (for now)\n\n    // protected _depthPackingChanged() {\n    //     this.material.depthPacking = this.depthPacking\n    //     this.material.needsUpdate = true\n    //     if (this.unpackExtension && this.unpackExtension.extraDefines) {\n    //         this.unpackExtension.extraDefines.DEPTH_PACKING = this.depthPacking\n    //         this.unpackExtension.setDirty?.()\n    //     }\n    //     this.setDirty()\n    // }\n\n    unpackExtension: MaterialExtension = {\n        /**\n         * Use this in shader to get the snippet\n         * ```\n         * // for gbuffer\n         * #include <packing>\n         * #define THREE_PACKING_INCLUDED\n         * ```\n         * or if you don't need packing include\n         * ```\n         * #include <gbuffer_unpack>\n         * ```\n         * @param shader\n         */\n        shaderExtender: (shader)=>{\n            const includes = ['gbuffer_unpack', 'packing'] as const\n            const include = includes.find(i=>shader.fragmentShader.includes(`#include <${i}>`))\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader,\n                `#include <${include}>`,\n                '\\n' + GBufferUnpack + '\\n', {append: include === 'packing'})\n        },\n        extraUniforms: {\n            tNormalDepth: ()=>({value: this.normalDepthTexture}),\n            tGBufferFlags: ()=>({value: this.flagsTexture}),\n            tGBufferDepthTexture: ()=>({value: this.depthTexture}),\n        },\n        extraDefines: {\n            // ['GBUFFER_PACKING']: BasicDepthPacking,\n            ['HAS_NORMAL_DEPTH_BUFFER']: ()=>this.normalDepthTexture ? 1 : undefined,\n            ['GBUFFER_HAS_DEPTH_TEXTURE']: ()=>this.depthTexture ? 1 : undefined,\n            ['GBUFFER_HAS_FLAGS']: ()=>this.flagsTexture ? 1 : undefined,\n            // ['HAS_FLAGS_BUFFER']: ()=>this.flagsTexture ? 1 : undefined,\n            ['HAS_GBUFFER']: ()=>this.isPrimaryGBuffer && this.normalDepthTexture ? 1 : undefined,\n            // LINEAR_DEPTH: 1, // to tell that the depth is linear. todo; see SSAOPlugin. also add support in DepthBufferPlugin?\n        },\n        priority: 100,\n        isCompatible: () => true,\n    }\n\n    createMaterial() {\n        const useMultiple = this._viewer?.renderManager.isWebGL2 && this.renderFlagsBuffer\n        return new GBufferMaterial(useMultiple, {\n            blending: NoBlending,\n            transparent: true,\n        })\n    }\n\n    private _isPrimaryGBufferSet = false\n    protected _createTargetAndMaterial(recreateTarget = true) {\n        if (!this._viewer) return\n        if (recreateTarget) this._disposeTarget()\n        const useMultiple = this._viewer?.renderManager.isWebGL2 && this.renderFlagsBuffer\n        if (!this.target) {\n            const rm = this._viewer.renderManager\n            this.target = this._viewer.renderManager.createTarget<GBufferPluginTarget>(\n                {\n                    depthBuffer: true,\n                    samples: this._viewer.renderManager.zPrepass && this.isPrimaryGBuffer && rm.msaa ? // requirement for zPrepass\n                        typeof rm.msaa !== 'number' ? ViewerRenderManager.DEFAULT_MSAA_SAMPLES : rm.msaa : 0,\n                    type: this.bufferType,\n                    textureCount: useMultiple ? 2 : 1,\n                    depthTexture: this.renderDepthTexture,\n                    depthTextureType: this.depthTextureType,\n                    // magFilter: NearestFilter,\n                    // minFilter: NearestFilter,\n                    // generateMipmaps: false,\n                    // encoding: LinearEncoding,\n                    wrapS: ClampToEdgeWrapping,\n                    wrapT: ClampToEdgeWrapping,\n                })\n            if (Array.isArray(this.target.textures) && this.target.textures.length > 1) {\n                this.target.textures[0].name = 'gbufferDepthNormal'\n                this.target.textures[1].name = 'gbufferFlags'\n                this.textures = [...this.target.textures]\n\n                // todo flag buffer filtering?\n                // const flagTexture = this.flagsTexture\n                // flagTexture.generateMipmaps = false\n                // flagTexture.minFilter = NearestFilter\n                // flagTexture.magFilter = NearestFilter\n\n            } else {\n                this.target.texture.name = 'gbufferDepthNormal'\n                this.textures.push(this.target.texture)\n            }\n        }\n\n        if (!this.material) {\n            this.material = this.createMaterial()\n        }\n\n        // if (this._pass) this._pass.target = this.target\n\n        if (this.isPrimaryGBuffer) {\n            this._viewer.renderManager.gbufferTarget = this.target\n            this._viewer.renderManager.gbufferUnpackExtension = this.unpackExtension\n            this._viewer.renderManager.screenPass.material.registerMaterialExtensions([this.unpackExtension])\n            this._isPrimaryGBufferSet = true\n        }\n    }\n\n    protected _disposeTarget() {\n        if (!this._viewer) return\n        if (this.target) {\n            this._viewer.renderManager.disposeTarget(this.target)\n            this.target = undefined\n        }\n        this.textures = []\n        if (this._isPrimaryGBufferSet) { // using a separate flag as when isPrimaryGBuffer is changed, we cannot check it.\n            this._viewer.renderManager.gbufferTarget = undefined\n            this._viewer.renderManager.gbufferUnpackExtension = undefined\n            // this._viewer.renderManager.screenPass.material.unregisterMaterialExtensions([this.unpackExtension]) // todo\n            this._isPrimaryGBufferSet = false\n        }\n    }\n\n    protected _createPass() {\n        this._createTargetAndMaterial(true)\n        if (!this.target) throw new Error('GBufferPlugin: target not created')\n        if (!this.material) throw new Error('GBufferPlugin: material not created')\n        this.material.userData.isGBufferMaterial = true\n        const pass = new GBufferRenderPass(this.passId, ()=>this.target, this.material, new Color(1, 1, 1), 1)\n        const preprocessMaterial = pass.preprocessMaterial\n        pass.preprocessMaterial = (m) => preprocessMaterial(m, m.userData.renderToDepth) // if renderToDepth is undefined then renderToGbuffer is taken internally\n\n        // not calling super, since we don't want to check for depth here\n        // const preprocessObject = pass.preprocessObject\n        pass.preprocessObject = (object: IObject3D) => {\n            if (object.customGBufferMaterial) {\n                const mat = object.customGBufferMaterial\n                mat.allowOverride = false\n                // todo save the current forcedOverrideMaterial to restore it later?\n                const current = object.material\n                object.forcedOverrideMaterial = mat\n                const current0 = Array.isArray(current) ? current[0] : current\n                if (current0) {\n                    mat.userData.renderToGBuffer = current0.userData.renderToGBuffer\n                    mat.userData.renderToDepth = current0.userData.renderToDepth\n                    mat.userData.pluginsDisabled = current0.userData.pluginsDisabled\n                    // todo other plugin userData\n                    mat.side = current0.side\n                }\n                return mat as IMaterial\n            }\n            // return preprocessObject(object)\n            return object.material\n        }\n\n        // const postprocessObject = pass.postprocessObject\n        pass.postprocessObject = (object: IObject3D) => {\n            if (object.customGBufferMaterial) {\n                delete object.forcedOverrideMaterial\n            }\n            // postprocessObject(object)\n        }\n\n        pass.before = ['render']\n        pass.after = []\n        pass.required = ['render']\n        return pass\n    }\n\n    protected _beforeRender(scene: IScene, camera: ICamera, renderManager: IRenderManager): boolean {\n        if (!super._beforeRender(scene, camera, renderManager) || !this.material) return false\n        // this is done in the material now.\n        // camera.updateShaderProperties(this.material)\n        return true\n    }\n\n    constructor(\n        bufferType: TextureDataType = UnsignedByteType,\n        isPrimaryGBuffer = true,\n        enabled = true,\n        public renderFlagsBuffer: boolean = true,\n        public renderDepthTexture: boolean = false,\n        public depthTextureType: typeof UnsignedShortType | typeof UnsignedIntType | typeof FloatType /* | typeof UnsignedInt248Type*/ = UnsignedIntType,\n        // packing: DepthPackingStrategies = BasicDepthPacking,\n    ) {\n        super()\n        this.enabled = enabled\n        this.bufferType = bufferType\n        this.isPrimaryGBuffer = isPrimaryGBuffer\n        // this.depthPacking = depthPacking\n    }\n\n    registerGBufferUpdater(key: string, updater: GBufferUpdater['updateGBufferFlags']): void {\n        if (this.material) this.material.flagUpdaters.set(key, updater)\n    }\n\n    unregisterGBufferUpdater(key: string): void {\n        if (this.material) this.material.flagUpdaters.delete(key)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        this._disposeTarget()\n        this.material?.dispose()\n        this.material = undefined\n        return super.onRemove(viewer)\n    }\n\n    /**\n     * @deprecated use {@link normalDepthTexture} instead\n     */\n    getDepthNormal() {\n        return this.textures.length > 0 ? this.textures[0] : undefined\n    }\n    /**\n     * @deprecated use {@link flagsTexture} instead\n     */\n    getFlagsTexture() {\n        return this.textures.length > 1 ? this.textures[1] : undefined\n    }\n\n    /**\n     * @deprecated use {@link target} instead\n     */\n    getTarget() {\n        return this.target\n    }\n\n    /**\n     * @deprecated use {@link unpackExtension} instead\n     */\n    getUnpackSnippet(): string {\n        return GBufferUnpack\n    }\n\n    /**\n     * @deprecated use {@link unpackExtension} instead, it adds the same uniforms and defines\n     * @param material\n     */\n    updateShaderProperties(material: {defines: Record<string, string | number | undefined>; uniforms: {[p: string]: IUniform}, needsUpdate?: boolean}): this {\n        if (material.uniforms.tNormalDepth) material.uniforms.tNormalDepth.value = this.normalDepthTexture ?? undefined\n        else this._viewer?.console.warn('BaseRenderer: no uniform: tNormalDepth')\n        if (material.uniforms.tGBufferFlags) {\n            material.uniforms.tGBufferFlags.value = this.flagsTexture ?? undefined\n            const t = material.uniforms.tGBufferFlags.value ? 1 : 0\n            if (t !== material.defines.GBUFFER_HAS_FLAGS) {\n                material.defines.GBUFFER_HAS_FLAGS = t\n                material.needsUpdate = true\n            }\n        }\n        return this\n    }\n\n}\n","import {type AViewerPlugin, AViewerPluginEventMap, AViewerPluginSync} from '../../viewer/AViewerPlugin'\nimport type {ThreeViewer} from '../../viewer'\nimport {MaterialExtension, MaterialExtensionShader} from '../../materials'\nimport {Vector4, WebGLRenderer} from 'three'\nimport {IMaterial} from '../../core'\nimport {shaderReplaceString} from '../../utils'\nimport {GBufferPlugin} from '../pipeline/GBufferPlugin'\nimport {GBufferUpdater, GBufferUpdaterContext} from '../pipeline/GBufferMaterial'\n\n/**\n * Base Screen Pass Extension Plugin\n *\n * Extend the class to add an extension to {@link ScreenPass} material.\n * See {@link TonemapPlugin} and {@link VignettePlugin} for examples.\n *\n *\n * @category Plugins\n */\nexport abstract class AScreenPassExtensionPlugin<TE extends AViewerPluginEventMap = AViewerPluginEventMap> extends AViewerPluginSync<TE> implements MaterialExtension, GBufferUpdater {\n    declare ['constructor']: (typeof AScreenPassExtensionPlugin) & (typeof AViewerPluginSync) & (typeof AViewerPlugin)\n\n    abstract enabled: boolean\n\n    set uniformsNeedUpdate(v: boolean) { // for @uniform decorator\n        if (v) this.setDirty()\n    }\n\n    constructor(shaderPatch = '') {\n        super()\n        this._shaderPatch = shaderPatch\n        this.setDirty = this.setDirty.bind(this)\n    }\n\n    /**\n     * The priority of the material extension when applied to the material in ScreenPass\n     * set to very low priority, so applied at the end\n     */\n    priority = -100\n\n    protected _shaderPatch = ''\n\n    shaderExtender(shader: MaterialExtensionShader, _: IMaterial, _1: WebGLRenderer): void {\n        if (this.isDisabled()) return\n\n        shader.fragmentShader = shaderReplaceString(\n            shader.fragmentShader,\n            '#glMarker', '\\n' + this._shaderPatch + '\\n',\n            {prepend: true}\n        )\n    }\n\n    getUiConfig(): any {\n        return this.uiConfig\n    }\n\n    computeCacheKey = (_: IMaterial) => this.isDisabled() ? '0' : '1'\n\n    isCompatible(_: IMaterial): boolean {\n        return true // (material as MeshStandardMaterial2).isMeshStandardMaterial2\n    }\n\n    setDirty() {\n        this.__setDirty?.() // this will update version which will set needsUpdate on material\n        this._viewer?.renderManager.screenPass.setDirty()\n    }\n\n    fromJSON(data: any, meta?: any): this | null | Promise<this | null> {\n        // really old legacy\n        if (data.pass) {\n            data = {...data}\n            data.extension = {...data.pass}\n            delete data.extension.enabled\n            delete data.pass\n        }\n        // legacy\n        if (data.extension) {\n            data = {...data, ...data.extension}\n            delete data.extension\n        }\n        return super.fromJSON(data, meta)\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.forPlugin(GBufferPlugin, (gbuffer) => {\n            gbuffer.registerGBufferUpdater(this.constructor.PluginType, this.updateGBufferFlags.bind(this))\n        }, (gbuffer)=>{\n            gbuffer.unregisterGBufferUpdater(this.constructor.PluginType)\n        }, this)\n        viewer.renderManager.screenPass.material.registerMaterialExtensions([this])\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.getPlugin(GBufferPlugin)?.unregisterGBufferUpdater(this.constructor.PluginType)\n        viewer.renderManager.screenPass.material.unregisterMaterialExtensions([this])\n        super.onRemove(viewer)\n    }\n\n    // for typescript\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    __setDirty?: () => void\n\n    updateGBufferFlags(_: Vector4, _1: GBufferUpdaterContext): void {\n        return\n    }\n\n}\n","// noinspection ES6PreferShortImport\nimport {uiDropdown, uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {\n    ACESFilmicToneMapping,\n    AgXToneMapping,\n    CineonToneMapping,\n    CustomToneMapping,\n    LinearToneMapping,\n    Object3D,\n    ReinhardToneMapping,\n    ShaderChunk,\n    ToneMapping,\n    Vector4,\n    WebGLRenderer,\n} from 'three'\nimport {glsl, onChange, serialize} from 'ts-browser-helpers'\nimport {IMaterial} from '../../core'\nimport {updateBit} from '../../utils'\nimport {uniform} from '../../three'\nimport Uncharted2ToneMappingShader from './shaders/Uncharted2ToneMapping.glsl'\nimport TonemapShader from './shaders/TonemapPlugin.pars.glsl'\nimport TonemapShaderPatch from './shaders/TonemapPlugin.patch.glsl'\nimport {AScreenPassExtensionPlugin} from './AScreenPassExtensionPlugin'\nimport {GBufferUpdaterContext} from '../pipeline/GBufferMaterial'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const Uncharted2Tonemapping: ToneMapping = CustomToneMapping\n\n/**\n * Tonemap Plugin\n *\n * Adds an extension to {@link ScreenPass} material\n * for applying tonemapping on the final buffer before rendering to screen.\n *\n * Also adds support for Uncharted2 tone-mapping.\n * @category Plugins\n */\n@uiFolderContainer('Tonemapping')\nexport class TonemapPlugin extends AScreenPassExtensionPlugin {\n    static readonly PluginType = 'Tonemap'\n\n    readonly extraUniforms = {\n        toneMappingContrast: {value: 1},\n        toneMappingSaturation: {value: 1},\n    } as const\n\n    readonly extraDefines = {\n        ['TONEMAP_BACKGROUND']: ()=>this.tonemapBackground === false || this._viewer?.scene.backgroundTonemap === false ? '0' : '1',\n    } as const\n\n    @serialize()\n    @onChange(TonemapPlugin.prototype.setDirty)\n    @uiToggle('Enabled')\n        enabled = true\n\n    @uiDropdown('Mode', ([\n        ['Linear', LinearToneMapping],\n        ['Reinhard', ReinhardToneMapping],\n        ['Cineon', CineonToneMapping],\n        ['ACESFilmic', ACESFilmicToneMapping],\n        ['Uncharted2', Uncharted2Tonemapping],\n        ['AgX', AgXToneMapping],\n    ] as [string, ToneMapping][]).map(value => ({\n        label: value[0],\n        value: value[1],\n    })))\n    @onChange(TonemapPlugin.prototype.setDirty)\n    @serialize() toneMapping: ToneMapping = ACESFilmicToneMapping\n\n    /**\n     * Global toggle to apply tonemapping on the background.\n     * The tonemapping is not applied if either this or {@link RootScene.backgroundTonemap} is false.\n     */\n    @onChange(TonemapPlugin.prototype.setDirty)\n    @serialize() tonemapBackground = true\n\n    // todo handle legacy deserialize\n    // moved to ScreenPass.clipBackground\n    // @onChange(TonemapPlugin.prototype.setDirty)\n    // @uiToggle('Clip Background')\n    // @serialize() clipBackground = false\n\n    @onChange(TonemapPlugin.prototype.setDirty)\n    @uiSlider('Exposure', [0, 2 * Math.PI], 0.01)\n    @serialize() exposure = 1\n\n    @uiSlider('Saturation', [0, 2], 0.01)\n    @uniform({propKey: 'toneMappingSaturation'})\n    @serialize() saturation: number\n\n    @uiSlider('Contrast', [0, 2], 0.01)\n    @uniform({propKey: 'toneMappingContrast'})\n    @serialize() contrast: number\n\n    /**\n     * The priority of the material extension when applied to the material in ScreenPass\n     * set to very low priority, so applied at the end\n     */\n    priority = -100\n\n    parsFragmentSnippet = () => {\n        if (this.isDisabled()) return ''\n\n        return glsl`\n            uniform float toneMappingContrast;\n            uniform float toneMappingSaturation;\n            ${TonemapShader}\n        `\n    }\n\n    protected _shaderPatch = TonemapShaderPatch\n\n    private _rendererState: any = {}\n\n    onObjectRender(_: Object3D, material: IMaterial, renderer: WebGLRenderer): void {\n        if (this.isDisabled()) return\n        const {toneMapping, toneMappingExposure} = renderer\n        this._rendererState.toneMapping = toneMapping\n        this._rendererState.toneMappingExposure = toneMappingExposure\n\n        renderer.toneMapping = this.toneMapping\n        renderer.toneMappingExposure = this.exposure\n        material.toneMapped = true\n        material.needsUpdate = true\n    }\n\n    onAfterRender(_: Object3D, _1: IMaterial, renderer: WebGLRenderer): void {\n        renderer.toneMapping = this._rendererState.toneMapping\n        renderer.toneMappingExposure = this._rendererState.toneMappingExposure\n    }\n\n    fromJSON(data: any, meta?: any): this|null|Promise<this|null> {\n        // legacy\n        if (data.extension) {\n            if (data.clipBackground !== undefined) {\n                if (this._viewer) this._viewer.renderManager.screenPass.clipBackground = data.clipBackground\n                else console.warn('TonemapPlugin: no viewer attached, clipBackground ignored')\n                delete data.clipBackground\n            }\n        }\n        return super.fromJSON(data, meta)\n    }\n\n    // TODO: add gBufferData or just tonemapEnabled to the scene material UI with an extension like bloom\n    updateGBufferFlags(data: Vector4, c: GBufferUpdaterContext): void {\n        const x = (c.material.userData.gBufferData?.tonemapEnabled ?? c.material?.userData.postTonemap) === false ? 0 : 1\n        data.w = updateBit(data.w, 1, x) // 2nd Bit\n        super.updateGBufferFlags(data, c)\n    }\n\n    static {\n        // Add support for Uncharted2 tone mapping\n        ShaderChunk.tonemapping_pars_fragment = ShaderChunk.tonemapping_pars_fragment.replace('vec3 CustomToneMapping( vec3 color ) { return color; }', Uncharted2ToneMappingShader)\n    }\n\n}\n","export const VERSION = '0.5.0'\n","import {\n    BaseEvent,\n    CanvasTexture,\n    Color,\n    Event,\n    EventDispatcher,\n    EventListener2,\n    LinearSRGBColorSpace,\n    Object3D,\n    Quaternion,\n    Scene,\n    Vector2,\n    Vector3, Vector3Tuple,\n} from 'three'\nimport {Class, createCanvasElement, downloadBlob, onChange, serialize, ValOrArr} from 'ts-browser-helpers'\nimport {TViewerScreenShader} from '../postprocessing'\nimport {\n    AddObjectOptions,\n    IAnimationLoopEvent,\n    ICamera,\n    iCameraCommons,\n    IGeometry,\n    IMaterial,\n    IObject3D,\n    ISceneEventMap,\n    ITexture,\n    OrthographicCamera2,\n    PerspectiveCamera2,\n    RootScene,\n    TCameraControlsMode,\n} from '../core'\nimport {ViewerRenderManager} from './ViewerRenderManager'\nimport {\n    convertArrayBufferToStringsInMeta,\n    EasingFunctionType,\n    getEmptyMeta,\n    GLStatsJS,\n    IDialogWrapper,\n    jsonToBlob,\n    metaFromResources,\n    MetaImporter,\n    metaToResources,\n    SerializationMetaType,\n    SerializationResourcesType,\n    ThreeSerialization,\n    windowDialogWrapper,\n} from '../utils'\nimport {\n    AssetManager,\n    AssetManagerOptions,\n    BlobExt,\n    ExportFileOptions,\n    IAsset,\n    ImportAddOptions,\n    ImportAssetOptions,\n    ImportResult,\n    RootSceneImportResult,\n} from '../assetmanager'\nimport {IViewerPlugin, IViewerPluginSync} from './IViewerPlugin'\nimport {uiConfig, UiObjectConfig, uiPanelContainer, uiToggle} from 'uiconfig.js'\nimport {IRenderTarget} from '../rendering'\nimport type {\n    AssetExporterPlugin,\n    CanvasSnapshotPlugin,\n    FileTransferPlugin,\n    ProgressivePlugin,\n} from '../plugins'\nimport {CameraViewPlugin} from '../plugins/animation/CameraViewPlugin'\n// noinspection ES6PreferShortImport\nimport {DropzonePlugin, DropzonePluginOptions} from '../plugins/interaction/DropzonePlugin'\n// noinspection ES6PreferShortImport\nimport {TonemapPlugin} from '../plugins/postprocessing/TonemapPlugin'\nimport {VERSION} from './version'\nimport {OrbitControls3} from '../three'\n\nimport {Object3DManager} from '../assetmanager/Object3DManager'\nimport {ViewerTimeline} from '../utils/ViewerTimeline'\nimport {defaultObjectProcessor} from '../utils/objectProcessor'\nimport {AViewerPlugin} from './AViewerPlugin'\n\n// todo make proper event map\nexport interface IViewerEvent extends BaseEvent, Partial<IAnimationLoopEvent> {\n    type: '*'|'update'|'preRender'|'postRender'|'preFrame'|'postFrame'|'dispose'|'addPlugin'|'removePlugin'|'renderEnabled'|'renderDisabled'|'renderError'\n    eType?: '*'|'update'|'preRender'|'postRender'|'preFrame'|'postFrame'|'dispose'|'addPlugin'|'removePlugin'|'renderEnabled'|'renderDisabled'|'renderError'\n    [p: string]: any\n}\nexport type IViewerEventTypes = IViewerEvent['type']\nexport interface ISerializedConfig {\n    assetType: 'config',\n    type: string,\n    metadata?: {\n        generator: string,\n        version: number,\n        [key: string]: any\n    },\n    [key: string]: any\n}\nexport interface ISerializedViewerConfig extends ISerializedConfig{\n    type: 'ThreeViewer'|'ViewerApp',\n    version: string,\n    plugins: ISerializedConfig[],\n    resources?: Partial<SerializationResourcesType> | SerializationMetaType\n    renderManager?: any // todo\n    scene?: any\n\n    [key: string]: any\n}\n\nexport interface ViewerEventMap{\n    preFrame: {\n        time: number,\n        deltaTime: number,\n        timeline: {time: number, delta: number},\n        resized: boolean,\n    },\n}\nexport interface ViewerEventListener<T extends keyof ViewerEventMap>{\n    callback: (event: ViewerEventMap[T] & {type: T, target: ThreeViewer})=> void,\n    order?: number\n}\n\nexport type IConsoleWrapper = Partial<Console> & Pick<Console, 'log'|'warn'|'error'>\n\n/**\n * Options for the ThreeViewer creation.\n * @category Viewer\n */\nexport interface ThreeViewerOptions {\n    /**\n     * The canvas element to use for rendering. Only one of container and canvas must be specified.\n     */\n    canvas?: HTMLCanvasElement,\n    /**\n     * The container for the canvas. A new canvas will be created in this container. Only one of container and canvas must be specified.\n     */\n    container?: HTMLElement,\n    /**\n     * The fragment shader snippet to render on screen.\n     */\n    screenShader?: TViewerScreenShader,\n    /**\n     * Use MSAA.\n     * Renders objects in a multi-sampled buffer.\n     * @default false\n     */\n    msaa?: boolean,\n    /**\n     * Use Uint8 RGBM HDR Render Pipeline.\n     * Provides better performance with post-processing.\n     * RenderManager Uses Half-float if set to false.\n     * @default true\n     */\n    rgbm?: boolean\n    /**\n     * Use rendered gbuffer as depth-prepass / z-prepass. (Requires DepthBufferPlugin/GBufferPlugin).\n     * Set it to true if you only have opaque objects in the scene to get better performance.\n     *\n     * @default false\n     *\n     * todo fix: It should be disabled when there are any transparent/transmissive objects with render to depth buffer enabled, see forceZPrepass\n     */\n    zPrepass?: boolean\n    // /**\n    //  * Force z-prepass even if there are transparent/transmissive objects with render to depth buffer enabled.\n    //  * Not implemented\n    //  */\n    // forceZPrepass?: boolean // todo\n\n    /**\n     * Render scale, 1 = full resolution, 0.5 = half resolution, 2 = double resolution.\n     * Same as pixelRatio in three.js\n     * Can be set to `window.devicePixelRatio` to render at device resolution in browsers.\n     * An optimal value is `Math.min(2, window.devicePixelRatio)` to prevent issues on mobile. This is set when 'auto' is passed.\n     * @default 1\n     */\n    renderScale?: number | 'auto'\n    /**\n     * Max render scale when set to 'auto'\n     * @default 2\n     */\n    maxRenderScale?: number\n\n    /**\n     * Default Background color of the scene.\n     * To set the background texture/map, use {@link ThreeViewerOptions.load.background} or {@link setBackgroundMap}\n     * @default '#ffffff' (white)\n     */\n    backgroundColor?: string | Color | number | null\n\n    /**\n     * Model Root Scale\n     * @default 1\n     */\n    modelRootScale?: number\n    /**\n     * Enable stencil in renderer and stencilBuffer in composer render targets.\n     * @default false\n     */\n    stencil?: boolean\n\n    debug?: boolean\n\n    /**\n     * Add initial plugins.\n     */\n    plugins?: (IViewerPluginSync | Class<IViewerPluginSync>)[]\n\n    load?: {\n        /**\n         * Load one or more source files\n         */\n        src?: ValOrArr<string | IAsset | null>\n\n        /**\n         * Load environment map\n         */\n        environment?: string | IAsset | ITexture | undefined | null\n\n        /**\n         * Load background map\n         */\n        background?: string | IAsset | ITexture | undefined | null\n\n    }\n    onLoad?: (results: any) => void\n\n    /**\n     * TonemapPlugin is added to the viewer if this is true.\n     * @default true\n     */\n    tonemap?: boolean\n\n    camera?: {\n        type?: 'perspective'|'orthographic',\n        controlsMode?: TCameraControlsMode,\n        position?: Vector3|Vector3Tuple,\n        target?: Vector3|Vector3Tuple,\n    } | ICamera\n\n    rootScene?: RootScene\n\n    /**\n     * Max HDR intensity for rendering and post-processing.\n     * Values above this might be clamped during post-processing.\n     * @default 72 (when rgbm is false), 16 (when rgbm is true)\n     */\n    maxHDRIntensity?: number\n\n    /**\n     * Power preference for the WebGL context.\n     * @default 'high-performance'\n     */\n    powerPreference?: WebGLPowerPreference\n\n    /**\n     * Options for the asset manager.\n     */\n    assetManager?: AssetManagerOptions\n\n    /**\n     * Add the dropzone plugin to the viewer, allowing to drag and drop files into the viewer over the canvas/container.\n     * Set to true/false to enable/disable the plugin, or pass options to configure the plugin. Assuming true if options are passed.\n     * @default - false\n     */\n    dropzone?: boolean|DropzonePluginOptions\n\n    /**\n     * If true, will stop event propagation on all pointer events on the viewer container (when camera interactions are enabled).\n     *\n     * Set this to true when the viewer is inside a carousel or similar component that might interfere with pointer events.\n     * @default false\n     */\n    stopPointerEventPropagation?: boolean\n\n\n    /**\n     * By default, all imported assets are cached in memory, so that calling import/load would return the same instance of an asset if the same source and options is passed again.\n     * Set this to `false` to disable this caching.\n     * @default true\n     */\n    cacheImportedAssets?: boolean\n\n    /**\n     * @deprecated use {@link msaa} instead\n     */\n    isAntialiased?: boolean,\n    /**\n     * @deprecated use {@link rgbm} instead\n     */\n    useRgbm?: boolean\n    /**\n     * @deprecated use {@link zPrepass} instead\n     */\n    useGBufferDepth?: boolean\n\n}\n\nfunction getPluginTypes(plugin: IViewerPlugin) {\n    const types: string[] = []\n    let prot = Object.getPrototypeOf(plugin)\n    while (prot) {\n        if (prot.constructor?.PluginType) types.push(prot.constructor.PluginType)\n        if (prot.constructor?.OldPluginType) types.push(prot.constructor.OldPluginType)\n        prot = Object.getPrototypeOf(prot)\n    }\n    return types\n}\n\n/**\n * Three Viewer\n *\n * The ThreeViewer is the main class in the framework to manage a scene, render and add plugins to it.\n * @category Viewer\n */\n@uiPanelContainer('Viewer')\nexport class ThreeViewer extends EventDispatcher<Record<IViewerEventTypes, IViewerEvent>> {\n    public static readonly VERSION = VERSION\n\n    public static readonly ConfigTypeSlug = 'vjson'\n\n    declare uiConfig: UiObjectConfig\n\n    static Console: IConsoleWrapper = {\n        log: console.log.bind(console),\n        warn: console.warn.bind(console),\n        error: console.error.bind(console),\n    }\n\n    static Dialog: IDialogWrapper = windowDialogWrapper\n\n    @serialize() readonly type = 'ThreeViewer'\n\n    /**\n     * If the viewer is enabled. Set this `false` to disable RAF loop.\n     */\n    enabled = true\n\n    /**\n     * Enable or disable all rendering.\n     * When disabled, the animation loop is still running, but nothing is rendered.\n     * This can be used to pause rendering when not needed, for example when the viewer is not visible.\n     * Note: this does not pause plugins or the timeline, use {@link enabled} for that.\n     */\n    @onChange(ThreeViewer.prototype._renderEnabledChanged)\n    @uiToggle('Enable Rendering', {tags: ['advanced']})\n        renderEnabled = true // todo add a separate animation loop enabled?\n\n    readonly assetManager: AssetManager\n    readonly object3dManager: Object3DManager\n\n    @uiConfig(undefined, {label: 'Rendering', expanded: true}) @serialize('renderManager')\n    readonly renderManager: ViewerRenderManager\n\n    /**\n     * The Scene attached to the viewer, this cannot be changed.\n     * @type {RootScene}\n     */\n    @uiConfig(undefined, {label: 'Scene', expanded: true}) @serialize('scene')\n    private readonly _scene: RootScene\n\n    /**\n     * Main timeline for the viewer.\n     *\n     * It's a WIP, API might change.\n     */\n    @uiConfig(undefined, {label: 'Timeline', expanded: true, tags: ['advanced']})\n    @serialize('timeline')\n    readonly timeline = new ViewerTimeline()\n\n    get materialManager() {\n        return this.assetManager.materials\n    }\n\n    public readonly plugins: Record<string, IViewerPlugin> = {}\n\n    /**\n     * Scene with object hierarchy used for rendering\n     */\n    get scene(): RootScene&Scene {\n        return this._scene as RootScene&Scene\n    }\n\n    /**\n     * Specifies how many frames to render in a single request animation frame. Keep to 1 for realtime rendering.\n     * Note: should be max (screen refresh rate / animation frame rate) like 60Hz / 30fps\n     */\n    maxFramePerLoop = 1\n\n    readonly debug: boolean\n\n    /**\n     * Number of times to run composer render. If set to more than 1, preRender and postRender events will also be called multiple times.\n     */\n    rendersPerFrame = 1\n\n    /**\n     * Get the HTML Element containing the canvas\n     * @returns {HTMLElement}\n     */\n    get container(): HTMLElement {\n        // todo console.warn('container is deprecated, NOTE: subscribe to events when the canvas is moved to another container')\n        if (this._canvas.parentElement !== this._container) {\n            this.console.error('ThreeViewer: Canvas is not in the container, this might cause issues with some plugins.')\n        }\n        return this._container\n    }\n\n    /**\n     * Get the HTML Canvas Element where the viewer is rendering\n     * @returns {HTMLCanvasElement}\n     */\n    get canvas(): HTMLCanvasElement {\n        return this._canvas\n    }\n\n    get console(): IConsoleWrapper {\n        return ThreeViewer.Console\n    }\n\n    get dialog(): IDialogWrapper {\n        return ThreeViewer.Dialog\n    }\n\n    /**\n     * Helper to track and visualize rendering performance while in debug mode.\n     */\n    renderStats?: GLStatsJS\n\n    /**\n     * The ResizeObserver observing the canvas element. Add more elements to this observer to resize viewer on their size change.\n     * @type {ResizeObserver | undefined}\n     */\n    readonly resizeObserver = window?.ResizeObserver ? new window.ResizeObserver(_ => this.resize()) : undefined\n\n    private readonly _canvas: HTMLCanvasElement\n    // this can be used by other plugins to add ui elements alongside the canvas\n    private readonly _container: HTMLElement // todo: add a way to move the canvas to a new container... and dispatch event...\n    private _needsResize = false\n    private _isRenderingFrame = false\n    private _needsReset = true // renderer needs reset\n\n    // Helpers for tracking main camera change and setting dirty automatically\n    private _lastCameraPosition: Vector3 = new Vector3()\n    private _lastCameraQuat: Quaternion = new Quaternion()\n    private _lastCameraTarget: Vector3 = new Vector3()\n    private _tempVec: Vector3 = new Vector3()\n    private _tempQuat: Quaternion = new Quaternion()\n    private _lastMainCamera: ICamera | undefined = undefined\n\n    /**\n     * If any of the viewers are in debug mode, this will be true.\n     * This is required for debugging/logging in some cases.\n     */\n    public static ViewerDebugging = false\n\n    /**\n     * plugins that are not serialized/deserialized with the viewer from config. useful when loading files exported from the editor, etc\n     * (runtime only, not serialized itself)\n     */\n    serializePluginsIgnored: string[] = []\n\n    /**\n     * Create a viewer instance for using the webgi viewer SDK.\n     * @param options - {@link ThreeViewerOptions}\n     */\n    constructor({debug = false, ...options}: ThreeViewerOptions) {\n        super()\n        this.debug = debug\n        if (debug) ThreeViewer.ViewerDebugging = true\n        this._canvas = options.canvas || createCanvasElement()\n        const computedStyle = getComputedStyle(this._canvas)\n        if (!this._canvas.style.width && computedStyle.maxWidth === 'none') this._canvas.style.width = '100%'\n        if (!this._canvas.style.height && computedStyle.maxHeight === 'none') this._canvas.style.height = '100%'\n        let container = options.container\n        if (container && !options.canvas) container.appendChild(this._canvas)\n        if (!container) container = this._canvas.parentElement ?? undefined\n        if (!container) container = globalThis.document?.body\n        if (!container) throw new Error('No container(or canvas).')\n        this._container = container // todo listen to canvas container change\n        // if (getComputedStyle(this._container).position === 'static') {\n        //     this.console.warn('ThreeViewer - The canvas container has static position, it must be set to relative or absolute for some plugins to work properly.')\n        // }\n        this.setDirty = this.setDirty.bind(this)\n        this._animationLoop = this._animationLoop.bind(this)\n\n        if (debug && (options as any).statsJS !== false) {\n            this.renderStats = new GLStatsJS(this._container)\n            this.renderStats.show()\n        }\n\n        if (!(window as any).threeViewers) (window as any).threeViewers = [];\n        (window as any).threeViewers.push(this)\n\n        // camera\n\n        let camera\n        if ((options.camera as ICamera)?.isCamera) {\n            camera = options.camera as ICamera\n            if (!camera.assetType) iCameraCommons.upgradeCamera.call(camera)\n        } else {\n            camera =\n                options.camera?.type === 'orthographic' ?\n                    new OrthographicCamera2(options.camera?.controlsMode ?? 'orbit', this._canvas) :\n                    new PerspectiveCamera2(options.camera?.controlsMode ?? 'orbit', this._canvas)\n            camera.name = 'Default Camera' + (camera.type === 'OrthographicCamera' ? ' (Ortho)' : '')\n            const pos = options.camera?.position || [0, 0, 5]\n            if (Array.isArray(pos)) camera.position.fromArray(pos)\n            else camera.position.copy(pos)\n            const tar = options.camera?.target || [0, 0, 0]\n            if (Array.isArray(tar)) camera.target.fromArray(tar)\n            else camera.target.copy(tar)\n            camera.setDirty()\n            camera.userData.autoLookAtTarget = true // only for when controls are disabled / not available\n\n            if (options.rootScene) {\n                this.console.error('ThreeViewer: Camera must also be passed in options when rootScene is passed in options.')\n            }\n        }\n\n        // Update camera controls postFrame if allowed to interact\n        this.addEventListener('postFrame', () => { // todo: move inside RootScene.\n            const cam = this._scene.mainCamera\n            if (cam && cam.canUserInteract) {\n                const d = this.getPlugin<ProgressivePlugin>('ProgressivePlugin')?.postFrameConvergedRecordingDelta()\n                // if (d && d > 0) delta = d\n                if (d !== undefined && d === 0) return // not converged yet.\n                // if d < 0 or undefined: not recording, do nothing\n\n                if (typeof cam.controls?.update === 'function') cam.controls?.update()\n            }\n        })\n\n        // if camera position or target changed in last frame, call setDirty on camera\n        this.addEventListener('preFrame', () => { // todo: move inside RootScene. and maybe check the world matrix and target vector change\n            const cam = this._scene.mainCamera\n            if (\n                cam.getWorldPosition(this._tempVec).sub(this._lastCameraPosition).lengthSq() // position is in local space\n                + this._tempVec.subVectors(cam.target, this._lastCameraTarget).lengthSq() // target is in world space\n                + cam.getWorldQuaternion(this._tempQuat).angleTo(this._lastCameraQuat)\n                > 0.000001) cam.setDirty()\n        })\n\n        // scene\n\n        this.object3dManager = new Object3DManager()\n        this._scene = options.rootScene ?? new RootScene(camera, defaultObjectProcessor(this))\n        if (this._scene.mainCamera !== camera) this._scene.mainCamera = camera // just in case\n        this._scene.setBackgroundColor(options.backgroundColor ?? '#ffffff')\n        this._scene.addEventListener('setView', this._setActiveCameraView)\n        this._scene.addEventListener('activateMain', this._setActiveCameraView)\n        this._scene.addEventListener('materialUpdate', (e) => this.setDirty(this._scene, e))\n        this._scene.addEventListener('materialChanged', (e) => this.setDirty(this._scene, e)) // why? todo if needed use geometryChanged also\n        this._scene.addEventListener('objectUpdate', (e) => this.setDirty(this._scene, e))\n        this._scene.addEventListener('textureUpdate', (e) => this.setDirty(this._scene, e))\n        this._scene.addEventListener('sceneUpdate', (e) => {\n            this.setDirty(this._scene, e)\n            if (e.geometryChanged === false) return\n            this.renderManager.resetShadows()\n        })\n        this._scene.addEventListener('mainCameraUpdate', () => {\n            this._scene.mainCamera.getWorldPosition(this._lastCameraPosition)\n            this._lastCameraTarget.copy(this._scene.mainCamera.target)\n            this._scene.mainCamera.getWorldQuaternion(this._lastCameraQuat)\n        })\n        this._scene.modelRoot.scale.setScalar(options.modelRootScale ?? 1)\n        this.object3dManager.setRoot(this._scene)\n\n        // render manager\n\n        if (options.isAntialiased !== undefined || options.useRgbm !== undefined || options.useGBufferDepth !== undefined) {\n            this.console.warn('isAntialiased, useRgbm and useGBufferDepth are deprecated, use msaa, rgbm and zPrepass instead.')\n        }\n        const rmClass: Class<ViewerRenderManager> = (options as any).rmClass ?? ViewerRenderManager\n        this.renderManager = new rmClass({\n            canvas: this._canvas,\n            msaa: options.msaa ?? options.isAntialiased ?? false,\n            rgbm: options.rgbm ?? options.useRgbm ?? true,\n            zPrepass: options.zPrepass ?? options.useGBufferDepth ?? false,\n            depthBuffer: !(options.zPrepass ?? options.useGBufferDepth ?? false),\n            stencilBuffer: options.stencil,\n            screenShader: options.screenShader,\n            renderScale: typeof options.renderScale === 'string' ? options.renderScale === 'auto' ?\n                Math.min(options.maxRenderScale || 2, window.devicePixelRatio) : parseFloat(options.renderScale) :\n                options.renderScale,\n            maxHDRIntensity: options.maxHDRIntensity,\n            powerPreference: options.powerPreference,\n        })\n        this.renderManager.addEventListener('animationLoop', this._animationLoop as any)\n        this.renderManager.addEventListener('resize', ()=> this._scene.mainCamera.refreshAspect())\n        this.renderManager.addEventListener('update', (e) => {\n            if (e.change === 'registerPass' && e.pass?.materialExtension)\n                this.assetManager.materials.registerMaterialExtension(e.pass.materialExtension)\n            else if (e.change === 'unregisterPass' && e.pass?.materialExtension)\n                this.assetManager.materials.unregisterMaterialExtension(e.pass.materialExtension)\n            this.setDirty(this.renderManager, e)\n        })\n\n        this.assetManager = new AssetManager(this, options.assetManager)\n        if (options.cacheImportedAssets !== undefined)\n            this.assetManager.importer.cacheImportedAssets = options.cacheImportedAssets\n\n        if (this.resizeObserver) this.resizeObserver.observe(this._canvas)\n        // sometimes resize observer is late, so extra check\n        window && window.addEventListener('resize', this.resize)\n\n        this._canvas.addEventListener('webglcontextrestored', this._onContextRestore, false)\n        this._canvas.addEventListener('webglcontextlost', this._onContextLost, false)\n\n        if (options.dropzone) {\n            this.addPluginSync(new DropzonePlugin(typeof options.dropzone === 'object' ? options.dropzone : undefined))\n        }\n        if (options.tonemap !== false) {\n            this.addPluginSync(new TonemapPlugin())\n        }\n        for (const p of options.plugins ?? []) this.addPluginSync(p)\n\n        this.console.log('ThreePipe Viewer instance initialized, version: ', ThreeViewer.VERSION)\n\n        if (options.load) {\n            const sources = [options.load.src].flat().filter(s=> s)\n            const promises: Promise<any>[] = sources.map(async s=> s && this.load(s))\n            if (options.load.environment) promises.push(this.setEnvironmentMap(options.load.environment))\n            if (options.load.background) promises.push(this.setBackgroundMap(options.load.background))\n            Promise.all(promises).then(options.onLoad)\n        }\n\n        if (options.stopPointerEventPropagation) {\n            // Stop event propagation in the viewer to prevent flickity etc. from dragging\n            this._canvas.addEventListener('pointerdown', this._stopPropagation)\n            this._canvas.addEventListener('touchstart', this._stopPropagation)\n            this._canvas.addEventListener('mousedown', this._stopPropagation)\n        }\n\n    }\n\n    /**\n     * Add an object/model/material/viewer-config/plugin-preset/... to the viewer scene from url or an {@link IAsset} object.\n     * Same as {@link AssetManager.addAssetSingle}\n     * @param obj\n     * @param options\n     */\n    async load<T extends ImportResult = ImportResult>(obj: string | IAsset | File | null, options?: ImportAddOptions) {\n        if (!obj) return\n        return await this.assetManager.addAssetSingle<T>(obj, options)\n    }\n\n    /**\n     * Imports an object/model/material/texture/viewer-config/plugin-preset/... to the viewer scene from url or an {@link IAsset} object.\n     * Same as {@link AssetImporter.importSingle}\n     * @param obj\n     * @param options\n     */\n    async import<T extends ImportResult = ImportResult>(obj: string | IAsset | File | null, options?: ImportAssetOptions) {\n        if (!obj) return\n        return await this.assetManager.importer.importSingle<T>(obj, options)\n    }\n\n    /**\n     * Set the environment map of the scene from url or an {@link IAsset} object.\n     * @param map\n     * @param setBackground - Set the background image of the scene from the same map.\n     * @param options - Options for importing the asset. See {@link ImportAssetOptions}\n     */\n    async setEnvironmentMap(map: string | IAsset | null | ITexture | File | undefined, {setBackground = false, ...options}: ImportAssetOptions&{setBackground?: boolean} = {}): Promise<ITexture | null> {\n        this._scene.environment = map && !(<ITexture>map).isTexture ? await this.assetManager.importer.importSingle<ITexture>(map as string|IAsset|File, options) || null : <ITexture>map || null\n        if (setBackground) return this.setBackgroundMap(this._scene.environment)\n        return this._scene.environment\n    }\n\n    /**\n     * Set the background image of the scene from url or an {@link IAsset} object.\n     * @param map\n     * @param setEnvironment - Set the environment map of the scene from the same map.\n     * @param options - Options for importing the asset. See {@link ImportAssetOptions}\n     */\n    async setBackgroundMap(map: string | IAsset | null | ITexture | File | undefined, {setEnvironment = false, ...options}: ImportAssetOptions&{setBackground?: boolean} = {}): Promise<ITexture | null> {\n        this._scene.background = map && !(<ITexture>map).isTexture ? await this.assetManager.importer.importSingle<ITexture>(map as string|IAsset, options) || null : <ITexture>map || null\n        if (setEnvironment) return this.setEnvironmentMap(this._scene.background)\n        return this._scene.background\n    }\n\n    /**\n     * Exports an object/mesh/material/texture/render-target/plugin-preset/viewer to a blob.\n     * If no object is given, a glb is exported with the current viewer state.\n     * @param obj\n     * @param options\n     */\n    async export(obj?: IObject3D|IMaterial|ITexture|IRenderTarget|IViewerPlugin|(typeof this), options?: ExportFileOptions) {\n        if (!obj) obj = this._scene.modelRoot // this will export the glb with the scene and viewer config\n        if ((<typeof this>obj).type === this.type) return jsonToBlob((<typeof this>obj).exportConfig())\n        if ((<IViewerPlugin>obj).constructor?.PluginType) return jsonToBlob(this.exportPluginConfig(<IViewerPlugin>obj))\n        return await this.assetManager.exporter.exportObject(<IObject3D|IMaterial|ITexture|IRenderTarget>obj, options)\n    }\n\n    /**\n     * Export the scene to a file (default: glb with viewer config) and return a blob\n     * @param options\n     * @param useExporterPlugin - uses the {@link AssetExporterPlugin} if available. This is useful to use the options configured by the user in the plugin.\n     */\n    async exportScene(options?: ExportFileOptions, useExporterPlugin = true): Promise<BlobExt | undefined> {\n        const exporter = useExporterPlugin ? this.getPlugin<AssetExporterPlugin>('AssetExporterPlugin') : undefined\n        if (exporter) return exporter.exportScene(options)\n        return this.assetManager.exporter.exportObject(this._scene.modelRoot, options)\n    }\n\n    /**\n     * Returns a blob with the screenshot of the canvas.\n     * If {@link CanvasSnapshotPlugin} is added, it will be used, otherwise canvas.toBlob will be used directly.\n     * @param mimeType default image/jpeg\n     * @param quality between 0 and 100\n     */\n    async getScreenshotBlob({mimeType = 'image/jpeg', quality = 90} = {}): Promise<Blob | null | undefined> {\n        const plugin = this.getPlugin<CanvasSnapshotPlugin>('CanvasSnapshotPlugin')\n        if (plugin) {\n            return plugin.getFile('snapshot.' + mimeType.split('/')[1], {mimeType, quality, waitForProgressive: true})\n        }\n        const blobPromise = async()=> new Promise<Blob|null>((resolve) => {\n            this._canvas.toBlob((blob) => {\n                resolve(blob)\n            }, mimeType, quality)\n        })\n        if (!this.renderEnabled) return blobPromise()\n        return await this.doOnce('postFrame', async() => {\n            this.renderEnabled = false\n            const blob = await blobPromise()\n            this.renderEnabled = true\n            return blob\n        })\n    }\n\n    async getScreenshotDataUrl({mimeType = 'image/jpeg', quality = 0.9} = {}): Promise<string | null | undefined> {\n        if (!this.renderEnabled) return this._canvas.toDataURL(mimeType, quality)\n        return await this.doOnce('postFrame', () => this._canvas.toDataURL(mimeType, quality))\n    }\n\n    /**\n     * Disposes the viewer and frees up all resource and events. Do not use the viewer after calling dispose.\n     * NOTE - If you want to reuse the viewer, set viewer.enabled to false instead, then set it to true again when required.\n     * To dispose all the objects, materials in the scene, but not the viewer itself, use `viewer.scene.disposeSceneModels()`\n     */\n    public dispose(clear = true): void {\n        this.renderEnabled = false\n        // TODO - return promise?\n\n        // todo: dispose stuff from constructor etc\n        if (clear) {\n            const syncPlugins = []\n            const asyncPlugins = []\n            for (const [key, plugin] of [...Object.entries(this.plugins)]) {\n                if (key === plugin.constructor.OldPluginType) continue\n                // this.removePlugin(plugin, true)\n                if ((plugin as AViewerPlugin).isViewerPluginSync) syncPlugins.push(plugin)\n                else asyncPlugins.push(plugin)\n            }\n            for (const plugin of syncPlugins) {\n                this.removePluginSync(plugin, true)\n            }\n            for (const plugin of asyncPlugins) {\n                this.removePlugin(plugin, true)\n            }\n        }\n\n        this._scene.dispose(clear)\n        this.renderManager.dispose(clear)\n\n        if (clear) {\n            this.object3dManager.dispose()\n            this._canvas.removeEventListener('webglcontextrestored', this._onContextRestore, false)\n            this._canvas.removeEventListener('webglcontextlost', this._onContextLost, false)\n\n            ;((window as any).threeViewers as any[])?.splice((window as any).threeViewers.indexOf(this), 1)\n\n            if (this.resizeObserver) this.resizeObserver.unobserve(this._canvas)\n            window.removeEventListener('resize', this.resize)\n        }\n\n        this.dispatchEvent({type: 'dispose', clear})\n    }\n\n    /**\n     * Mark that the canvas is resized. If the size is changed, the renderer and all render targets are resized. This happens before the render of the next frame.\n     */\n    resize = () => {\n        // console.warn('resize')\n        this._needsResize = true\n        this.setDirty()\n    }\n\n    /**\n     * Set the viewer to dirty and trigger render of the next frame.\n     *\n     * This also triggers the 'update' event on the viewer. Note - update event might be triggered multiple times in a single frame, use preFrame or preRender events to get notified only once per frame.\n     * @param source - The source of the dirty event. like plugin or 3d object\n     * @param event - The event that triggered the dirty event.\n     */\n    setDirty(source?: any, event?: Event): void {\n        this._needsReset = true\n        source = source ?? this\n        this.dispatchEvent({...event ?? {}, type: 'update', source})\n    }\n\n    protected _animationLoop(event: IAnimationLoopEvent): void {\n        if (!this.enabled) return\n        if (this._isRenderingFrame) {\n            this.console.warn('animation loop: frame skip') // not possible actually, since this is not async\n            return\n        }\n        this._isRenderingFrame = true\n\n        this.renderStats?.begin()\n\n        for (let i = 0; i < this.maxFramePerLoop; i++) {\n            let isResized = false\n            if (this.renderEnabled) {\n\n                // from setDirty\n                if (this._needsReset) {\n                    this.renderManager.reset()\n                    this._needsReset = false\n                }\n\n                if (this._needsResize) {\n                    const size = [Math.floor(this._canvas.clientWidth), Math.floor(this._canvas.clientHeight)]\n                    if (event.xrFrame) { // todo: find a better way to resize for XR.\n                        const cam = this.renderManager.webglRenderer.xr.getCamera()?.cameras[0]?.viewport\n                        if (cam) {\n                            if (cam.x !== 0 || cam.y !== 0) {\n                                this.console.warn('x and y must be 0?')\n                            }\n                            size[0] = cam.width\n                            size[1] = cam.height\n                            this.console.log('resize for xr', size)\n                        } else {\n                            this._needsResize = false\n                        }\n                    }\n                    if (this._needsResize) {\n                        this.renderManager.setSize(...size)\n                        this._needsResize = false\n                        isResized = true\n                    }\n                }\n\n            }\n\n            this.dispatchEvent({...event, type: 'preFrame', target: this}) // event will have time, deltaTime and xrFrame\n            this.dispatch('preFrame', {\n                time: event.time,\n                deltaTime: event.deltaTime,\n                timeline: this.timeline,\n                resized: isResized,\n            })\n\n            if (this.renderEnabled) {\n\n                const dirtyPlugins = Object.entries(this.plugins).filter(([key, plugin]) => plugin.dirty && key !== plugin.constructor.OldPluginType)\n                if (dirtyPlugins.length > 0) {\n                    // console.log('dirty plugins', dirtyPlugins)\n                    this.setDirty(dirtyPlugins)\n                }\n\n                // again, setDirty might have been called in preFrame\n                if (this._needsReset) {\n                    this.renderManager.reset()\n                    this._needsReset = false\n                }\n\n                // Check if the renderManger is dirty, which happens when it's reset above or if any pass in the composer is dirty\n                const needsRender = this.renderManager.needsRender\n                if (needsRender) {\n                    for (let j = 0; j < this.rendersPerFrame; j++) {\n                        this._scene._isMainRendering = true\n                        this.dispatchEvent({type: 'preRender', target: this})\n                        // console.log('render')\n\n                        const render = () => {\n                            const cam = this._scene.mainCamera\n                            this._scene.renderCamera = cam\n                            if (cam.visible) this.renderManager.render(this._scene, this.renderManager.defaultRenderToScreen)\n                        }\n                        if (this.debug) {\n                            render()\n                        } else {\n                            try {\n                                render()\n                            } catch (e) {\n                                this.console.error('ThreeViewer: Uncaught error while rendering frame.')\n                                this.console.error(e)\n                                if (this.debug) throw e\n                                this.renderEnabled = false\n                                this.dispatchEvent({type: 'renderError', error: e})\n                            }\n                        }\n\n                        this._scene._isMainRendering = false\n                        this.dispatchEvent({type: 'postRender', target: this})\n                    }\n\n                }\n\n            }\n\n            this.timeline.update(this)\n\n            this.dispatchEvent({type: 'postFrame', target: this})\n\n            if (this.renderEnabled) this.renderManager.onPostFrame()\n\n            this.object3dManager.onPostFrame(this.timeline)\n\n            // this is update after postFrame, because other plugins etc will update the scene in postFrame or preFrame listeners\n            this.timeline.update2(this)\n            // if (!needsRender) // break if no frame rendered (should not break)\n            //     break\n\n        }\n\n        this.renderStats?.end()\n\n        this._isRenderingFrame = false\n\n    }\n\n    /**\n     * Get the Plugin by a constructor type or by the string type.\n     * Use string type if the plugin is not a dependency, and you don't want to bundle the plugin.\n     * @param type - The class of the plugin to get, or the string type of the plugin to get which is in the static PluginType property of the plugin\n     * @returns {T extends IViewerPlugin | undefined} - The plugin of the specified type.\n     */\n    getPlugin<T extends IViewerPlugin>(type: Class<T>|string): T | undefined {\n        return this.plugins[typeof type === 'string' ? type : (type as any).PluginType] as T | undefined\n    }\n    getPlugins<T extends IViewerPlugin>(type: Class<T>|string): T[] {\n        const ptype = typeof type === 'string' ? type : (type as any).PluginType\n        const plugins = Object.values(this.plugins)\n        const ret = []\n        for (const plugin of plugins) {\n            const types = getPluginTypes(plugin)\n            if (types.includes(ptype)) ret.push(plugin)\n        }\n        return ret as T[]\n    }\n\n    /**\n     * Get the Plugin by a constructor type or add a new plugin of the specified type if it doesn't exist.\n     * @param type\n     * @param args - arguments for the constructor of the plugin, used when a new plugin is created.\n     */\n    async getOrAddPlugin<T extends IViewerPlugin>(type: Class<T>, ...args: ConstructorParameters<Class<T>>): Promise<T> {\n        const plugin = this.getPlugin(type)\n        if (plugin) return plugin\n        return this.addPlugin(type, ...args)\n    }\n\n    /**\n     * Get the Plugin by a constructor type or add a new plugin to the viewer of the specified type if it doesn't exist(sync).\n     * @param type\n     * @param args - arguments for the constructor of the plugin, used when a new plugin is created.\n     */\n    getOrAddPluginSync<T extends IViewerPluginSync>(type: Class<T>, ...args: ConstructorParameters<Class<T>>): T {\n        const plugin = this.getPlugin(type)\n        if (plugin) return plugin\n        return this.addPluginSync(type, ...args)\n    }\n\n    /**\n     * Add a plugin to the viewer.\n     * @param plugin - The instance of the plugin to add or the class of the plugin to add.\n     * @param args - Arguments for the constructor of the plugin, in case a class is passed.\n     * @returns {Promise<T>} - The plugin added.\n     */\n    async addPlugin<T extends IViewerPlugin>(plugin: T | Class<T>, ...args: ConstructorParameters<Class<T>>): Promise<T> {\n        const p = this._resolvePluginOrClass(plugin, ...args)\n        if (!p) {\n            throw new Error('ThreeViewer: Plugin is not defined')\n        }\n        const type = p.constructor.PluginType\n        if (!p.constructor.PluginType) {\n            this.console.error('ThreeViewer: PluginType is not defined for', p)\n            return p\n        }\n\n        for (const d of p.dependencies || []) {\n            await this.getOrAddPlugin(d)\n        }\n\n        if (this.plugins[type]) {\n            if (this.plugins[type] === p) return p\n            this.console.error(`ThreeViewer: Plugin of type ${type} already exists, removing and disposing old plugin. This might break functionality, ensure only one plugin of a type is added`, this.plugins[type], p)\n            await this.removePlugin(this.plugins[type])\n        }\n        this.plugins[type] = p\n        const oldType = p.constructor.OldPluginType\n        if (oldType && this.plugins[oldType]) this.console.error(`ThreeViewer: Plugin type mismatch ${oldType}`)\n        if (oldType) this.plugins[oldType] = p\n\n        await p.onAdded(this)\n        this._onPluginAdd(p)\n        return p\n    }\n\n    /**\n     * Add a plugin to the viewer(sync).\n     * @param plugin\n     * @param args\n     */\n    addPluginSync<T extends IViewerPluginSync>(plugin: T|Class<T>, ...args: ConstructorParameters<Class<T>>): T {\n        const p = this._resolvePluginOrClass(plugin, ...args)\n        if (!p) {\n            throw new Error('ThreeViewer: Plugin is not defined')\n        }\n        const type = p.constructor.PluginType\n        if (!p.constructor.PluginType) {\n            this.console.error('ThreeViewer: PluginType is not defined for', p)\n            return p\n        }\n        for (const d of p.dependencies || []) {\n            this.getOrAddPluginSync(d)\n        }\n\n        if (this.plugins[type]) {\n            if (this.plugins[type] === p) return p\n            this.console.error(`ThreeViewer: Plugin of type ${type} already exists, removing and disposing old plugin. This might break functionality, ensure only one plugin of a type is added`, this.plugins[type], p)\n            this.removePluginSync(this.plugins[type])\n        }\n        const add = ()=>{\n            this.plugins[type] = p\n            const oldType = p.constructor.OldPluginType\n            if (oldType && this.plugins[oldType]) this.console.error(`ThreeViewer: Plugin type mismatch ${oldType}`)\n            if (oldType) this.plugins[oldType] = p\n            p.onAdded(this)\n        }\n        if (this.debug) {\n            add()\n        } else {\n            try {\n                add()\n            } catch (e) {\n                this.console.error('ThreeViewer: Error adding plugin, check console for details', e)\n                delete this.plugins[type]\n            }\n        }\n        this._onPluginAdd(p)\n        return p\n    }\n\n    /**\n     * Add multiple plugins to the viewer.\n     * @param plugins - List of plugin instances or classes\n     */\n    async addPlugins(plugins: (IViewerPlugin | Class<IViewerPlugin>)[]): Promise<void> {\n        for (const p of plugins) await this.addPlugin(p)\n    }\n\n    /**\n     * Add multiple plugins to the viewer(sync).\n     * @param plugins - List of plugin instances or classes\n     */\n    addPluginsSync(plugins: (IViewerPluginSync | Class<IViewerPluginSync>)[]): void {\n        for (const p of plugins) this.addPluginSync(p)\n    }\n\n    /**\n     * Remove a plugin instance or a plugin class. Works similar to {@link ThreeViewer.addPlugin}\n     * @param p\n     * @param dispose\n     * @returns {Promise<void>}\n     */\n    async removePlugin(p: IViewerPlugin<ThreeViewer, boolean>, dispose = true): Promise<void> {\n        const type = p.constructor.PluginType\n        if (!this.plugins[type]) return\n        await p.onRemove(this)\n        this._onPluginRemove(p, dispose)\n    }\n\n    /**\n     * Remove a plugin instance or a plugin class(sync). Works similar to {@link ThreeViewer.addPluginSync}\n     * @param p\n     * @param dispose\n     */\n    removePluginSync(p: IViewerPluginSync, dispose = true): void {\n        const type = p.constructor.PluginType\n        if (!this.plugins[type]) return\n        p.onRemove(this)\n        this._onPluginRemove(p, dispose)\n    }\n\n    /**\n     * Set size of the canvas and update the renderer.\n     * If no size or width/height is passed, canvas is set to 100% of the container.\n     *\n     * See also {@link ThreeViewer.setRenderSize} to set the size of the render target by automatically calculating the renderScale and fitting in container.\n     *\n     * Note: Apps using this should ideally set `max-width: 100%` for the canvas in css.\n     * @param size\n     */\n    setSize(size?: {width?: number, height?: number}) {\n        this._canvas.style.width = size?.width ? size.width + 'px' : '100%'\n        this._canvas.style.height = size?.height ? size.height + 'px' : '100%'\n        // this._canvas.style.maxWidth = '100%' // this is upto the app to do.\n        // this._canvas.style.maxHeight = '100%'\n        // https://stackoverflow.com/questions/21664940/force-browser-to-trigger-reflow-while-changing-css\n        void this._canvas.offsetHeight\n        this.resize() // this is also required in case the browwser doesnt support/fire observer\n    }\n\n    // todo make a constructor parameter for renderSize\n    // todo make getRenderSize or get renderSize\n    /**\n     * Set the render size of the viewer to fit in the container according to the specified mode, maintaining aspect ratio.\n     * Changes the renderScale accordingly.\n     * Note: the canvas needs to be centered in the container to work properly, this can be done with the following css on the container:\n     * ```css\n     * display: flex;\n     * justify-content: center;\n     * align-items: center;\n     * ```\n     * or in js:\n     * ```js\n     * viewer.container.style.display = 'flex';\n     * viewer.container.style.justifyContent = 'center';\n     * viewer.container.style.alignItems = 'center';\n     * ```\n     * Modes:\n     * 'contain': The canvas is scaled to fit within the container while maintaining its aspect ratio. The canvas will be fully visible, but there may be empty space around it.\n     * 'cover': The canvas is scaled to fill the entire container while maintaining its aspect ratio. Part of the canvas may be clipped to fit the container.\n     * 'fill': The canvas is stretched to completely fill the container, ignoring its aspect ratio.\n     * 'scale-down': The canvas is scaled down to fit within the container while maintaining its aspect ratio, but it won't be scaled up if it's smaller than the container.\n     * 'none': container size is ignored, but devicePixelRatio is used\n     *\n     * Check the example for more details - https://threepipe.org/examples/#viewer-render-size/\n     * @param size - The size to set the render to. The canvas will render to this size.\n     * @param mode - 'contain', 'cover', 'fill', 'scale-down' or 'none'. Default is 'contain'.\n     * @param devicePixelRatio - typically set to `window.devicePixelRatio`, or `Math.min(1.5, window.devicePixelRatio)` for performance. Use this only when size is derived from dom elements.\n     * @param containerSize - (optional) The size of the container, if not passed, the bounding client rect of the container is used.\n     */\n    setRenderSize(size: {width: number, height: number},\n        mode: 'contain' | 'cover' | 'fill' | 'scale-down' | 'none' = 'contain',\n        devicePixelRatio = 1,\n        containerSize?: {width: number, height: number}) {\n        // todo what about container resize?\n        const containerRect = containerSize || this.container.getBoundingClientRect()\n        const containerHeight = containerRect.height\n        const containerWidth = containerRect.width\n        const width = Math.floor(size.width)\n        const height = Math.floor(size.height)\n        const aspect = width / height\n        const containerAspect = containerWidth / containerHeight\n        const dpr = devicePixelRatio\n\n        let renderWidth, renderHeight\n\n        switch (mode) {\n        case 'contain':\n            if (containerAspect > aspect) {\n                renderWidth = containerHeight * aspect\n                renderHeight = containerHeight\n            } else {\n                renderWidth = containerWidth\n                renderHeight = containerWidth / aspect\n            }\n            break\n        case 'cover':\n            if (containerAspect > aspect) {\n                renderWidth = containerWidth\n                renderHeight = containerWidth / aspect\n            } else {\n                renderWidth = containerHeight * aspect\n                renderHeight = containerHeight\n            }\n            break\n        case 'fill':\n            renderWidth = containerWidth\n            renderHeight = containerHeight\n            break\n        case 'scale-down':\n            if (width < containerWidth && height < containerHeight) {\n                renderWidth = width\n                renderHeight = height\n            } else if (containerAspect > aspect) {\n                renderWidth = containerHeight * aspect\n                renderHeight = containerHeight\n            } else {\n                renderWidth = containerWidth\n                renderHeight = containerWidth / aspect\n            }\n            break\n        case 'none':\n            renderWidth = width\n            renderHeight = height\n            break\n        default:\n            throw new Error(`Invalid mode: ${mode}`)\n        }\n\n        this.setSize({width: renderWidth, height: renderHeight})\n        this.renderManager.renderScale = dpr * height / renderHeight\n    }\n\n    /**\n     * Traverse all objects in scene model root.\n     * @param callback\n     */\n    traverseSceneObjects<T extends IObject3D = IObject3D>(callback: (o: T)=>void): void {\n        this._scene.modelRoot.traverse(callback)\n    }\n\n    deleteImportedViewerConfigOnLoad = true\n    deleteImportedViewerConfigOnLoadWait = 2000 // ms\n\n    /**\n     * Add an object to the scene model root.\n     * If an imported scene model root is passed, it will be loaded with viewer configuration, unless importConfig is false\n     * @param imported\n     * @param options\n     */\n    async addSceneObject<T extends IObject3D|Object3D|RootSceneImportResult = RootSceneImportResult>(imported: T, options?: AddObjectOptions): Promise<T> {\n        let res = imported\n        if (imported.userData?.rootSceneModelRoot) {\n            const obj = <RootSceneImportResult>imported\n            this._scene.loadModelRoot(obj, options)\n            if (options?.importConfig !== false) {\n                if (obj.importedViewerConfig) {\n                    await this.importConfig(obj.importedViewerConfig, obj.importedBundledResources)\n                    // @ts-expect-error no type for this\n                    if (obj._deletedImportedViewerConfig) delete obj._deletedImportedViewerConfig\n                // @ts-expect-error no type for this\n                } else if (obj._deletedImportedViewerConfig)\n                    this.console.error('ThreeViewer - Imported viewer config was deleted, cannot import it again. Set `viewer.deleteImportedViewerConfigOnLoad` to `false` to keep it in the object for reuse workflows.')\n            }\n            if (this.deleteImportedViewerConfigOnLoad && obj.importedViewerConfig) {\n                setTimeout(()=>{\n                    if (!obj.importedViewerConfig) return\n                    delete obj.importedViewerConfig // any useful data in the config should be loaded into userData.__importData by then\n                    // @ts-expect-error no type for this\n                    obj._deletedImportedViewerConfig = true // for console warning above\n                }, this.deleteImportedViewerConfigOnLoadWait)\n            }\n\n            setTimeout(()=>{\n                if (!obj.importedBundledResources) return\n                delete obj.importedBundledResources\n                // @ts-expect-error no type for this\n                obj._deletedImportedBundledResources = true // for console warning above\n            }, this.deleteImportedViewerConfigOnLoadWait)\n\n            res = this._scene.modelRoot as T\n        } else {\n            this._scene.addObject(imported, options)\n        }\n        return res\n    }\n\n    /**\n     * Serialize all the plugins and their settings to save or create presets. Used in {@link toJSON}.\n     * @param meta -  The meta object.\n     * @param filter - List of PluginType for to include. If empty, no plugins will be serialized. If undefined, all plugins will be serialized.\n     * @returns {any[]}\n     */\n    serializePlugins(meta: SerializationMetaType, filter?: string[]): ISerializedConfig[] {\n        if (filter && filter.length === 0) return []\n        return filter?.map(type=>{\n            const plugin = this.getPlugin(type)\n            return plugin ? this.serializePlugin(plugin, meta) : undefined\n        }).filter(p=> !!p) ?? Object.entries(this.plugins).map(p=> {\n            if (filter && !filter.includes(p[1].constructor.PluginType)) return\n            if (p[0] === p[1].constructor.OldPluginType) return // duplicate key\n            return this.serializePlugin(p[1], meta)\n        }).filter(p=> !!p)\n    }\n\n    serializePlugin(plugin: IViewerPlugin, meta: SerializationMetaType): ISerializedConfig|undefined {\n        if (this.serializePluginsIgnored.includes((plugin.constructor as any).PluginType)) return\n        // if (!plugin.toJSON) this.console.log(`Plugin of type ${p[0]} is not serializable`)\n        return plugin.serializeWithViewer !== false ? plugin.toJSON?.(meta) : undefined\n    }\n\n    /**\n     * Deserialize all the plugins and their settings from a preset. Used in {@link fromJSON}.\n     * @param plugins - The output of {@link serializePlugins}.\n     * @param meta - The meta object.\n     * @returns {this}\n     */\n    deserializePlugins(plugins: any[], meta?: SerializationMetaType): this {\n        plugins.forEach(p=>{\n            if (!p.type) {\n                this.console.warn('Invalid plugin to import ', p)\n                return\n            }\n            if (this.serializePluginsIgnored.includes(p.type)) return\n            const plugin = this.getPlugin(p.type)\n            if (!plugin) {\n                // this.console.warn(`Plugin of type ${p.type} is not added, cannot deserialize`)\n                return\n            }\n            plugin.fromJSON && plugin.fromJSON(p, meta)\n        })\n        return this\n    }\n\n    /**\n     * Serialize a single plugin settings.\n     */\n    exportPluginConfig(plugin?: string|Class<IViewerPlugin>|IViewerPlugin): ISerializedConfig | Record<string, never> {\n        if (plugin && typeof plugin === 'string' || (plugin as any).PluginType) plugin = this.getPlugin(plugin as any)\n        if (!plugin) return {}\n        const meta = getEmptyMeta()\n        const data = (<IViewerPlugin>plugin).toJSON?.(meta)\n        if (!data) return {}\n        data.resources = metaToResources(meta)\n        return data\n    }\n\n    /**\n     * Deserialize and import a single plugin settings.\n     * Can also use {@link ThreeViewer.importConfig} to import only plugin config.\n     * @param json\n     * @param plugin\n     */\n    async importPluginConfig(json: ISerializedConfig, plugin?: IViewerPlugin) {\n        // this.console.log('importing plugin preset', json, plugin)\n        const type = json.type\n        plugin = plugin || this.getPlugin(type)\n        if (!plugin) {\n            this.console.warn(`No plugin found for type ${type} to import config`)\n            return undefined\n        }\n        if (!plugin.fromJSON) {\n            this.console.warn(`Plugin ${type} does not support importing presets`)\n            return undefined\n        }\n        const resources = json.resources || {}\n        if (json.resources) delete json.resources\n        const meta = await this.loadConfigResources(resources)\n        await plugin.fromJSON(json, meta)\n        if (meta) json.resources = meta\n        return plugin\n    }\n\n    /**\n     * Serialize multiple plugin settings.\n     * @param filter - List of PluginType to include. If empty, no plugins will be serialized. If undefined, all plugins will be serialized.\n     */\n    exportPluginsConfig(filter?: string[]): ISerializedViewerConfig {\n        const meta = getEmptyMeta()\n        const plugins = this.serializePlugins(meta, filter)\n        convertArrayBufferToStringsInMeta(meta) // assuming not binary\n        return {\n            ...this._defaultConfig,\n            plugins, resources: metaToResources(meta),\n        }\n    }\n\n\n    /**\n     * Serialize all the viewer and plugin settings.\n     * @param binary - Indicate that the output will be converted and saved as binary data. (default: false)\n     * @param pluginFilter - List of PluginType to include. If empty, no plugins will be serialized. If undefined, all plugins will be serialized.\n     */\n    exportConfig(binary = false, pluginFilter?: string[]) {\n        return this.toJSON(binary, pluginFilter)\n    }\n\n    /**\n     * Deserialize and import all the viewer and plugin settings, exported with {@link exportConfig}.\n     *\n     * @param json - The serialized JSON object returned from {@link exportConfig} or {@link toJSON}.\n     * @returns {Promise<this>} - The viewer instance with the imported config.\n     */\n    async importConfig(json: ISerializedConfig|ISerializedViewerConfig, meta?: SerializationMetaType): Promise<this | IViewerPlugin | undefined> {\n        if (json.type !== this.type && <string>json.type !== 'ViewerApp' && <string>json.type !== 'ThreeViewer') {\n            if (this.getPlugin(json.type)) {\n                return this.importPluginConfig(json)\n            } else {\n                this.console.error(`Unknown config type ${json.type} to import`)\n                return undefined\n            }\n        }\n        let resources = await this.loadConfigResources(json.resources || {})\n        if (meta) {\n            // merge resources\n            const resources2: typeof resources = {_context: resources._context} as any\n            const keys = [...Object.keys(resources), ...Object.keys(meta || {})]\n            for (const key of keys) {\n                if (key === 'object')\n                    resources2[key] = resources[key] || meta[key]\n                else\n                    resources2[key] = {\n                        ...resources[key],\n                        ...meta[key],\n                    }\n            }\n            resources = resources2\n        }\n        json.resources = resources\n        this.fromJSON(<ISerializedViewerConfig>json, resources)\n        return this\n    }\n\n    /**\n     * Serialize all the viewer and plugin settings and versions.\n     * @param binary - Indicate that the output will be converted and saved as binary data. (default: true)\n     * @param pluginFilter - List of PluginType to include. If empty, no plugins will be serialized. If undefined/not-passed, all plugins will be serialized.\n     * @returns {any} - Serializable JSON object.\n     */\n    toJSON(binary = true, pluginFilter?: string[], meta?: SerializationMetaType): ISerializedViewerConfig {\n        if (typeof binary !== 'boolean') binary = true // its a meta, ignore it\n        if (pluginFilter !== undefined && !Array.isArray(pluginFilter)) pluginFilter = undefined // non standard param.\n        meta = meta || getEmptyMeta()\n        const data: ISerializedViewerConfig = Object.assign({\n            ...this._defaultConfig,\n            metadata: {...this._defaultConfig.metadata},\n            plugins: this.serializePlugins(meta, pluginFilter),\n        }, ThreeSerialization.Serialize(this, meta, true))\n        // this.console.log(dat)\n\n        if (!binary) convertArrayBufferToStringsInMeta(meta)\n\n        data.resources = metaToResources(meta)\n\n        return data\n    }\n\n    /**\n     * Deserialize all the viewer and plugin settings.\n     * NOTE - use async {@link ThreeViewer.importConfig} to import a json/config exported with {@link ThreeViewer.exportConfig} or {@link ThreeViewer.toJSON}.\n     * @param data - The serialized JSON object returned from {@link toJSON}.\n     * @param meta - The meta object, see {@link SerializationMetaType}\n     * @returns {this}\n     */\n    fromJSON(data: ISerializedViewerConfig, meta?: SerializationMetaType): this|null {\n        const data2: Partial<ISerializedViewerConfig> = {...data} // shallow copy\n\n\n        if (meta && data2.metadata && data2.type === 'ViewerApp') {\n            meta._configMetadata = { // used in RootScene\n                ...data2.metadata,\n                viewerVersion: data2.version,\n            }\n        }\n\n        // region legacy\n        if (data2.backgroundIntensity !== undefined && data2.scene?.backgroundIntensity === undefined) {\n            this.console.warn('old file format, backgroundIntensity moved to RootScene')\n            this._scene.backgroundIntensity = data2.backgroundIntensity\n            delete data2.backgroundIntensity\n        }\n        if (data2.useLegacyLights !== undefined && data2.renderManager?.useLegacyLights === undefined) {\n            this.console.warn('old file format, useLegacyLights moved to RenderManager')\n            this.renderManager.useLegacyLights = data2.useLegacyLights\n            delete data2.useLegacyLights\n        }\n        if (data2.background !== undefined && data2.scene?.background === undefined) {\n            this.console.warn('old file format, background moved to RootScene')\n            if (data2.background === 'envMapBackground') data2.background = 'environment'\n            else if (typeof data2.background === 'number')\n                data2.background = new Color().setHex(data2.background, LinearSRGBColorSpace)\n            else if (typeof data2.background === 'string')\n                data2.background = new Color().setStyle(data2.background, LinearSRGBColorSpace)\n            else if (data2.background?.isColor) data2.background = new Color(data2.background)\n\n            if (data2.background?.isColor) { // color\n                this._scene.backgroundColor = data2.background\n                this._scene.background = null\n            } else if (!data2.background) { // null\n                this._scene.backgroundColor = null\n                this._scene.background = null\n            } else { // texture or 'environment'\n                this._scene.backgroundColor = new Color('#ffffff')\n                if (!data2.scene) data2.scene = {}\n                data2.scene.background = data2.background\n            }\n            delete data2.background\n        }\n\n        // endregion\n\n        if (!meta && data2.resources && data2.resources.__isLoadedResources) {\n            meta = data2.resources as SerializationMetaType\n            delete data2.resources\n        }\n\n        if (!meta?.__isLoadedResources) {\n            this.console.error('ThreeViewer: meta in fromJSON is not available or is not loaded resources, call viewer.loadConfigResources first, or directly use viewer.importConfig')\n            return null\n        }\n\n        if (Array.isArray(data2.plugins)) {\n            this.deserializePlugins(data2.plugins, meta)\n            delete data2.plugins\n        }\n\n        // meta = meta || data.resources\n        ThreeSerialization.Deserialize(data2, this, meta, true)\n\n\n        // todo: handle\n        // __useCount set in ThreeSerialization while deserializing resources\n        // for (const mat of Object.values(resources.materials) as any) {\n        //     if (!mat.__useCount) this.materialManager?.unregisterMaterial(mat) // todo: also dispose?\n        //     else delete mat.__useCount\n        // }\n        // for (const tex of Object.values(resources.textures) as any) {\n        //     if (!tex.__useCount) {\n        //         // todo: dispose?\n        //     } else {\n        //         delete tex.__useCount\n        //     }\n        // }\n\n\n        return this\n    }\n\n    loadConfigResources = async(json: Partial<SerializationMetaType>, extraResources?: Partial<SerializationResourcesType>) => {\n        // this.console.log(json)\n        if (json.__isLoadedResources) return json as SerializationMetaType\n        const meta = metaFromResources(json, this)\n        return await MetaImporter.ImportMeta(meta, extraResources)\n    }\n\n    async doOnce<TRet>(event: IViewerEventTypes, func?: (...args: any[]) => TRet): Promise<TRet|undefined> {\n        return new Promise((resolve) => {\n            const listener = async(...args: any[]) => {\n                this.removeEventListener(event, listener)\n                resolve(await func?.(...args))\n            }\n            this.addEventListener(event, listener)\n        })\n    }\n\n    dispatchEvent(event: IViewerEvent) {\n        super.dispatchEvent(event)\n        super.dispatchEvent({...event, type: '*', eType: event.type})\n    }\n\n    /**\n     * Uses the {@link FileTransferPlugin} to export a Blob/File. If the plugin is not available, it will download the blob.\n     * {@link FileTransferPlugin} can be configured by other plugins to export the blob to a specific location like local file system, cloud storage, etc.\n     * @param blob - The blob or file to export/download\n     * @param name - name of the file, if not provided, the name of the file is used if it's a file.\n     */\n    async exportBlob(blob: Blob|File, name?: string) {\n        const tr = this.getPlugin<FileTransferPlugin>('FileTransferPlugin')\n        name = name ?? (blob as File).name ?? 'file'\n        if (!tr) {\n            downloadBlob(blob, name)\n            return\n        }\n        await tr.exportFile(blob, name)\n    }\n\n    private _setActiveCameraView: EventListener2<'setView'|'activateMain', ISceneEventMap, RootScene> = (event) => {\n        if (event.type === 'setView') {\n            if (!event.camera) {\n                this.console.warn('Cannot find camera', event)\n                return\n            }\n            const camera = this._scene.mainCamera\n            camera.setViewFromCamera(event.camera) // default is worldSpace\n        } else if (event.type === 'activateMain') {\n            let camera = event.camera\n            // If event.camera is undefined, restore the last saved camera\n            if (camera === undefined && this._lastMainCamera) {\n                if (this._lastMainCamera.parent) {\n                    camera = this._lastMainCamera\n                }\n                this._lastMainCamera = undefined\n            }\n\n            // Save the current mainCamera before replacing it (only if we have a new camera to set)\n            if (camera && this._scene.mainCamera !== camera) {\n                this._lastMainCamera = this._scene.mainCamera\n            }\n\n            camera?.setCanvas(this._canvas, false)\n            // this._scene.mainCamera.setCanvas(undefined, false) // todo is this required?\n\n            // If camera is null, set mainCamera to undefined (will use default camera)\n            // If camera is a camera object, use it\n            // If camera is undefined and no lastMainCamera, it becomes undefined\n            this._scene.mainCamera = camera === null ? undefined : camera || undefined\n        }\n    }\n\n    private _resolvePluginOrClass<T extends IViewerPlugin>(plugin: T | Class<T>, ...args: ConstructorParameters<Class<T>>): T|undefined {\n        let p: T\n        if ((plugin as Class<IViewerPlugin>).prototype) {\n            const p1 = this.getPlugin(plugin as Class<T>)\n            if (p1) {\n                this.console.error(`Plugin of type ${p1.constructor.PluginType} already exists, no new plugin created`, p1)\n                return p1\n            }\n            try {\n                p = new (plugin as Class<T>)(...args)\n            } catch (e) {\n                this.console.error('ThreeViewer: Error creating plugin', e)\n                return undefined\n            }\n        } else p = plugin as T\n        return p\n    }\n\n    private _renderEnabledChanged(): void {\n        this.dispatchEvent({type: this.renderEnabled ? 'renderEnabled' : 'renderDisabled'})\n    }\n\n    private readonly _defaultConfig: ISerializedViewerConfig = {\n        assetType: 'config',\n        type: this.type,\n        version: ThreeViewer.VERSION,\n        metadata: {\n            generator: 'ThreePipe',\n            version: 2,\n        },\n        plugins: [],\n    }\n\n    // todo: find a better fix for context loss and restore?\n    private _lastSize = new Vector2()\n    private _onContextRestore = (_: Event) => {\n        this.enabled = true\n        this._canvas.width = this._lastSize.width\n        this._canvas.height = this._lastSize.height\n        this.resize()\n        this._scene.setDirty({refreshScene: true, frameFade: false})\n    }\n    private _onContextLost = (_: Event) => {\n        this._lastSize.set(this._canvas.width, this._canvas.height)\n        this._canvas.width = 2\n        this._canvas.height = 2\n        this.resize()\n        this.enabled = false\n    }\n\n    /**\n     * Fits the camera to frame the selected objects (or the entire scene if none).\n     * When `duration` is 0, the view is set instantly without animation.\n     * @param selected - objects to fit (Object3D, materials, textures, or geometries). Falls back to entire scene.\n     * @param distanceMultiplier - padding multiplier (default 1.5)\n     * @param duration - animation duration in ms. Pass 0 for instant. Defaults to CameraViewPlugin.animDuration (1000ms).\n     * @param ease - easing function or name\n     */\n    public async fitToView(selected?: Object3D|Object3D[]|IMaterial|IMaterial[]|ITexture|ITexture[]|IGeometry|IGeometry[], distanceMultiplier = 1.5, duration?: number, ease?: ((v: number) => number)|EasingFunctionType) {\n        const camViews = this.getOrAddPluginSync(CameraViewPlugin)\n        await camViews?.animateToFitObject(selected, distanceMultiplier, duration, ease, {min: ((<OrbitControls3> this.scene.mainCamera.controls)?.minDistance ?? 0.5) + 0.5, max: 1000.0})\n    }\n\n    private _canvasTexture?: CanvasTexture&ITexture\n\n    /**\n     * Create and get a three.js CanvasTexture from the viewer's canvas.\n     */\n    get canvasTexture(): CanvasTexture {\n        if (!this._canvas) throw new Error('Canvas not found')\n        if (!this._canvasTexture) {\n            this._canvasTexture = new CanvasTexture(this._canvas)\n            this._canvasTexture.flipY = false\n            this._canvasTexture.needsUpdate = true\n        }\n        return this._canvasTexture\n    }\n\n    private _stopPropagation = (e: PointerEvent | MouseEvent | TouchEvent) => {\n        if (!this.scene.mainCamera.canUserInteract) return\n        e.stopPropagation()\n    }\n\n    // todo: create/load texture utils?\n\n    // another event system with order sorting\n    private _onListeners: {[T in keyof ViewerEventMap]?: ViewerEventListener<T>[]} = {}\n    on<T extends keyof ViewerEventMap>(type: T, listener: ViewerEventListener<T>) {\n        if (!this._onListeners[type]) this._onListeners[type] = []\n        if (this._onListeners[type].includes(listener)) {\n            return\n        }\n        this._onListeners[type].push(listener)\n        return ()=> this.off(type, listener)\n    }\n    off<T extends keyof ViewerEventMap>(type: T, listener: ViewerEventListener<T>): void {\n        const index = this._onListeners[type]?.indexOf(listener) ?? -1\n        if (index !== -1) {\n            this._onListeners[type]?.splice(index, 1)\n        }\n    }\n    dispatch<T extends keyof ViewerEventMap>(type: T, event: ViewerEventMap[T]): void {\n        const listeners = this._onListeners[type]\n        if (listeners) {\n            const sortedListeners = listeners.slice().sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n            for (const listener of sortedListeners) {\n                listener.callback({...event, type, target: this})\n            }\n        }\n    }\n\n\n    private _onPluginAdd(p: IViewerPlugin) {\n        const ev = {type: 'addPlugin', target: this, plugin: p} as const\n        this.dispatchEvent(ev)\n        const types = getPluginTypes(p)\n        this._pluginListeners.add.filter(l=>\n            !l.p.length ||\n            l.p.find(p1=>types.includes(p1))\n        ).forEach(l=> l.l(ev))\n        this.setDirty(p)\n    }\n\n    private _onPluginRemove(p: IViewerPlugin, dispose = false) {\n        const ev = {type: 'removePlugin', target: this, plugin: p} as const\n        this.dispatchEvent(ev)\n        const types = getPluginTypes(p)\n        this._pluginListeners.remove.filter(l=>\n            !l.p.length ||\n            l.p.find(p1=>types.includes(p1))\n        ).forEach(l=> l.l(ev))\n        delete this.plugins[p.constructor.PluginType]\n        if (p.constructor.OldPluginType) delete this.plugins[p.constructor.OldPluginType]\n        if (dispose) p.dispose() // todo await?\n        this.setDirty(p)\n    }\n\n    private _pluginListeners: Record<'add' | 'remove', ({p: string[], l: (event: IViewerEvent) => void})[]> = {\n        add: [],\n        remove: [],\n    }\n\n    addPluginListener(type: 'add' | 'remove', listener: (event: IViewerEvent) => void, ...plugins: (string|undefined)[]): void {\n        this._pluginListeners[type].push({p: plugins.filter(p=>!!p) as string[], l: listener})\n    }\n\n    removePluginListener(type: 'add' | 'remove', listener: (event: IViewerEvent) => void): void {\n        this._pluginListeners[type] = this._pluginListeners[type].filter(l=> l.l !== listener)\n    }\n\n    /**\n     * Can be used to \"subscribe\" to plugins.\n     * @param plugin\n     * @param mount\n     * @param unmount\n     */\n    forPlugin<T extends IViewerPlugin>(plugin: string|Class<T>, mount: (p: T) => void, unmount?: (p: T) => void, thisPlugin?: AViewerPlugin): void {\n        const um = ()=>{\n            if (unmount) {\n                const lis = () => {\n                    const p1 = this.getPlugin(plugin)\n                    if (!p1) return\n                    this.removePluginListener('remove', lis)\n                    unmount(p1)\n                }\n                this.addPluginListener('remove', lis, typeof plugin === 'string' ? plugin : (plugin as any).PluginType)\n                if (thisPlugin?.constructor.PluginType) {\n                    this.addPluginListener('remove', lis, thisPlugin.constructor.PluginType)\n                }\n            }\n        }\n\n        const p = this.getPlugin(plugin)\n        if (p) {\n            mount(p)\n            um()\n        } else {\n            const lis = () => {\n                const p1 = this.getPlugin(plugin)\n                if (!p1) return\n                this.removePluginListener('add', lis)\n                mount(p1)\n                um()\n            }\n            this.addPluginListener('add', lis, typeof plugin === 'string' ? plugin : (plugin as any).PluginType, typeof plugin === 'string' ? undefined : (plugin as any).OldPluginType)\n        }\n\n    }\n\n    // region deprecated\n\n    /**\n     * The renderer for the viewer that's attached to the canvas. This is wrapper around WebGLRenderer and EffectComposer and manages post-processing passes and rendering logic\n     * @deprecated - use {@link renderManager} instead\n     */\n    get renderer(): ViewerRenderManager {\n        this.console.error('ThreeViewer: renderer is deprecated, use renderManager instead')\n        return this.renderManager\n    }\n\n    /**\n     * @deprecated use {@link assetManager} instead.\n     * Gets the Asset manager, contains useful functions for managing, loading and inserting assets.\n     */\n    getManager(): AssetManager|undefined {\n        return this.assetManager\n    }\n\n    /**\n     * Get the Plugin by the string type.\n     * @deprecated - Use {@link getPlugin} instead.\n     * @param type\n     * @returns {T | undefined}\n     */\n    getPluginByType<T extends IViewerPlugin>(type: string): T | undefined {\n        return this.plugins[type] as T | undefined\n    }\n\n    // endregion deprecated\n\n}\n","export const REVISION = '163';\n\nexport const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nexport const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nexport const CullFaceNone = 0;\nexport const CullFaceBack = 1;\nexport const CullFaceFront = 2;\nexport const CullFaceFrontBack = 3;\nexport const BasicShadowMap = 0;\nexport const PCFShadowMap = 1;\nexport const PCFSoftShadowMap = 2;\nexport const VSMShadowMap = 3;\nexport const FrontSide = 0;\nexport const BackSide = 1;\nexport const DoubleSide = 2;\nexport const NoBlending = 0;\nexport const NormalBlending = 1;\nexport const AdditiveBlending = 2;\nexport const SubtractiveBlending = 3;\nexport const MultiplyBlending = 4;\nexport const CustomBlending = 5;\nexport const AddEquation = 100;\nexport const SubtractEquation = 101;\nexport const ReverseSubtractEquation = 102;\nexport const MinEquation = 103;\nexport const MaxEquation = 104;\nexport const ZeroFactor = 200;\nexport const OneFactor = 201;\nexport const SrcColorFactor = 202;\nexport const OneMinusSrcColorFactor = 203;\nexport const SrcAlphaFactor = 204;\nexport const OneMinusSrcAlphaFactor = 205;\nexport const DstAlphaFactor = 206;\nexport const OneMinusDstAlphaFactor = 207;\nexport const DstColorFactor = 208;\nexport const OneMinusDstColorFactor = 209;\nexport const SrcAlphaSaturateFactor = 210;\nexport const ConstantColorFactor = 211;\nexport const OneMinusConstantColorFactor = 212;\nexport const ConstantAlphaFactor = 213;\nexport const OneMinusConstantAlphaFactor = 214;\nexport const NeverDepth = 0;\nexport const AlwaysDepth = 1;\nexport const LessDepth = 2;\nexport const LessEqualDepth = 3;\nexport const EqualDepth = 4;\nexport const GreaterEqualDepth = 5;\nexport const GreaterDepth = 6;\nexport const NotEqualDepth = 7;\nexport const MultiplyOperation = 0;\nexport const MixOperation = 1;\nexport const AddOperation = 2;\nexport const NoToneMapping = 0;\nexport const LinearToneMapping = 1;\nexport const ReinhardToneMapping = 2;\nexport const CineonToneMapping = 3;\nexport const ACESFilmicToneMapping = 4;\nexport const CustomToneMapping = 5;\nexport const AgXToneMapping = 6;\nexport const NeutralToneMapping = 7;\nexport const AttachedBindMode = 'attached';\nexport const DetachedBindMode = 'detached';\n\nexport const UVMapping = 300;\nexport const CubeReflectionMapping = 301;\nexport const CubeRefractionMapping = 302;\nexport const EquirectangularReflectionMapping = 303;\nexport const EquirectangularRefractionMapping = 304;\nexport const CubeUVReflectionMapping = 306;\nexport const RepeatWrapping = 1000;\nexport const ClampToEdgeWrapping = 1001;\nexport const MirroredRepeatWrapping = 1002;\nexport const NearestFilter = 1003;\nexport const NearestMipmapNearestFilter = 1004;\nexport const NearestMipMapNearestFilter = 1004;\nexport const NearestMipmapLinearFilter = 1005;\nexport const NearestMipMapLinearFilter = 1005;\nexport const LinearFilter = 1006;\nexport const LinearMipmapNearestFilter = 1007;\nexport const LinearMipMapNearestFilter = 1007;\nexport const LinearMipmapLinearFilter = 1008;\nexport const LinearMipMapLinearFilter = 1008;\nexport const UnsignedByteType = 1009;\nexport const ByteType = 1010;\nexport const ShortType = 1011;\nexport const UnsignedShortType = 1012;\nexport const IntType = 1013;\nexport const UnsignedIntType = 1014;\nexport const FloatType = 1015;\nexport const HalfFloatType = 1016;\nexport const UnsignedShort4444Type = 1017;\nexport const UnsignedShort5551Type = 1018;\nexport const UnsignedInt248Type = 1020;\nexport const UnsignedInt5999Type = 35902;\nexport const AlphaFormat = 1021;\nexport const RGBFormat = 1022;\nexport const RGBAFormat = 1023;\nexport const LuminanceFormat = 1024;\nexport const LuminanceAlphaFormat = 1025;\nexport const DepthFormat = 1026;\nexport const DepthStencilFormat = 1027;\nexport const RedFormat = 1028;\nexport const RedIntegerFormat = 1029;\nexport const RGFormat = 1030;\nexport const RGIntegerFormat = 1031;\nexport const RGBAIntegerFormat = 1033;\n\nexport const RGB_S3TC_DXT1_Format = 33776;\nexport const RGBA_S3TC_DXT1_Format = 33777;\nexport const RGBA_S3TC_DXT3_Format = 33778;\nexport const RGBA_S3TC_DXT5_Format = 33779;\nexport const RGB_PVRTC_4BPPV1_Format = 35840;\nexport const RGB_PVRTC_2BPPV1_Format = 35841;\nexport const RGBA_PVRTC_4BPPV1_Format = 35842;\nexport const RGBA_PVRTC_2BPPV1_Format = 35843;\nexport const RGB_ETC1_Format = 36196;\nexport const RGB_ETC2_Format = 37492;\nexport const RGBA_ETC2_EAC_Format = 37496;\nexport const RGBA_ASTC_4x4_Format = 37808;\nexport const RGBA_ASTC_5x4_Format = 37809;\nexport const RGBA_ASTC_5x5_Format = 37810;\nexport const RGBA_ASTC_6x5_Format = 37811;\nexport const RGBA_ASTC_6x6_Format = 37812;\nexport const RGBA_ASTC_8x5_Format = 37813;\nexport const RGBA_ASTC_8x6_Format = 37814;\nexport const RGBA_ASTC_8x8_Format = 37815;\nexport const RGBA_ASTC_10x5_Format = 37816;\nexport const RGBA_ASTC_10x6_Format = 37817;\nexport const RGBA_ASTC_10x8_Format = 37818;\nexport const RGBA_ASTC_10x10_Format = 37819;\nexport const RGBA_ASTC_12x10_Format = 37820;\nexport const RGBA_ASTC_12x12_Format = 37821;\nexport const RGBA_BPTC_Format = 36492;\nexport const RGB_BPTC_SIGNED_Format = 36494;\nexport const RGB_BPTC_UNSIGNED_Format = 36495;\nexport const RED_RGTC1_Format = 36283;\nexport const SIGNED_RED_RGTC1_Format = 36284;\nexport const RED_GREEN_RGTC2_Format = 36285;\nexport const SIGNED_RED_GREEN_RGTC2_Format = 36286;\nexport const LoopOnce = 2200;\nexport const LoopRepeat = 2201;\nexport const LoopPingPong = 2202;\nexport const InterpolateDiscrete = 2300;\nexport const InterpolateLinear = 2301;\nexport const InterpolateSmooth = 2302;\nexport const ZeroCurvatureEnding = 2400;\nexport const ZeroSlopeEnding = 2401;\nexport const WrapAroundEnding = 2402;\nexport const NormalAnimationBlendMode = 2500;\nexport const AdditiveAnimationBlendMode = 2501;\nexport const TrianglesDrawMode = 0;\nexport const TriangleStripDrawMode = 1;\nexport const TriangleFanDrawMode = 2;\nexport const BasicDepthPacking = 3200;\nexport const RGBADepthPacking = 3201;\nexport const TangentSpaceNormalMap = 0;\nexport const ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nexport const NoColorSpace = '';\nexport const SRGBColorSpace = 'srgb';\nexport const LinearSRGBColorSpace = 'srgb-linear';\nexport const DisplayP3ColorSpace = 'display-p3';\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\nexport const RGBM16ColorSpace = 'rgbm-16';\n\nexport const LinearTransfer = 'linear';\nexport const SRGBTransfer = 'srgb';\n\nexport const Rec709Primaries = 'rec709';\nexport const P3Primaries = 'p3';\n\nexport const ZeroStencilOp = 0;\nexport const KeepStencilOp = 7680;\nexport const ReplaceStencilOp = 7681;\nexport const IncrementStencilOp = 7682;\nexport const DecrementStencilOp = 7683;\nexport const IncrementWrapStencilOp = 34055;\nexport const DecrementWrapStencilOp = 34056;\nexport const InvertStencilOp = 5386;\n\nexport const NeverStencilFunc = 512;\nexport const LessStencilFunc = 513;\nexport const EqualStencilFunc = 514;\nexport const LessEqualStencilFunc = 515;\nexport const GreaterStencilFunc = 516;\nexport const NotEqualStencilFunc = 517;\nexport const GreaterEqualStencilFunc = 518;\nexport const AlwaysStencilFunc = 519;\n\nexport const NeverCompare = 512;\nexport const LessCompare = 513;\nexport const EqualCompare = 514;\nexport const LessEqualCompare = 515;\nexport const GreaterCompare = 516;\nexport const NotEqualCompare = 517;\nexport const GreaterEqualCompare = 518;\nexport const AlwaysCompare = 519;\n\nexport const StaticDrawUsage = 35044;\nexport const DynamicDrawUsage = 35048;\nexport const StreamDrawUsage = 35040;\nexport const StaticReadUsage = 35045;\nexport const DynamicReadUsage = 35049;\nexport const StreamReadUsage = 35041;\nexport const StaticCopyUsage = 35046;\nexport const DynamicCopyUsage = 35050;\nexport const StreamCopyUsage = 35042;\n\nexport const GLSL1 = '100';\nexport const GLSL3 = '300 es';\n\nexport const WebGLCoordinateSystem = 2000;\nexport const WebGPUCoordinateSystem = 2001;\n\n/** @deprecated Use LinearSRGBColorSpace or NoColorSpace in three.js r152+. */\nexport const LinearEncoding = 3000;\n/** @deprecated Use SRGBColorSpace in three.js r152+. */\nexport const sRGBEncoding = 3001;\n","import {\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tMesh,\n\tVector3\n} from 'three';\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\nimport { LineMaterial } from '../lines/LineMaterial.js';\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nclass Wireframe extends Mesh {\n\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isWireframe = true;\n\n\t\tthis.type = 'Wireframe';\n\n\t}\n\n\t// for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { Wireframe };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * tool for \"unwrapping\" and debugging three.js geometries UV mapping\n *\n * Sample usage:\n *\tdocument.body.appendChild( UVsDebug( new THREE.SphereGeometry( 10, 10, 10, 10 ) );\n *\n */\n\nfunction UVsDebug( geometry, size = 1024 ) {\n\n\t// handles wrapping of uv.x > 1 only\n\n\tconst abc = 'abc';\n\tconst a = new Vector2();\n\tconst b = new Vector2();\n\n\tconst uvs = [\n\t\tnew Vector2(),\n\t\tnew Vector2(),\n\t\tnew Vector2()\n\t];\n\n\tconst face = [];\n\n\tconst canvas = document.createElement( 'canvas' );\n\tconst width = size; // power of 2 required for wrapping\n\tconst height = size;\n\tcanvas.width = width;\n\tcanvas.height = height;\n\n\tconst ctx = canvas.getContext( '2d' );\n\tctx.lineWidth = 1;\n\tctx.strokeStyle = 'rgb( 63, 63, 63 )';\n\tctx.textAlign = 'center';\n\n\t// paint background white\n\n\tctx.fillStyle = 'rgb( 255, 255, 255 )';\n\tctx.fillRect( 0, 0, width, height );\n\n\tconst index = geometry.index;\n\tconst uvAttribute = geometry.attributes.uv;\n\n\tif ( index ) {\n\n\t\t// indexed geometry\n\n\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\tface[ 0 ] = index.getX( i );\n\t\t\tface[ 1 ] = index.getX( i + 1 );\n\t\t\tface[ 2 ] = index.getX( i + 2 );\n\n\t\t\tuvs[ 0 ].fromBufferAttribute( uvAttribute, face[ 0 ] );\n\t\t\tuvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] );\n\t\t\tuvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] );\n\n\t\t\tprocessFace( face, uvs, i / 3 );\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed geometry\n\n\t\tfor ( let i = 0, il = uvAttribute.count; i < il; i += 3 ) {\n\n\t\t\tface[ 0 ] = i;\n\t\t\tface[ 1 ] = i + 1;\n\t\t\tface[ 2 ] = i + 2;\n\n\t\t\tuvs[ 0 ].fromBufferAttribute( uvAttribute, face[ 0 ] );\n\t\t\tuvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] );\n\t\t\tuvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] );\n\n\t\t\tprocessFace( face, uvs, i / 3 );\n\n\t\t}\n\n\t}\n\n\treturn canvas;\n\n\tfunction processFace( face, uvs, index ) {\n\n\t\t// draw contour of face\n\n\t\tctx.beginPath();\n\n\t\ta.set( 0, 0 );\n\n\t\tfor ( let j = 0, jl = uvs.length; j < jl; j ++ ) {\n\n\t\t\tconst uv = uvs[ j ];\n\n\t\t\ta.x += uv.x;\n\t\t\ta.y += uv.y;\n\n\t\t\tif ( j === 0 ) {\n\n\t\t\t\tctx.moveTo( uv.x * ( width - 2 ) + 0.5, ( 1 - uv.y ) * ( height - 2 ) + 0.5 );\n\n\t\t\t} else {\n\n\t\t\t\tctx.lineTo( uv.x * ( width - 2 ) + 0.5, ( 1 - uv.y ) * ( height - 2 ) + 0.5 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tctx.closePath();\n\t\tctx.stroke();\n\n\t\t// calculate center of face\n\n\t\ta.divideScalar( uvs.length );\n\n\t\t// label the face number\n\n\t\tctx.font = '18px Arial';\n\t\tctx.fillStyle = 'rgb( 63, 63, 63 )';\n\t\tctx.fillText( index, a.x * width, ( 1 - a.y ) * height );\n\n\t\tif ( a.x > 0.95 ) {\n\n\t\t\t// wrap x // 0.95 is arbitrary\n\n\t\t\tctx.fillText( index, ( a.x % 1 ) * width, ( 1 - a.y ) * height );\n\n\t\t}\n\n\t\t//\n\n\t\tctx.font = '12px Arial';\n\t\tctx.fillStyle = 'rgb( 191, 191, 191 )';\n\n\t\t// label uv edge orders\n\n\t\tfor ( let j = 0, jl = uvs.length; j < jl; j ++ ) {\n\n\t\t\tconst uv = uvs[ j ];\n\t\t\tb.addVectors( a, uv ).divideScalar( 2 );\n\n\t\t\tconst vnum = face[ j ];\n\t\t\tctx.fillText( abc[ j ] + vnum, b.x * width, ( 1 - b.y ) * height );\n\n\t\t\tif ( b.x > 0.95 ) {\n\n\t\t\t\t// wrap x\n\n\t\t\t\tctx.fillText( abc[ j ] + vnum, ( b.x % 1 ) * width, ( 1 - b.y ) * height );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { UVsDebug };\n","/**\n * @author Deepkolos / https://github.com/deepkolos\n */\n\nexport class WorkerPool {\n\n\tconstructor( pool = 4 ) {\n\n\t\tthis.pool = pool;\n\t\tthis.queue = [];\n\t\tthis.workers = [];\n\t\tthis.workersResolve = [];\n\t\tthis.workerStatus = 0;\n\n\t}\n\n\t_initWorker( workerId ) {\n\n\t\tif ( ! this.workers[ workerId ] ) {\n\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );\n\t\t\tthis.workers[ workerId ] = worker;\n\n\t\t}\n\n\t}\n\n\t_getIdleWorker() {\n\n\t\tfor ( let i = 0; i < this.pool; i ++ )\n\t\t\tif ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;\n\n\t\treturn - 1;\n\n\t}\n\n\t_onMessage( workerId, msg ) {\n\n\t\tconst resolve = this.workersResolve[ workerId ];\n\t\tresolve && resolve( msg );\n\n\t\tif ( this.queue.length ) {\n\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t} else {\n\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\n\t\t}\n\n\t}\n\n\tsetWorkerCreator( workerCreator ) {\n\n\t\tthis.workerCreator = workerCreator;\n\n\t}\n\n\tsetWorkerLimit( pool ) {\n\n\t\tthis.pool = pool;\n\n\t}\n\n\tpostMessage( msg, transfer ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif ( workerId !== - 1 ) {\n\n\t\t\t\tthis._initWorker( workerId );\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t\t} else {\n\n\t\t\t\tthis.queue.push( { resolve, msg, transfer } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workers.forEach( ( worker ) => worker.terminate() );\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\n\t}\n\n}\n","const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,U=161,c=162,h=163,_=0,p=1,g=0,y=1,x=2,u=3,b=4,d=5,m=6,w=7,D=8,B=9,L=10,A=11,k=12,v=13,S=14,I=15,O=16,T=17,V=18,E=0,F=1,P=2,C=3,z=4,M=5,W=6,N=7,H=8,K=9,X=10,j=11,R=0,Y=1,q=2,G=13,J=14,Q=15,Z=128,$=64,tt=32,et=16,nt=0,it=1,st=2,at=3,rt=4,ot=5,lt=6,ft=7,Ut=8,ct=9,ht=10,_t=13,pt=14,gt=15,yt=16,xt=17,ut=20,bt=21,dt=22,mt=23,wt=24,Dt=27,Bt=28,Lt=29,At=30,kt=31,vt=34,St=35,It=36,Ot=37,Tt=38,Vt=41,Et=42,Ft=43,Pt=44,Ct=45,zt=48,Mt=49,Wt=50,Nt=58,Ht=59,Kt=62,Xt=63,jt=64,Rt=65,Yt=68,qt=69,Gt=70,Jt=71,Qt=74,Zt=75,$t=76,te=77,ee=78,ne=81,ie=82,se=83,ae=84,re=85,oe=88,le=89,fe=90,Ue=91,ce=92,he=95,_e=96,pe=97,ge=98,ye=99,xe=100,ue=101,be=102,de=103,me=104,we=105,De=106,Be=107,Le=108,Ae=109,ke=110,ve=111,Se=112,Ie=113,Oe=114,Te=115,Ve=116,Ee=117,Fe=118,Pe=119,Ce=120,ze=121,Me=122,We=123,Ne=124,He=125,Ke=126,Xe=127,je=128,Re=129,Ye=130,qe=131,Ge=132,Je=133,Qe=134,Ze=135,$e=136,tn=137,en=138,nn=139,sn=140,an=141,rn=142,on=143,ln=144,fn=145,Un=146,cn=147,hn=148,_n=149,pn=150,gn=151,yn=152,xn=153,un=154,bn=155,dn=156,mn=157,wn=158,Dn=159,Bn=160,Ln=161,An=162,kn=163,vn=164,Sn=165,In=166,On=167,Tn=168,Vn=169,En=170,Fn=171,Pn=172,Cn=173,zn=174,Mn=175,Wn=176,Nn=177,Hn=178,Kn=179,Xn=180,jn=181,Rn=182,Yn=183,qn=184,Gn=1000156007,Jn=1000156008,Qn=1000156009,Zn=1000156010,$n=1000156011,ti=1000156017,ei=1000156018,ni=1000156019,ii=1000156020,si=1000156021,ai=1000054e3,ri=1000054001,oi=1000054002,li=1000054003,fi=1000054004,Ui=1000054005,ci=1000054006,hi=1000054007,_i=1000066e3,pi=1000066001,gi=1000066002,yi=1000066003,xi=1000066004,ui=1000066005,bi=1000066006,di=1000066007,mi=1000066008,wi=1000066009,Di=1000066010,Bi=1000066011,Li=1000066012,Ai=1000066013,ki=100034e4,vi=1000340001;class Si{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Ii{constructor(t,e,n,i){this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_skip(t){return this._offset+=t,this}_scan(t,e=0){const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i<t;)i++,this._offset++;return i<t&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}const Oi=new Uint8Array([0]),Ti=[171,75,84,88,32,50,48,187,13,10,26,10];function Vi(t){return\"undefined\"!=typeof TextEncoder?(new TextEncoder).encode(t):Buffer.from(t)}function Ei(t){return\"undefined\"!=typeof TextDecoder?(new TextDecoder).decode(t):Buffer.from(t).toString(\"utf8\")}function Fi(t){let e=0;for(const n of t)e+=n.byteLength;const n=new Uint8Array(e);let i=0;for(const e of t)n.set(new Uint8Array(e),i),i+=e.byteLength;return n}function Pi(t){const e=new Uint8Array(t.buffer,t.byteOffset,Ti.length);if(e[0]!==Ti[0]||e[1]!==Ti[1]||e[2]!==Ti[2]||e[3]!==Ti[3]||e[4]!==Ti[4]||e[5]!==Ti[5]||e[6]!==Ti[6]||e[7]!==Ti[7]||e[8]!==Ti[8]||e[9]!==Ti[9]||e[10]!==Ti[10]||e[11]!==Ti[11])throw new Error(\"Missing KTX 2.0 identifier.\");const n=new Si,i=17*Uint32Array.BYTES_PER_ELEMENT,s=new Ii(t,Ti.length,i,!0);n.vkFormat=s._nextUint32(),n.typeSize=s._nextUint32(),n.pixelWidth=s._nextUint32(),n.pixelHeight=s._nextUint32(),n.pixelDepth=s._nextUint32(),n.layerCount=s._nextUint32(),n.faceCount=s._nextUint32();const a=s._nextUint32();n.supercompressionScheme=s._nextUint32();const r=s._nextUint32(),o=s._nextUint32(),l=s._nextUint32(),f=s._nextUint32(),U=s._nextUint64(),c=s._nextUint64(),h=new Ii(t,Ti.length+i,3*a*8,!0);for(let e=0;e<a;e++)n.levels.push({levelData:new Uint8Array(t.buffer,t.byteOffset+h._nextUint64(),h._nextUint64()),uncompressedByteLength:h._nextUint64()});const _=new Ii(t,r,o,!0),p={vendorId:_._skip(4)._nextUint16(),descriptorType:_._nextUint16(),versionNumber:_._nextUint16(),descriptorBlockSize:_._nextUint16(),colorModel:_._nextUint8(),colorPrimaries:_._nextUint8(),transferFunction:_._nextUint8(),flags:_._nextUint8(),texelBlockDimension:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],bytesPlane:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],samples:[]},g=(p.descriptorBlockSize/4-6)/4;for(let t=0;t<g;t++){const e={bitOffset:_._nextUint16(),bitLength:_._nextUint8(),channelType:_._nextUint8(),samplePosition:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],sampleLower:-Infinity,sampleUpper:Infinity};64&e.channelType?(e.sampleLower=_._nextInt32(),e.sampleUpper=_._nextInt32()):(e.sampleLower=_._nextUint32(),e.sampleUpper=_._nextUint32()),p.samples[t]=e}n.dataFormatDescriptor.length=0,n.dataFormatDescriptor.push(p);const y=new Ii(t,l,f,!0);for(;y._offset<f;){const t=y._nextUint32(),e=y._scan(t),i=Ei(e),s=y._scan(t-e.byteLength);n.keyValue[i]=i.match(/^ktx/i)?Ei(s):s,y._offset%4&&y._skip(4-y._offset%4)}if(c<=0)return n;const x=new Ii(t,U,c,!0),u=x._nextUint16(),b=x._nextUint16(),d=x._nextUint32(),m=x._nextUint32(),w=x._nextUint32(),D=x._nextUint32(),B=[];for(let t=0;t<a;t++)B.push({imageFlags:x._nextUint32(),rgbSliceByteOffset:x._nextUint32(),rgbSliceByteLength:x._nextUint32(),alphaSliceByteOffset:x._nextUint32(),alphaSliceByteLength:x._nextUint32()});const L=U+x._offset,A=L+d,k=A+m,v=k+w,S=new Uint8Array(t.buffer,t.byteOffset+L,d),I=new Uint8Array(t.buffer,t.byteOffset+A,m),O=new Uint8Array(t.buffer,t.byteOffset+k,w),T=new Uint8Array(t.buffer,t.byteOffset+v,D);return n.globalData={endpointCount:u,selectorCount:b,imageDescs:B,endpointsData:S,selectorsData:I,tablesData:O,extendedData:T},n}function Ci(){return(Ci=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}const zi={keepWriter:!1};function Mi(t,e={}){e=Ci({},zi,e);let n=new ArrayBuffer(0);if(t.globalData){const e=new ArrayBuffer(20+5*t.globalData.imageDescs.length*4),i=new DataView(e);i.setUint16(0,t.globalData.endpointCount,!0),i.setUint16(2,t.globalData.selectorCount,!0),i.setUint32(4,t.globalData.endpointsData.byteLength,!0),i.setUint32(8,t.globalData.selectorsData.byteLength,!0),i.setUint32(12,t.globalData.tablesData.byteLength,!0),i.setUint32(16,t.globalData.extendedData.byteLength,!0);for(let e=0;e<t.globalData.imageDescs.length;e++){const n=t.globalData.imageDescs[e];i.setUint32(20+5*e*4+0,n.imageFlags,!0),i.setUint32(20+5*e*4+4,n.rgbSliceByteOffset,!0),i.setUint32(20+5*e*4+8,n.rgbSliceByteLength,!0),i.setUint32(20+5*e*4+12,n.alphaSliceByteOffset,!0),i.setUint32(20+5*e*4+16,n.alphaSliceByteLength,!0)}n=Fi([e,t.globalData.endpointsData,t.globalData.selectorsData,t.globalData.tablesData,t.globalData.extendedData])}const i=[];let s=t.keyValue;e.keepWriter||(s=Ci({},t.keyValue,{KTXwriter:\"KTX-Parse v0.3.1\"}));for(const t in s){const e=s[t],n=Vi(t),a=\"string\"==typeof e?Vi(e):e,r=n.byteLength+1+a.byteLength+1,o=r%4?4-r%4:0;i.push(Fi([new Uint32Array([r]),n,Oi,a,Oi,new Uint8Array(o).fill(0)]))}const a=Fi(i);if(1!==t.dataFormatDescriptor.length||0!==t.dataFormatDescriptor[0].descriptorType)throw new Error(\"Only BASICFORMAT Data Format Descriptor output supported.\");const r=t.dataFormatDescriptor[0],o=new ArrayBuffer(28+16*r.samples.length),l=new DataView(o),f=24+16*r.samples.length;if(l.setUint32(0,o.byteLength,!0),l.setUint16(4,r.vendorId,!0),l.setUint16(6,r.descriptorType,!0),l.setUint16(8,r.versionNumber,!0),l.setUint16(10,f,!0),l.setUint8(12,r.colorModel),l.setUint8(13,r.colorPrimaries),l.setUint8(14,r.transferFunction),l.setUint8(15,r.flags),!Array.isArray(r.texelBlockDimension))throw new Error(\"texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.\");l.setUint8(16,r.texelBlockDimension[0]),l.setUint8(17,r.texelBlockDimension[1]),l.setUint8(18,r.texelBlockDimension[2]),l.setUint8(19,r.texelBlockDimension[3]);for(let t=0;t<8;t++)l.setUint8(20+t,r.bytesPlane[t]);for(let t=0;t<r.samples.length;t++){const e=r.samples[t],n=28+16*t;if(e.channelID)throw new Error(\"channelID has been renamed to channelType.\");l.setUint16(n+0,e.bitOffset,!0),l.setUint8(n+2,e.bitLength),l.setUint8(n+3,e.channelType),l.setUint8(n+4,e.samplePosition[0]),l.setUint8(n+5,e.samplePosition[1]),l.setUint8(n+6,e.samplePosition[2]),l.setUint8(n+7,e.samplePosition[3]),64&e.channelType?(l.setInt32(n+8,e.sampleLower,!0),l.setInt32(n+12,e.sampleUpper,!0)):(l.setUint32(n+8,e.sampleLower,!0),l.setUint32(n+12,e.sampleUpper,!0))}const U=Ti.length+68+3*t.levels.length*8,c=U+o.byteLength;let h=n.byteLength>0?c+a.byteLength:0;h%8&&(h+=8-h%8);const _=[],p=new DataView(new ArrayBuffer(3*t.levels.length*8));let g=(h||c+a.byteLength)+n.byteLength;for(let e=0;e<t.levels.length;e++){const n=t.levels[e];_.push(n.levelData),p.setBigUint64(24*e+0,BigInt(g),!0),p.setBigUint64(24*e+8,BigInt(n.levelData.byteLength),!0),p.setBigUint64(24*e+16,BigInt(n.uncompressedByteLength),!0),g+=n.levelData.byteLength}const y=new ArrayBuffer(68),x=new DataView(y);return x.setUint32(0,t.vkFormat,!0),x.setUint32(4,t.typeSize,!0),x.setUint32(8,t.pixelWidth,!0),x.setUint32(12,t.pixelHeight,!0),x.setUint32(16,t.pixelDepth,!0),x.setUint32(20,t.layerCount,!0),x.setUint32(24,t.faceCount,!0),x.setUint32(28,t.levels.length,!0),x.setUint32(32,t.supercompressionScheme,!0),x.setUint32(36,U,!0),x.setUint32(40,o.byteLength,!0),x.setUint32(44,c,!0),x.setUint32(48,a.byteLength,!0),x.setBigUint64(52,BigInt(n.byteLength>0?h:0),!0),x.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Fi([new Uint8Array(Ti).buffer,y,p.buffer,o,a,h>0?new ArrayBuffer(h-(c+a.byteLength)):new ArrayBuffer(0),n,..._]))}export{Q as KHR_DF_CHANNEL_RGBSDA_ALPHA,q as KHR_DF_CHANNEL_RGBSDA_BLUE,J as KHR_DF_CHANNEL_RGBSDA_DEPTH,Y as KHR_DF_CHANNEL_RGBSDA_GREEN,R as KHR_DF_CHANNEL_RGBSDA_RED,G as KHR_DF_CHANNEL_RGBSDA_STENCIL,p as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,_ as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,c as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,h as KHR_DF_MODEL_ETC1S,U as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,o as KHR_DF_MODEL_UNSPECIFIED,W as KHR_DF_PRIMARIES_ACES,N as KHR_DF_PRIMARIES_ACESCC,j as KHR_DF_PRIMARIES_ADOBERGB,z as KHR_DF_PRIMARIES_BT2020,P as KHR_DF_PRIMARIES_BT601_EBU,C as KHR_DF_PRIMARIES_BT601_SMPTE,F as KHR_DF_PRIMARIES_BT709,M as KHR_DF_PRIMARIES_CIEXYZ,X as KHR_DF_PRIMARIES_DISPLAYP3,H as KHR_DF_PRIMARIES_NTSC1953,K as KHR_DF_PRIMARIES_PAL525,E as KHR_DF_PRIMARIES_UNSPECIFIED,tt as KHR_DF_SAMPLE_DATATYPE_EXPONENT,Z as KHR_DF_SAMPLE_DATATYPE_FLOAT,et as KHR_DF_SAMPLE_DATATYPE_LINEAR,$ as KHR_DF_SAMPLE_DATATYPE_SIGNED,O as KHR_DF_TRANSFER_ACESCC,T as KHR_DF_TRANSFER_ACESCCT,V as KHR_DF_TRANSFER_ADOBERGB,w as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,B as KHR_DF_TRANSFER_HLG_EOTF,D as KHR_DF_TRANSFER_HLG_OETF,u as KHR_DF_TRANSFER_ITU,y as KHR_DF_TRANSFER_LINEAR,b as KHR_DF_TRANSFER_NTSC,S as KHR_DF_TRANSFER_PAL625_EOTF,v as KHR_DF_TRANSFER_PAL_OETF,L as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,d as KHR_DF_TRANSFER_SLOG,m as KHR_DF_TRANSFER_SLOG2,x as KHR_DF_TRANSFER_SRGB,I as KHR_DF_TRANSFER_ST240,g as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Si as KTX2Container,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,qt as VK_FORMAT_A2B10G10R10_SINT_PACK32,Rt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,Yt as VK_FORMAT_A2B10G10R10_UINT_PACK32,jt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_SINT_PACK32,Ht as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Kt as VK_FORMAT_A2R10G10B10_UINT_PACK32,Nt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,vi as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Bi as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Xn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Kn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,mi as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,zn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Cn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,wi as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Wn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Mn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,Nn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,Li as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,jn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,qn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,_i as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,wn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,mn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,pi as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Bn as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,Dn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,Ln as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,yi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,vn as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,In as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,Sn as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,ui as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,Tn as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,On as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,En as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,Vn as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Pn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,Me as VK_FORMAT_B10G11R11_UFLOAT_PACK32,$n as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,si as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,at as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ft as VK_FORMAT_B5G5R5A1_UNORM_PACK16,ot as VK_FORMAT_B5G6R5_UNORM_PACK16,Mt as VK_FORMAT_B8G8R8A8_SINT,Ct as VK_FORMAT_B8G8R8A8_SNORM,Wt as VK_FORMAT_B8G8R8A8_SRGB,zt as VK_FORMAT_B8G8R8A8_UINT,Pt as VK_FORMAT_B8G8R8A8_UNORM,St as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,It as VK_FORMAT_B8G8R8_SRGB,vt as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Qe as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Je as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Ge as VK_FORMAT_BC1_RGB_SRGB_BLOCK,qe as VK_FORMAT_BC1_RGB_UNORM_BLOCK,$e as VK_FORMAT_BC2_SRGB_BLOCK,Ze as VK_FORMAT_BC2_UNORM_BLOCK,en as VK_FORMAT_BC3_SRGB_BLOCK,tn as VK_FORMAT_BC3_UNORM_BLOCK,sn as VK_FORMAT_BC4_SNORM_BLOCK,nn as VK_FORMAT_BC4_UNORM_BLOCK,rn as VK_FORMAT_BC5_SNORM_BLOCK,an as VK_FORMAT_BC5_UNORM_BLOCK,ln as VK_FORMAT_BC6H_SFLOAT_BLOCK,on as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,fn as VK_FORMAT_BC7_UNORM_BLOCK,Ne as VK_FORMAT_D16_UNORM,je as VK_FORMAT_D16_UNORM_S8_UINT,Re as VK_FORMAT_D24_UNORM_S8_UINT,Ke as VK_FORMAT_D32_SFLOAT,Ye as VK_FORMAT_D32_SFLOAT_S8_UINT,We as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,dn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,bn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,un as VK_FORMAT_EAC_R11_SNORM_BLOCK,xn as VK_FORMAT_EAC_R11_UNORM_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,yn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,hn as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,cn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,Zn as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,ii as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,fi as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ai as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,ci as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,hi as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Qn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Jn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Gn as VK_FORMAT_R10X6_UNORM_PACK16,ni as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ei as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ti as VK_FORMAT_R12X4_UNORM_PACK16,pe as VK_FORMAT_R16G16B16A16_SFLOAT,_e as VK_FORMAT_R16G16B16A16_SINT,ce as VK_FORMAT_R16G16B16A16_SNORM,he as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,fe as VK_FORMAT_R16G16B16_SFLOAT,le as VK_FORMAT_R16G16B16_SINT,re as VK_FORMAT_R16G16B16_SNORM,oe as VK_FORMAT_R16G16B16_UINT,ae as VK_FORMAT_R16G16B16_UNORM,se as VK_FORMAT_R16G16_SFLOAT,ie as VK_FORMAT_R16G16_SINT,ee as VK_FORMAT_R16G16_SNORM,ne as VK_FORMAT_R16G16_UINT,te as VK_FORMAT_R16G16_UNORM,$t as VK_FORMAT_R16_SFLOAT,Zt as VK_FORMAT_R16_SINT,Jt as VK_FORMAT_R16_SNORM,Qt as VK_FORMAT_R16_UINT,Gt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,Le as VK_FORMAT_R32G32B32A32_SINT,Be as VK_FORMAT_R32G32B32A32_UINT,De as VK_FORMAT_R32G32B32_SFLOAT,we as VK_FORMAT_R32G32B32_SINT,me as VK_FORMAT_R32G32B32_UINT,de as VK_FORMAT_R32G32_SFLOAT,be as VK_FORMAT_R32G32_SINT,ue as VK_FORMAT_R32G32_UINT,xe as VK_FORMAT_R32_SFLOAT,ye as VK_FORMAT_R32_SINT,ge as VK_FORMAT_R32_UINT,st as VK_FORMAT_R4G4B4A4_UNORM_PACK16,it as VK_FORMAT_R4G4_UNORM_PACK8,lt as VK_FORMAT_R5G5B5A1_UNORM_PACK16,rt as VK_FORMAT_R5G6B5_UNORM_PACK16,ze as VK_FORMAT_R64G64B64A64_SFLOAT,Ce as VK_FORMAT_R64G64B64A64_SINT,Pe as VK_FORMAT_R64G64B64A64_UINT,Fe as VK_FORMAT_R64G64B64_SFLOAT,Ee as VK_FORMAT_R64G64B64_SINT,Ve as VK_FORMAT_R64G64B64_UINT,Te as VK_FORMAT_R64G64_SFLOAT,Oe as VK_FORMAT_R64G64_SINT,Ie as VK_FORMAT_R64G64_UINT,Se as VK_FORMAT_R64_SFLOAT,ve as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,Et as VK_FORMAT_R8G8B8A8_SINT,Tt as VK_FORMAT_R8G8B8A8_SNORM,Ft as VK_FORMAT_R8G8B8A8_SRGB,Vt as VK_FORMAT_R8G8B8A8_UINT,Ot as VK_FORMAT_R8G8B8A8_UNORM,Bt as VK_FORMAT_R8G8B8_SINT,wt as VK_FORMAT_R8G8B8_SNORM,Lt as VK_FORMAT_R8G8B8_SRGB,Dt as VK_FORMAT_R8G8B8_UINT,mt as VK_FORMAT_R8G8B8_UNORM,bt as VK_FORMAT_R8G8_SINT,xt as VK_FORMAT_R8G8_SNORM,dt as VK_FORMAT_R8G8_SRGB,ut as VK_FORMAT_R8G8_UINT,yt as VK_FORMAT_R8G8_UNORM,pt as VK_FORMAT_R8_SINT,ht as VK_FORMAT_R8_SNORM,gt as VK_FORMAT_R8_SRGB,_t as VK_FORMAT_R8_UINT,ct as VK_FORMAT_R8_UNORM,Xe as VK_FORMAT_S8_UINT,nt as VK_FORMAT_UNDEFINED,He as VK_FORMAT_X8_D24_UNORM_PACK32,Pi as read,Mi as write};\n","let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigCACACaiAAQQZ2IgFBAnRBsB5qKAIAaiAAQSBxIgBFaiABRSAAQQV2cWoFQbh/CwsdACAAKAKQ4gEQWiAAQQA2AqDiASAAQgA3A5DiAQu1AwEFfyMAQZACayIKJABBuH8hBgJAIAVFDQAgBCwAACIIQf8BcSEHAkAgCEF/TARAIAdBgn9qQQF2IgggBU8NAkFsIQYgB0GBf2oiBUGAAk8NAiAEQQFqIQdBACEGA0AgBiAFTwRAIAUhBiAIIQcMAwUgACAGaiAHIAZBAXZqIgQtAABBBHY6AAAgACAGQQFyaiAELQAAQQ9xOgAAIAZBAmohBgwBCwAACwALIAcgBU8NASAAIARBAWogByAKEFMiBhADDQELIAYhBEEAIQYgAUEAQTQQECEJQQAhBQNAIAQgBkcEQCAAIAZqIggtAAAiAUELSwRAQWwhBgwDBSAJIAFBAnRqIgEgASgCAEEBajYCACAGQQFqIQZBASAILQAAdEEBdSAFaiEFDAILAAsLQWwhBiAFRQ0AIAUQFEEBaiIBQQxLDQAgAyABNgIAQQFBASABdCAFayIDEBQiAXQgA0cNACAAIARqIAFBAWoiADoAACAJIABBAnRqIgAgACgCAEEBajYCACAJKAIEIgBBAkkgAEEBcXINACACIARBAWo2AgAgB0EBaiEGCyAKQZACaiQAIAYLxhEBDH8jAEHwAGsiBSQAQWwhCwJAIANBCkkNACACLwAAIQogAi8AAiEJIAIvAAQhByAFQQhqIAQQDgJAIAMgByAJIApqakEGaiIMSQ0AIAUtAAohCCAFQdgAaiACQQZqIgIgChAGIgsQAw0BIAVBQGsgAiAKaiICIAkQBiILEAMNASAFQShqIAIgCWoiAiAHEAYiCxADDQEgBUEQaiACIAdqIAMgDGsQBiILEAMNASAAIAFqIg9BfWohECAEQQRqIQZBASELIAAgAUEDakECdiIDaiIMIANqIgIgA2oiDiEDIAIhBCAMIQcDQCALIAMgEElxBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgCS0AAyELIAcgBiAFQUBrIAgQAkECdGoiCS8BADsAACAFQUBrIAktAAIQASAJLQADIQogBCAGIAVBKGogCBACQQJ0aiIJLwEAOwAAIAVBKGogCS0AAhABIAktAAMhCSADIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgDS0AAyENIAAgC2oiCyAGIAVB2ABqIAgQAkECdGoiAC8BADsAACAFQdgAaiAALQACEAEgAC0AAyEAIAcgCmoiCiAGIAVBQGsgCBACQQJ0aiIHLwEAOwAAIAVBQGsgBy0AAhABIActAAMhByAEIAlqIgkgBiAFQShqIAgQAkECdGoiBC8BADsAACAFQShqIAQtAAIQASAELQADIQQgAyANaiIDIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgACALaiEAIAcgCmohByAEIAlqIQQgAyANLQADaiEDIAVB2ABqEA0gBUFAaxANciAFQShqEA1yIAVBEGoQDXJFIQsMAQsLIAQgDksgByACS3INAEFsIQsgACAMSw0BIAxBfWohCQNAQQAgACAJSSAFQdgAahAEGwRAIAAgBiAFQdgAaiAIEAJBAnRqIgovAQA7AAAgBUHYAGogCi0AAhABIAAgCi0AA2oiACAGIAVB2ABqIAgQAkECdGoiCi8BADsAACAFQdgAaiAKLQACEAEgACAKLQADaiEADAEFIAxBfmohCgNAIAVB2ABqEAQgACAKS3JFBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgACAJLQADaiEADAELCwNAIAAgCk0EQCAAIAYgBUHYAGogCBACQQJ0aiIJLwEAOwAAIAVB2ABqIAktAAIQASAAIAktAANqIQAMAQsLAkAgACAMTw0AIAAgBiAFQdgAaiAIEAIiAEECdGoiDC0AADoAACAMLQADQQFGBEAgBUHYAGogDC0AAhABDAELIAUoAlxBH0sNACAFQdgAaiAGIABBAnRqLQACEAEgBSgCXEEhSQ0AIAVBIDYCXAsgAkF9aiEMA0BBACAHIAxJIAVBQGsQBBsEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiIAIAYgBUFAayAIEAJBAnRqIgcvAQA7AAAgBUFAayAHLQACEAEgACAHLQADaiEHDAEFIAJBfmohDANAIAVBQGsQBCAHIAxLckUEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwNAIAcgDE0EQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwJAIAcgAk8NACAHIAYgBUFAayAIEAIiAEECdGoiAi0AADoAACACLQADQQFGBEAgBUFAayACLQACEAEMAQsgBSgCREEfSw0AIAVBQGsgBiAAQQJ0ai0AAhABIAUoAkRBIUkNACAFQSA2AkQLIA5BfWohAgNAQQAgBCACSSAFQShqEAQbBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2oiACAGIAVBKGogCBACQQJ0aiIELwEAOwAAIAVBKGogBC0AAhABIAAgBC0AA2ohBAwBBSAOQX5qIQIDQCAFQShqEAQgBCACS3JFBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsDQCAEIAJNBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsCQCAEIA5PDQAgBCAGIAVBKGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBKGogAi0AAhABDAELIAUoAixBH0sNACAFQShqIAYgAEECdGotAAIQASAFKAIsQSFJDQAgBUEgNgIsCwNAQQAgAyAQSSAFQRBqEAQbBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2oiACAGIAVBEGogCBACQQJ0aiICLwEAOwAAIAVBEGogAi0AAhABIAAgAi0AA2ohAwwBBSAPQX5qIQIDQCAFQRBqEAQgAyACS3JFBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsDQCADIAJNBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsCQCADIA9PDQAgAyAGIAVBEGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBEGogAi0AAhABDAELIAUoAhRBH0sNACAFQRBqIAYgAEECdGotAAIQASAFKAIUQSFJDQAgBUEgNgIUCyABQWwgBUHYAGoQCiAFQUBrEApxIAVBKGoQCnEgBUEQahAKcRshCwwJCwAACwALAAALAAsAAAsACwAACwALQWwhCwsgBUHwAGokACALC7UEAQ5/IwBBEGsiBiQAIAZBBGogABAOQVQhBQJAIARB3AtJDQAgBi0ABCEHIANB8ARqQQBB7AAQECEIIAdBDEsNACADQdwJaiIJIAggBkEIaiAGQQxqIAEgAhAxIhAQA0UEQCAGKAIMIgQgB0sNASADQdwFaiEPIANBpAVqIREgAEEEaiESIANBqAVqIQEgBCEFA0AgBSICQX9qIQUgCCACQQJ0aigCAEUNAAsgAkEBaiEOQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgASALaiAKNgIAIAVBAWohBSAKIAxqIQoMAQsLIAEgCjYCAEEAIQUgBigCCCELA0AgBSALRkUEQCABIAUgCWotAAAiDEECdGoiDSANKAIAIg1BAWo2AgAgDyANQQF0aiINIAw6AAEgDSAFOgAAIAVBAWohBQwBCwtBACEBIANBADYCqAUgBEF/cyAHaiEJQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgAyALaiABNgIAIAwgBSAJanQgAWohASAFQQFqIQUMAQsLIAcgBEEBaiIBIAJrIgRrQQFqIQgDQEEBIQUgBCAIT0UEQANAIAUgDk9FBEAgBUECdCIJIAMgBEE0bGpqIAMgCWooAgAgBHY2AgAgBUEBaiEFDAELCyAEQQFqIQQMAQsLIBIgByAPIAogESADIAIgARBkIAZBAToABSAGIAc6AAYgACAGKAIENgIACyAQIQULIAZBEGokACAFC8ENAQt/IwBB8ABrIgUkAEFsIQkCQCADQQpJDQAgAi8AACEKIAIvAAIhDCACLwAEIQYgBUEIaiAEEA4CQCADIAYgCiAMampBBmoiDUkNACAFLQAKIQcgBUHYAGogAkEGaiICIAoQBiIJEAMNASAFQUBrIAIgCmoiAiAMEAYiCRADDQEgBUEoaiACIAxqIgIgBhAGIgkQAw0BIAVBEGogAiAGaiADIA1rEAYiCRADDQEgACABaiIOQX1qIQ8gBEEEaiEGQQEhCSAAIAFBA2pBAnYiAmoiCiACaiIMIAJqIg0hAyAMIQQgCiECA0AgCSADIA9JcQRAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAACAGIAVBQGsgBxACQQF0aiIILQAAIQsgBUFAayAILQABEAEgAiALOgAAIAYgBUEoaiAHEAJBAXRqIggtAAAhCyAFQShqIAgtAAEQASAEIAs6AAAgBiAFQRBqIAcQAkEBdGoiCC0AACELIAVBEGogCC0AARABIAMgCzoAACAGIAVB2ABqIAcQAkEBdGoiCC0AACELIAVB2ABqIAgtAAEQASAAIAs6AAEgBiAFQUBrIAcQAkEBdGoiCC0AACELIAVBQGsgCC0AARABIAIgCzoAASAGIAVBKGogBxACQQF0aiIILQAAIQsgBUEoaiAILQABEAEgBCALOgABIAYgBUEQaiAHEAJBAXRqIggtAAAhCyAFQRBqIAgtAAEQASADIAs6AAEgA0ECaiEDIARBAmohBCACQQJqIQIgAEECaiEAIAkgBUHYAGoQDUVxIAVBQGsQDUVxIAVBKGoQDUVxIAVBEGoQDUVxIQkMAQsLIAQgDUsgAiAMS3INAEFsIQkgACAKSw0BIApBfWohCQNAIAVB2ABqEAQgACAJT3JFBEAgBiAFQdgAaiAHEAJBAXRqIggtAAAhCyAFQdgAaiAILQABEAEgACALOgAAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAASAAQQJqIQAMAQsLA0AgBUHYAGoQBCAAIApPckUEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCwNAIAAgCkkEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCyAMQX1qIQADQCAFQUBrEAQgAiAAT3JFBEAgBiAFQUBrIAcQAkEBdGoiCi0AACEJIAVBQGsgCi0AARABIAIgCToAACAGIAVBQGsgBxACQQF0aiIKLQAAIQkgBUFAayAKLQABEAEgAiAJOgABIAJBAmohAgwBCwsDQCAFQUBrEAQgAiAMT3JFBEAgBiAFQUBrIAcQAkEBdGoiAC0AACEKIAVBQGsgAC0AARABIAIgCjoAACACQQFqIQIMAQsLA0AgAiAMSQRAIAYgBUFAayAHEAJBAXRqIgAtAAAhCiAFQUBrIAAtAAEQASACIAo6AAAgAkEBaiECDAELCyANQX1qIQADQCAFQShqEAQgBCAAT3JFBEAgBiAFQShqIAcQAkEBdGoiAi0AACEKIAVBKGogAi0AARABIAQgCjoAACAGIAVBKGogBxACQQF0aiICLQAAIQogBUEoaiACLQABEAEgBCAKOgABIARBAmohBAwBCwsDQCAFQShqEAQgBCANT3JFBEAgBiAFQShqIAcQAkEBdGoiAC0AACECIAVBKGogAC0AARABIAQgAjoAACAEQQFqIQQMAQsLA0AgBCANSQRAIAYgBUEoaiAHEAJBAXRqIgAtAAAhAiAFQShqIAAtAAEQASAEIAI6AAAgBEEBaiEEDAELCwNAIAVBEGoQBCADIA9PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIAYgBUEQaiAHEAJBAXRqIgAtAAAhAiAFQRBqIAAtAAEQASADIAI6AAEgA0ECaiEDDAELCwNAIAVBEGoQBCADIA5PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIANBAWohAwwBCwsDQCADIA5JBEAgBiAFQRBqIAcQAkEBdGoiAC0AACECIAVBEGogAC0AARABIAMgAjoAACADQQFqIQMMAQsLIAFBbCAFQdgAahAKIAVBQGsQCnEgBUEoahAKcSAFQRBqEApxGyEJDAELQWwhCQsgBUHwAGokACAJC8oCAQR/IwBBIGsiBSQAIAUgBBAOIAUtAAIhByAFQQhqIAIgAxAGIgIQA0UEQCAEQQRqIQIgACABaiIDQX1qIQQDQCAFQQhqEAQgACAET3JFBEAgAiAFQQhqIAcQAkEBdGoiBi0AACEIIAVBCGogBi0AARABIAAgCDoAACACIAVBCGogBxACQQF0aiIGLQAAIQggBUEIaiAGLQABEAEgACAIOgABIABBAmohAAwBCwsDQCAFQQhqEAQgACADT3JFBEAgAiAFQQhqIAcQAkEBdGoiBC0AACEGIAVBCGogBC0AARABIAAgBjoAACAAQQFqIQAMAQsLA0AgACADT0UEQCACIAVBCGogBxACQQF0aiIELQAAIQYgBUEIaiAELQABEAEgACAGOgAAIABBAWohAAwBCwsgAUFsIAVBCGoQChshAgsgBUEgaiQAIAILtgMBCX8jAEEQayIGJAAgBkEANgIMIAZBADYCCEFUIQQCQAJAIANBQGsiDCADIAZBCGogBkEMaiABIAIQMSICEAMNACAGQQRqIAAQDiAGKAIMIgcgBi0ABEEBaksNASAAQQRqIQogBkEAOgAFIAYgBzoABiAAIAYoAgQ2AgAgB0EBaiEJQQEhBANAIAQgCUkEQCADIARBAnRqIgEoAgAhACABIAU2AgAgACAEQX9qdCAFaiEFIARBAWohBAwBCwsgB0EBaiEHQQAhBSAGKAIIIQkDQCAFIAlGDQEgAyAFIAxqLQAAIgRBAnRqIgBBASAEdEEBdSILIAAoAgAiAWoiADYCACAHIARrIQhBACEEAkAgC0EDTQRAA0AgBCALRg0CIAogASAEakEBdGoiACAIOgABIAAgBToAACAEQQFqIQQMAAALAAsDQCABIABPDQEgCiABQQF0aiIEIAg6AAEgBCAFOgAAIAQgCDoAAyAEIAU6AAIgBCAIOgAFIAQgBToABCAEIAg6AAcgBCAFOgAGIAFBBGohAQwAAAsACyAFQQFqIQUMAAALAAsgAiEECyAGQRBqJAAgBAutAQECfwJAQYQgKAIAIABHIAAoAgBBAXYiAyABa0F4aiICQXhxQQhHcgR/IAIFIAMQJ0UNASACQQhqC0EQSQ0AIAAgACgCACICQQFxIAAgAWpBD2pBeHEiASAAa0EBdHI2AgAgASAANgIEIAEgASgCAEEBcSAAIAJBAXZqIAFrIgJBAXRyNgIAQYQgIAEgAkH/////B3FqQQRqQYQgKAIAIABGGyABNgIAIAEQJQsLygIBBX8CQAJAAkAgAEEIIABBCEsbZ0EfcyAAaUEBR2oiAUEESSAAIAF2cg0AIAFBAnRB/B5qKAIAIgJFDQADQCACQXhqIgMoAgBBAXZBeGoiBSAATwRAIAIgBUEIIAVBCEsbZ0Efc0ECdEGAH2oiASgCAEYEQCABIAIoAgQ2AgALDAMLIARBHksNASAEQQFqIQQgAigCBCICDQALC0EAIQMgAUEgTw0BA0AgAUECdEGAH2ooAgAiAkUEQCABQR5LIQIgAUEBaiEBIAJFDQEMAwsLIAIgAkF4aiIDKAIAQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgBGBEAgASACKAIENgIACwsgAigCACIBBEAgASACKAIENgIECyACKAIEIgEEQCABIAIoAgA2AgALIAMgAygCAEEBcjYCACADIAAQNwsgAwvhCwINfwV+IwBB8ABrIgckACAHIAAoAvDhASIINgJcIAEgAmohDSAIIAAoAoDiAWohDwJAAkAgBUUEQCABIQQMAQsgACgCxOABIRAgACgCwOABIREgACgCvOABIQ4gAEEBNgKM4QFBACEIA0AgCEEDRwRAIAcgCEECdCICaiAAIAJqQazQAWooAgA2AkQgCEEBaiEIDAELC0FsIQwgB0EYaiADIAQQBhADDQEgB0EsaiAHQRhqIAAoAgAQEyAHQTRqIAdBGGogACgCCBATIAdBPGogB0EYaiAAKAIEEBMgDUFgaiESIAEhBEEAIQwDQCAHKAIwIAcoAixBA3RqKQIAIhRCEIinQf8BcSEIIAcoAkAgBygCPEEDdGopAgAiFUIQiKdB/wFxIQsgBygCOCAHKAI0QQN0aikCACIWQiCIpyEJIBVCIIghFyAUQiCIpyECAkAgFkIQiKdB/wFxIgNBAk8EQAJAIAZFIANBGUlyRQRAIAkgB0EYaiADQSAgBygCHGsiCiAKIANLGyIKEAUgAyAKayIDdGohCSAHQRhqEAQaIANFDQEgB0EYaiADEAUgCWohCQwBCyAHQRhqIAMQBSAJaiEJIAdBGGoQBBoLIAcpAkQhGCAHIAk2AkQgByAYNwNIDAELAkAgA0UEQCACBEAgBygCRCEJDAMLIAcoAkghCQwBCwJAAkAgB0EYakEBEAUgCSACRWpqIgNBA0YEQCAHKAJEQX9qIgMgA0VqIQkMAQsgA0ECdCAHaigCRCIJIAlFaiEJIANBAUYNAQsgByAHKAJINgJMCwsgByAHKAJENgJIIAcgCTYCRAsgF6chAyALBEAgB0EYaiALEAUgA2ohAwsgCCALakEUTwRAIAdBGGoQBBoLIAgEQCAHQRhqIAgQBSACaiECCyAHQRhqEAQaIAcgB0EYaiAUQhiIp0H/AXEQCCAUp0H//wNxajYCLCAHIAdBGGogFUIYiKdB/wFxEAggFadB//8DcWo2AjwgB0EYahAEGiAHIAdBGGogFkIYiKdB/wFxEAggFqdB//8DcWo2AjQgByACNgJgIAcoAlwhCiAHIAk2AmggByADNgJkAkACQAJAIAQgAiADaiILaiASSw0AIAIgCmoiEyAPSw0AIA0gBGsgC0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n","/**\n * Loader for KTX 2.0 GPU Texture containers.\n *\n * KTX 2.0 is a container format for various GPU texture formats. The loader\n * supports Basis Universal GPU textures, which can be quickly transcoded to\n * a wide variety of GPU texture compression formats, as well as some\n * uncompressed DataTexture and Data3DTexture formats.\n *\n * References:\n * - KTX: http://github.khronos.org/KTX-Specification/\n * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor\n */\n\nimport {\n\tCompressedTexture,\n\tCompressedArrayTexture,\n\tCompressedCubeTexture,\n\tData3DTexture,\n\tDataTexture,\n\tDisplayP3ColorSpace,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearDisplayP3ColorSpace,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tRedFormat,\n\tRGB_ETC1_Format,\n\tRGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format,\n\tRGB_S3TC_DXT1_Format,\n\tRGBA_ASTC_4x4_Format,\n\tRGBA_ASTC_6x6_Format,\n\tRGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGBAFormat,\n\tRGFormat,\n\tSRGBColorSpace,\n\tUnsignedByteType,\n} from 'three';\nimport { WorkerPool } from '../utils/WorkerPool.js';\nimport {\n\tread,\n\tKHR_DF_FLAG_ALPHA_PREMULTIPLIED,\n\tKHR_DF_TRANSFER_SRGB,\n\tKHR_SUPERCOMPRESSION_NONE,\n\tKHR_SUPERCOMPRESSION_ZSTD,\n\tVK_FORMAT_UNDEFINED,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n\tVK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_DISPLAYP3\n} from '../libs/ktx-parse.module.js';\nimport { ZSTDDecoder } from '../libs/zstddec.module.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _zstd;\n\nclass KTX2Loader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\n\t\tif ( typeof MSC_TRANSCODER !== 'undefined' ) {\n\n\t\t\tconsole.warn(\n\n\t\t\t\t'THREE.KTX2Loader: Please update to latest \"basis_transcoder\".'\n\t\t\t\t+ ' \"msc_basis_transcoder\" is no longer supported in three.js r125+.'\n\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tsetTranscoderPath( path ) {\n\n\t\tthis.transcoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( num ) {\n\n\t\tthis.workerPool.setWorkerLimit( num );\n\n\t\treturn this;\n\n\t}\n\n\tasync detectSupportAsync( renderer ) {\n\n\t\tthis.workerConfig = {\n\t\t\tastcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ),\n\t\t\tetc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ),\n\t\t\tetc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ),\n\t\t\tdxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ),\n\t\t\tbptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ),\n\t\t\tpvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' )\n\t\t};\n\n\t\treturn this;\n\n\t}\n\n\tdetectSupport( renderer ) {\n\n\t\tif ( renderer.isWebGPURenderer === true ) {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.hasFeature( 'texture-compression-astc' ),\n\t\t\t\tetc1Supported: renderer.hasFeature( 'texture-compression-etc1' ),\n\t\t\t\tetc2Supported: renderer.hasFeature( 'texture-compression-etc2' ),\n\t\t\t\tdxtSupported: renderer.hasFeature( 'texture-compression-bc' ),\n\t\t\t\tbptcSupported: renderer.hasFeature( 'texture-compression-bptc' ),\n\t\t\t\tpvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ),\n\t\t\t\tetc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ),\n\t\t\t\tetc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ),\n\t\t\t\tdxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ),\n\t\t\t\tbptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ),\n\t\t\t\tpvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' )\n\t\t\t\t\t|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )\n\t\t\t};\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/22928\n\t\t\tthis.workerConfig.etc1Supported = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinit() {\n\n\t\tif ( ! this.transcoderPending ) {\n\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.transcoderPath );\n\t\t\tjsLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst jsContent = jsLoader.loadAsync( 'basis_transcoder.js' );\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.transcoderPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tbinaryLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' );\n\n\t\t\tthis.transcoderPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker;\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator( () => {\n\n\t\t\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice( 0 );\n\n\t\t\t\t\t\tworker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] );\n\n\t\t\t\t\t\treturn worker;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\tif ( _activeLoaders > 0 ) {\n\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\n\t\t\t\tconsole.warn(\n\n\t\t\t\t\t'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t_activeLoaders ++;\n\n\t\t}\n\n\t\treturn this.transcoderPending;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t\t// again from this thread.\n\t\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t\t}\n\n\t\t\tthis.createTexture( buffer )\n\t\t\t\t.then( ( texture ) => onLoad ? onLoad( texture ) : null )\n\t\t\t\t.catch( onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t_createTextureFrom( transcodeResult, container ) {\n\n\t\tconst { faces, width, height, format, type, error, dfdFlags } = transcodeResult;\n\n\t\tif ( type === 'error' ) return Promise.reject( error );\n\n\t\tlet texture;\n\n\t\tif ( container.faceCount === 6 ) {\n\n\t\t\ttexture = new CompressedCubeTexture( faces, format, UnsignedByteType );\n\n\t\t} else {\n\n\t\t\tconst mipmaps = faces[ 0 ].mipmaps;\n\n\t\t\ttexture = container.layerCount > 1\n\t\t\t\t? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, UnsignedByteType )\n\t\t\t\t: new CompressedTexture( mipmaps, width, height, format, UnsignedByteType );\n\n\t\t}\n\n\t\ttexture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.needsUpdate = true;\n\t\ttexture.colorSpace = parseColorSpace( container );\n\t\ttexture.premultiplyAlpha = !! ( dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED );\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * @param {ArrayBuffer} buffer\n\t * @param {object?} config\n\t * @return {Promise<CompressedTexture|CompressedArrayTexture|DataTexture|Data3DTexture>}\n\t */\n\tasync createTexture( buffer, config = {} ) {\n\n\t\tconst container = read( new Uint8Array( buffer ) );\n\n\t\tif ( container.vkFormat !== VK_FORMAT_UNDEFINED ) {\n\n\t\t\treturn createRawTexture( container );\n\n\t\t}\n\n\t\t//\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then( () => {\n\n\t\t\treturn this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] );\n\n\t\t} ).then( ( e ) => this._createTextureFrom( e.data, container ) );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, { promise: texturePending } );\n\n\t\treturn texturePending;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workerPool.dispose();\n\t\tif ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL );\n\n\t\t_activeLoaders --;\n\n\t\treturn this;\n\n\t}\n\n}\n\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC_4x4: 1,\n};\n\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: RGBAFormat,\n\tRGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format,\n\tRGBA_BPTC_Format: RGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format: RGB_ETC1_Format,\n\tRGB_ETC2_Format: RGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format,\n\tRGB_S3TC_DXT1_Format: RGB_S3TC_DXT1_Format,\n};\n\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = `function () {\n\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\n\tself.addEventListener( 'message', function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit( message.transcoderBinary );\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, dfdFlags } = transcode( message.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'transcode', id: message.id, faces, width, height, hasAlpha, format, dfdFlags }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} );\n\n\tfunction init( wasmBinary ) {\n\n\t\ttranscoderPending = new Promise( ( resolve ) => {\n\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS( BasisModule ); // eslint-disable-line no-undef\n\n\t\t} ).then( () => {\n\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif ( BasisModule.KTX2File === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction transcode( buffer ) {\n\n\t\tconst ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) );\n\n\t\tfunction cleanup() {\n\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\n\t\t}\n\n\t\tif ( ! ktx2File.isValid() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file' );\n\n\t\t}\n\n\t\tconst basisFormat = ktx2File.isUASTC() ? BasisFormat.UASTC_4x4 : BasisFormat.ETC1S;\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat } = getTranscoderFormat( basisFormat, width, height, hasAlpha );\n\n\t\tif ( ! width || ! height || ! levelCount ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid texture' );\n\n\t\t}\n\n\t\tif ( ! ktx2File.startTranscoding() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader: .startTranscoding failed' );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\tconst mipmaps = [];\n\n\t\t\tfor ( let mip = 0; mip < levelCount; mip ++ ) {\n\n\t\t\t\tconst layerMips = [];\n\n\t\t\t\tlet mipWidth, mipHeight;\n\n\t\t\t\tfor ( let layer = 0; layer < layerCount; layer ++ ) {\n\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );\n\n\t\t\t\t\tif ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( levelCount > 1 ) {\n\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with\n\t\t\t\t\t\t// mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.\n\t\t\t\t\t\t// See mrdoob/three.js#25908.\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );\n\t\t\t\t\tconst status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );\n\n\t\t\t\t\tif ( ! status ) {\n\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push( dst );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat( layerMips );\n\n\t\t\t\tmipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );\n\t\t\t\tbuffers.push( mipData.buffer );\n\n\t\t\t}\n\n\t\t\tfaces.push( { mipmaps, width, height, format: engineFormat } );\n\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, format: engineFormat, dfdFlags };\n\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S or UASTC),\n\t// device capabilities, and texture dimensions. The list below ranks the formats separately\n\t// for ETC1S and UASTC.\n\t//\n\t// In some cases, transcoding UASTC to RGBA32 might be preferred for higher quality (at\n\t// significant memory cost) compared to ETC1/2, BC1/3, and PVRTC. The transcoder currently\n\t// chooses RGBA32 only as a last resort and does not expose that option to the caller.\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC1_Format ],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC_4x4 ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ],\n\t\t\tengineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true,\n\t\t},\n\t];\n\n\tconst ETC1S_OPTIONS = FORMAT_OPTIONS.sort( function ( a, b ) {\n\n\t\treturn a.priorityETC1S - b.priorityETC1S;\n\n\t} );\n\tconst UASTC_OPTIONS = FORMAT_OPTIONS.sort( function ( a, b ) {\n\n\t\treturn a.priorityUASTC - b.priorityUASTC;\n\n\t} );\n\n\tfunction getTranscoderFormat( basisFormat, width, height, hasAlpha ) {\n\n\t\tlet transcoderFormat;\n\t\tlet engineFormat;\n\n\t\tconst options = basisFormat === BasisFormat.ETC1S ? ETC1S_OPTIONS : UASTC_OPTIONS;\n\n\t\tfor ( let i = 0; i < options.length; i ++ ) {\n\n\t\t\tconst opt = options[ i ];\n\n\t\t\tif ( ! config[ opt.if ] ) continue;\n\t\t\tif ( ! opt.basisFormat.includes( basisFormat ) ) continue;\n\t\t\tif ( hasAlpha && opt.transcoderFormat.length < 2 ) continue;\n\t\t\tif ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue;\n\n\t\t\ttranscoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tengineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ];\n\n\t\t\treturn { transcoderFormat, engineFormat };\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.KTX2Loader: No suitable compressed texture format found. Decoding to RGBA32.' );\n\n\t\ttranscoderFormat = TranscoderFormat.RGBA32;\n\t\tengineFormat = EngineFormat.RGBAFormat;\n\n\t\treturn { transcoderFormat, engineFormat };\n\n\t}\n\n\tfunction isPowerOfTwo( value ) {\n\n\t\tif ( value <= 2 ) return true;\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t}\n\n\t/** Concatenates N byte arrays. */\n\tfunction concat( arrays ) {\n\n\t\tif ( arrays.length === 1 ) return arrays[ 0 ];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\ttotalByteLength += array.byteLength;\n\n\t\t}\n\n\t\tconst result = new Uint8Array( totalByteLength );\n\n\t\tlet byteOffset = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\tresult.set( array, byteOffset );\n\n\t\t\tbyteOffset += array.byteLength;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}`;\n\n//\n// Parsing for non-Basis textures. These textures are may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] );\n\nconst FORMAT_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R8G8_UNORM ]: RGFormat,\n\t[ VK_FORMAT_R8G8_SRGB ]: RGFormat,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R16_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R8_SRGB ]: RedFormat,\n\t[ VK_FORMAT_R8_UNORM ]: RedFormat,\n\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,\n\n};\n\nconst TYPE_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,\n\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,\n\n};\n\nasync function createRawTexture( container ) {\n\n\tconst { vkFormat } = container;\n\n\tif ( FORMAT_MAP[ vkFormat ] === undefined ) {\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' );\n\n\t}\n\n\t//\n\n\tlet zstd;\n\n\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\tif ( ! _zstd ) {\n\n\t\t\t_zstd = new Promise( async ( resolve ) => {\n\n\t\t\t\tconst zstd = new ZSTDDecoder();\n\t\t\t\tawait zstd.init();\n\t\t\t\tresolve( zstd );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tzstd = await _zstd;\n\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\n\tfor ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {\n\n\t\tconst levelWidth = Math.max( 1, container.pixelWidth >> levelIndex );\n\t\tconst levelHeight = Math.max( 1, container.pixelHeight >> levelIndex );\n\t\tconst levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0;\n\n\t\tconst level = container.levels[ levelIndex ];\n\n\t\tlet levelData;\n\n\t\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE ) {\n\n\t\t\tlevelData = level.levelData;\n\n\t\t} else if ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\t\tlevelData = zstd.decode( level.levelData, level.uncompressedByteLength );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' );\n\n\t\t}\n\n\t\tlet data;\n\n\t\tif ( TYPE_MAP[ vkFormat ] === FloatType ) {\n\n\t\t\tdata = new Float32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) {\n\n\t\t\tdata = new Uint16Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tdata = levelData;\n\n\t\t}\n\n\t\tmipmaps.push( {\n\n\t\t\tdata: data,\n\t\t\twidth: levelWidth,\n\t\t\theight: levelHeight,\n\t\t\tdepth: levelDepth,\n\n\t\t} );\n\n\t}\n\n\tlet texture;\n\n\tif ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) {\n\n\t\ttexture = container.pixelDepth === 0\n\t\t\t? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight )\n\t\t\t: new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth );\n\n\t} else {\n\n\t\tif ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' );\n\n\t\ttexture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight );\n\n\t}\n\n\ttexture.mipmaps = mipmaps;\n\n\ttexture.type = TYPE_MAP[ vkFormat ];\n\ttexture.format = FORMAT_MAP[ vkFormat ];\n\ttexture.colorSpace = parseColorSpace( container );\n\ttexture.needsUpdate = true;\n\n\t//\n\n\treturn Promise.resolve( texture );\n\n}\n\nfunction parseColorSpace( container ) {\n\n\tconst dfd = container.dataFormatDescriptor[ 0 ];\n\n\tif ( dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED ) {\n\n\t\treturn NoColorSpace;\n\n\t} else {\n\n\t\tconsole.warn( `THREE.KTX2Loader: Unsupported color primaries, \"${ dfd.colorPrimaries }\"` );\n\t\treturn NoColorSpace;\n\n\t}\n\n}\n\nexport { KTX2Loader };\n","import {\n\tCompressedTextureLoader\n} from 'three';\n\n/**\n * for description see https://www.khronos.org/opengles/sdk/tools/KTX/\n * for file layout see https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/\n *\n * ported from https://github.com/BabylonJS/Babylon.js/blob/master/src/Misc/khronosTextureContainer.ts\n */\n\n\nclass KTXLoader extends CompressedTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tparse( buffer, loadMipmaps ) {\n\n\t\tconst ktx = new KhronosTextureContainer( buffer, 1 );\n\n\t\treturn {\n\t\t\tmipmaps: ktx.mipmaps( loadMipmaps ),\n\t\t\twidth: ktx.pixelWidth,\n\t\t\theight: ktx.pixelHeight,\n\t\t\tformat: ktx.glInternalFormat,\n\t\t\tisCubemap: ktx.numberOfFaces === 6,\n\t\t\tmipmapCount: ktx.numberOfMipmapLevels\n\t\t};\n\n\t}\n\n}\n\n\nconst HEADER_LEN = 12 + ( 13 * 4 ); // identifier + header elements (not including key value meta-data pairs)\n// load types\nconst COMPRESSED_2D = 0; // uses a gl.compressedTexImage2D()\n//const COMPRESSED_3D = 1; // uses a gl.compressedTexImage3D()\n//const TEX_2D = 2; // uses a gl.texImage2D()\n//const TEX_3D = 3; // uses a gl.texImage3D()\n\nclass KhronosTextureContainer {\n\n\t/**\n\t * @param {ArrayBuffer} arrayBuffer- contents of the KTX container file\n\t * @param {number} facesExpected- should be either 1 or 6, based whether a cube texture or or\n\t * @param {boolean} threeDExpected- provision for indicating that data should be a 3D texture, not implemented\n\t * @param {boolean} textureArrayExpected- provision for indicating that data should be a texture array, not implemented\n\t */\n\tconstructor( arrayBuffer, facesExpected /*, threeDExpected, textureArrayExpected */ ) {\n\n\t\tthis.arrayBuffer = arrayBuffer;\n\n\t\t// Test that it is a ktx formatted file, based on the first 12 bytes, character representation is:\n\t\t// '´', 'K', 'T', 'X', ' ', '1', '1', 'ª', '\\r', '\\n', '\\x1A', '\\n'\n\t\t// 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A\n\t\tconst identifier = new Uint8Array( this.arrayBuffer, 0, 12 );\n\t\tif ( identifier[ 0 ] !== 0xAB ||\n\t\t\tidentifier[ 1 ] !== 0x4B ||\n\t\t\tidentifier[ 2 ] !== 0x54 ||\n\t\t\tidentifier[ 3 ] !== 0x58 ||\n\t\t\tidentifier[ 4 ] !== 0x20 ||\n\t\t\tidentifier[ 5 ] !== 0x31 ||\n\t\t\tidentifier[ 6 ] !== 0x31 ||\n\t\t\tidentifier[ 7 ] !== 0xBB ||\n\t\t\tidentifier[ 8 ] !== 0x0D ||\n\t\t\tidentifier[ 9 ] !== 0x0A ||\n\t\t\tidentifier[ 10 ] !== 0x1A ||\n\t\t\tidentifier[ 11 ] !== 0x0A ) {\n\n\t\t\tconsole.error( 'texture missing KTX identifier' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// load the reset of the header in native 32 bit uint\n\t\tconst dataSize = Uint32Array.BYTES_PER_ELEMENT;\n\t\tconst headerDataView = new DataView( this.arrayBuffer, 12, 13 * dataSize );\n\t\tconst endianness = headerDataView.getUint32( 0, true );\n\t\tconst littleEndian = endianness === 0x04030201;\n\n\t\tthis.glType = headerDataView.getUint32( 1 * dataSize, littleEndian ); // must be 0 for compressed textures\n\t\tthis.glTypeSize = headerDataView.getUint32( 2 * dataSize, littleEndian ); // must be 1 for compressed textures\n\t\tthis.glFormat = headerDataView.getUint32( 3 * dataSize, littleEndian ); // must be 0 for compressed textures\n\t\tthis.glInternalFormat = headerDataView.getUint32( 4 * dataSize, littleEndian ); // the value of arg passed to gl.compressedTexImage2D(,,x,,,,)\n\t\tthis.glBaseInternalFormat = headerDataView.getUint32( 5 * dataSize, littleEndian ); // specify GL_RGB, GL_RGBA, GL_ALPHA, etc (un-compressed only)\n\t\tthis.pixelWidth = headerDataView.getUint32( 6 * dataSize, littleEndian ); // level 0 value of arg passed to gl.compressedTexImage2D(,,,x,,,)\n\t\tthis.pixelHeight = headerDataView.getUint32( 7 * dataSize, littleEndian ); // level 0 value of arg passed to gl.compressedTexImage2D(,,,,x,,)\n\t\tthis.pixelDepth = headerDataView.getUint32( 8 * dataSize, littleEndian ); // level 0 value of arg passed to gl.compressedTexImage3D(,,,,,x,,)\n\t\tthis.numberOfArrayElements = headerDataView.getUint32( 9 * dataSize, littleEndian ); // used for texture arrays\n\t\tthis.numberOfFaces = headerDataView.getUint32( 10 * dataSize, littleEndian ); // used for cubemap textures, should either be 1 or 6\n\t\tthis.numberOfMipmapLevels = headerDataView.getUint32( 11 * dataSize, littleEndian ); // number of levels; disregard possibility of 0 for compressed textures\n\t\tthis.bytesOfKeyValueData = headerDataView.getUint32( 12 * dataSize, littleEndian ); // the amount of space after the header for meta-data\n\n\t\t// Make sure we have a compressed type.  Not only reduces work, but probably better to let dev know they are not compressing.\n\t\tif ( this.glType !== 0 ) {\n\n\t\t\tconsole.warn( 'only compressed formats currently supported' );\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// value of zero is an indication to generate mipmaps @ runtime.  Not usually allowed for compressed, so disregard.\n\t\t\tthis.numberOfMipmapLevels = Math.max( 1, this.numberOfMipmapLevels );\n\n\t\t}\n\n\t\tif ( this.pixelHeight === 0 || this.pixelDepth !== 0 ) {\n\n\t\t\tconsole.warn( 'only 2D textures currently supported' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.numberOfArrayElements !== 0 ) {\n\n\t\t\tconsole.warn( 'texture arrays not currently supported' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.numberOfFaces !== facesExpected ) {\n\n\t\t\tconsole.warn( 'number of faces expected' + facesExpected + ', but found ' + this.numberOfFaces );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// we now have a completely validated file, so could use existence of loadType as success\n\t\t// would need to make this more elaborate & adjust checks above to support more than one load type\n\t\tthis.loadType = COMPRESSED_2D;\n\n\t}\n\n\tmipmaps( loadMipmaps ) {\n\n\t\tconst mipmaps = [];\n\n\t\t// initialize width & height for level 1\n\t\tlet dataOffset = HEADER_LEN + this.bytesOfKeyValueData;\n\t\tlet width = this.pixelWidth;\n\t\tlet height = this.pixelHeight;\n\t\tconst mipmapCount = loadMipmaps ? this.numberOfMipmapLevels : 1;\n\n\t\tfor ( let level = 0; level < mipmapCount; level ++ ) {\n\n\t\t\tconst imageSize = new Int32Array( this.arrayBuffer, dataOffset, 1 )[ 0 ]; // size per face, since not supporting array cubemaps\n\t\t\tdataOffset += 4; // size of the image + 4 for the imageSize field\n\n\t\t\tfor ( let face = 0; face < this.numberOfFaces; face ++ ) {\n\n\t\t\t\tconst byteArray = new Uint8Array( this.arrayBuffer, dataOffset, imageSize );\n\n\t\t\t\tmipmaps.push( { 'data': byteArray, 'width': width, 'height': height } );\n\n\t\t\t\tdataOffset += imageSize;\n\t\t\t\tdataOffset += 3 - ( ( imageSize + 3 ) % 4 ); // add padding for odd sized image\n\n\t\t\t}\n\n\t\t\twidth = Math.max( 1.0, width * 0.5 );\n\t\t\theight = Math.max( 1.0, height * 0.5 );\n\n\t\t}\n\n\t\treturn mipmaps;\n\n\t}\n\n}\n\nexport { KTXLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tFileLoader,\n\tGroup,\n\tNoColorSpace,\n\tLoader,\n\tMesh,\n\tMeshPhysicalMaterial,\n\tMirroredRepeatWrapping,\n\tRepeatWrapping,\n\tSRGBColorSpace,\n\tTextureLoader,\n\tObject3D,\n\tVector2\n} from 'three';\n\nimport * as fflate from '../libs/fflate.module.js';\n\nclass USDAParser {\n\n\tparse( text ) {\n\n\t\tconst data = {};\n\n\t\tconst lines = text.split( '\\n' );\n\n\t\tlet string = null;\n\t\tlet target = data;\n\n\t\tconst stack = [ data ];\n\n\t\t// debugger;\n\n\t\tfor ( const line of lines ) {\n\n\t\t\t// console.log( line );\n\n\t\t\tif ( line.includes( '=' ) ) {\n\n\t\t\t\tconst assignment = line.split( '=' );\n\n\t\t\t\tconst lhs = assignment[ 0 ].trim();\n\t\t\t\tconst rhs = assignment[ 1 ].trim();\n\n\t\t\t\tif ( rhs.endsWith( '{' ) ) {\n\n\t\t\t\t\tconst group = {};\n\t\t\t\t\tstack.push( group );\n\n\t\t\t\t\ttarget[ lhs ] = group;\n\t\t\t\t\ttarget = group;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttarget[ lhs ] = rhs;\n\n\t\t\t\t}\n\n\t\t\t} else if ( line.endsWith( '{' ) ) {\n\n\t\t\t\tconst group = target[ string ] || {};\n\t\t\t\tstack.push( group );\n\n\t\t\t\ttarget[ string ] = group;\n\t\t\t\ttarget = group;\n\n\t\t\t} else if ( line.endsWith( '}' ) ) {\n\n\t\t\t\tstack.pop();\n\n\t\t\t\tif ( stack.length === 0 ) continue;\n\n\t\t\t\ttarget = stack[ stack.length - 1 ];\n\n\t\t\t} else if ( line.endsWith( '(' ) ) {\n\n\t\t\t\tconst meta = {};\n\t\t\t\tstack.push( meta );\n\n\t\t\t\tstring = line.split( '(' )[ 0 ].trim() || string;\n\n\t\t\t\ttarget[ string ] = meta;\n\t\t\t\ttarget = meta;\n\n\t\t\t} else if ( line.endsWith( ')' ) ) {\n\n\t\t\t\tstack.pop();\n\n\t\t\t\ttarget = stack[ stack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tstring = line.trim();\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass USDZLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst parser = new USDAParser();\n\n\t\tfunction parseAssets( zip ) {\n\n\t\t\tconst data = {};\n\t\t\tconst loader = new FileLoader();\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfor ( const filename in zip ) {\n\n\t\t\t\tif ( filename.endsWith( 'png' ) ) {\n\n\t\t\t\t\tconst blob = new Blob( [ zip[ filename ] ], { type: { type: 'image/png' } } );\n\t\t\t\t\tdata[ filename ] = URL.createObjectURL( blob );\n\n\t\t\t\t}\n\n\t\t\t\tif ( filename.endsWith( 'usd' ) || filename.endsWith( 'usda' ) ) {\n\n\t\t\t\t\tif ( isCrateFile( zip[ filename ] ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.USDZLoader: Crate files (.usdc or binary .usd) are not supported.' );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst text = fflate.strFromU8( zip[ filename ] );\n\t\t\t\t\tdata[ filename ] = parser.parse( text );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction isCrateFile( buffer ) {\n\n\t\t\t// Check if this a crate file. First 7 bytes of a crate file are \"PXR-USDC\".\n\t\t\tconst fileHeader = buffer.slice( 0, 7 );\n\t\t\tconst crateHeader = new Uint8Array( [ 0x50, 0x58, 0x52, 0x2D, 0x55, 0x53, 0x44, 0x43 ] );\n\n\t\t\t// If this is not a crate file, we assume it is a plain USDA file.\n\t\t\treturn fileHeader.every( ( value, index ) => value === crateHeader[ index ] );\n\n\t\t}\n\n\t\tfunction findUSD( zip ) {\n\n\t\t\tif ( zip.length < 1 ) return undefined;\n\n\t\t\tconst firstFileName = Object.keys( zip )[ 0 ];\n\t\t\tlet isCrate = false;\n\n\t\t\t// As per the USD specification, the first entry in the zip archive is used as the main file (\"UsdStage\").\n\t\t\t// ASCII files can end in either .usda or .usd.\n\t\t\t// See https://openusd.org/release/spec_usdz.html#layout\n\t\t\tif ( firstFileName.endsWith( 'usda' ) ) return zip[ firstFileName ];\n\n\t\t\tif ( firstFileName.endsWith( 'usdc' ) ) {\n\n\t\t\t\tisCrate = true;\n\n\t\t\t} else if ( firstFileName.endsWith( 'usd' ) ) {\n\n\t\t\t\t// If this is not a crate file, we assume it is a plain USDA file.\n\t\t\t\tif ( ! isCrateFile( zip[ firstFileName ] ) ) {\n\n\t\t\t\t\treturn zip[ firstFileName ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tisCrate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isCrate ) {\n\n\t\t\t\tconsole.warn( 'THREE.USDZLoader: Crate files (.usdc or binary .usd) are not supported.' );\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t}\n\n\t\tconst zip = fflate.unzipSync( new Uint8Array( buffer ) );\n\n\t\t// console.log( zip );\n\n\t\tconst assets = parseAssets( zip );\n\n\t\t// console.log( assets )\n\n\t\tconst file = findUSD( zip );\n\n\t\tif ( file === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.USDZLoader: No usda file found.' );\n\n\t\t\treturn new Group();\n\n\t\t}\n\n\n\t\t// Parse file\n\n\t\tconst text = fflate.strFromU8( file );\n\t\tconst root = parser.parse( text );\n\n\t\t// Build scene\n\n\t\tfunction findMeshGeometry( data ) {\n\n\t\t\tif ( ! data ) return undefined;\n\n\t\t\tif ( 'prepend references' in data ) {\n\n\t\t\t\tconst reference = data[ 'prepend references' ];\n\t\t\t\tconst parts = reference.split( '@' );\n\t\t\t\tconst path = parts[ 1 ].replace( /^.\\//, '' );\n\t\t\t\tconst id = parts[ 2 ].replace( /^<\\//, '' ).replace( />$/, '' );\n\n\t\t\t\treturn findGeometry( assets[ path ], id );\n\n\t\t\t}\n\n\t\t\treturn findGeometry( data );\n\n\t\t}\n\n\t\tfunction findGeometry( data, id ) {\n\n\t\t\tif ( ! data ) return undefined;\n\n\t\t\tif ( id !== undefined ) {\n\n\t\t\t\tconst def = `def Mesh \"${id}\"`;\n\n\t\t\t\tif ( def in data ) {\n\n\t\t\t\t\treturn data[ def ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( const name in data ) {\n\n\t\t\t\tconst object = data[ name ];\n\n\t\t\t\tif ( name.startsWith( 'def Mesh' ) ) {\n\n\t\t\t\t\t// Move points to Mesh\n\n\t\t\t\t\tif ( 'point3f[] points' in data ) {\n\n\t\t\t\t\t\tobject[ 'point3f[] points' ] = data[ 'point3f[] points' ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Move st to Mesh\n\n\t\t\t\t\tif ( 'texCoord2f[] primvars:st' in data ) {\n\n\t\t\t\t\t\tobject[ 'texCoord2f[] primvars:st' ] = data[ 'texCoord2f[] primvars:st' ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Move st indices to Mesh\n\n\t\t\t\t\tif ( 'int[] primvars:st:indices' in data ) {\n\n\t\t\t\t\t\tobject[ 'int[] primvars:st:indices' ] = data[ 'int[] primvars:st:indices' ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( typeof object === 'object' ) {\n\n\t\t\t\t\tconst geometry = findGeometry( object );\n\n\t\t\t\t\tif ( geometry ) return geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildGeometry( data ) {\n\n\t\t\tif ( ! data ) return undefined;\n\n\t\t\tlet geometry = new BufferGeometry();\n\n\t\t\tif ( 'int[] faceVertexIndices' in data ) {\n\n\t\t\t\tconst indices = JSON.parse( data[ 'int[] faceVertexIndices' ] );\n\t\t\t\tgeometry.setIndex( indices );\n\n\t\t\t}\n\n\t\t\tif ( 'point3f[] points' in data ) {\n\n\t\t\t\tconst positions = JSON.parse( data[ 'point3f[] points' ].replace( /[()]*/g, '' ) );\n\t\t\t\tconst attribute = new BufferAttribute( new Float32Array( positions ), 3 );\n\t\t\t\tgeometry.setAttribute( 'position', attribute );\n\n\t\t\t}\n\n\t\t\tif ( 'normal3f[] normals' in data ) {\n\n\t\t\t\tconst normals = JSON.parse( data[ 'normal3f[] normals' ].replace( /[()]*/g, '' ) );\n\t\t\t\tconst attribute = new BufferAttribute( new Float32Array( normals ), 3 );\n\t\t\t\tgeometry.setAttribute( 'normal', attribute );\n\n\t\t\t} else {\n\n\t\t\t\tgeometry.computeVertexNormals();\n\n\t\t\t}\n\n\t\t\tif ( 'float2[] primvars:st' in data ) {\n\n\t\t\t\tdata[ 'texCoord2f[] primvars:st' ] = data[ 'float2[] primvars:st' ];\n\n\t\t\t}\n\n\t\t\tif ( 'texCoord2f[] primvars:st' in data ) {\n\n\t\t\t\tconst uvs = JSON.parse( data[ 'texCoord2f[] primvars:st' ].replace( /[()]*/g, '' ) );\n\t\t\t\tconst attribute = new BufferAttribute( new Float32Array( uvs ), 2 );\n\n\t\t\t\tif ( 'int[] primvars:st:indices' in data ) {\n\n\t\t\t\t\tgeometry = geometry.toNonIndexed();\n\n\t\t\t\t\tconst indices = JSON.parse( data[ 'int[] primvars:st:indices' ] );\n\t\t\t\t\tgeometry.setAttribute( 'uv', toFlatBufferAttribute( attribute, indices ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgeometry.setAttribute( 'uv', attribute );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction toFlatBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize );\n\n\t\t}\n\n\t\tfunction findMeshMaterial( data ) {\n\n\t\t\tif ( ! data ) return undefined;\n\n\t\t\tif ( 'rel material:binding' in data ) {\n\n\t\t\t\tconst reference = data[ 'rel material:binding' ];\n\t\t\t\tconst id = reference.replace( /^<\\//, '' ).replace( />$/, '' );\n\t\t\t\tconst parts = id.split( '/' );\n\n\t\t\t\treturn findMaterial( root, ` \"${ parts[ 1 ] }\"` );\n\n\t\t\t}\n\n\t\t\treturn findMaterial( data );\n\n\t\t}\n\n\t\tfunction findMaterial( data, id = '' ) {\n\n\t\t\tfor ( const name in data ) {\n\n\t\t\t\tconst object = data[ name ];\n\n\t\t\t\tif ( name.startsWith( 'def Material' + id ) ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t\tif ( typeof object === 'object' ) {\n\n\t\t\t\t\tconst material = findMaterial( object, id );\n\n\t\t\t\t\tif ( material ) return material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureParams( map, data_value ) {\n\n\t\t\t// rotation, scale and translation\n\n\t\t\tif ( data_value[ 'float inputs:rotation' ] ) {\n\n\t\t\t\tmap.rotation = parseFloat( data_value[ 'float inputs:rotation' ] );\n\n\t\t\t}\n\n\t\t\tif ( data_value[ 'float2 inputs:scale' ] ) {\n\n\t\t\t\tmap.repeat = new Vector2().fromArray( JSON.parse( '[' + data_value[ 'float2 inputs:scale' ].replace( /[()]*/g, '' ) + ']' ) );\n\n\t\t\t}\n\n\t\t\tif ( data_value[ 'float2 inputs:translation' ] ) {\n\n\t\t\t\tmap.offset = new Vector2().fromArray( JSON.parse( '[' + data_value[ 'float2 inputs:translation' ].replace( /[()]*/g, '' ) + ']' ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildMaterial( data ) {\n\n\t\t\tconst material = new MeshPhysicalMaterial();\n\n\t\t\tif ( data !== undefined ) {\n\n\t\t\t\tif ( 'def Shader \"PreviewSurface\"' in data ) {\n\n\t\t\t\t\tconst surface = data[ 'def Shader \"PreviewSurface\"' ];\n\n\t\t\t\t\tif ( 'color3f inputs:diffuseColor.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'color3f inputs:diffuseColor.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.map = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.map.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_diffuse\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.map, data[ 'def Shader \"Transform2d_diffuse\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( 'color3f inputs:diffuseColor' in surface ) {\n\n\t\t\t\t\t\tconst color = surface[ 'color3f inputs:diffuseColor' ].replace( /[()]*/g, '' );\n\t\t\t\t\t\tmaterial.color.fromArray( JSON.parse( '[' + color + ']' ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'color3f inputs:emissiveColor.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'color3f inputs:emissiveColor.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.emissiveMap = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.emissiveMap.colorSpace = SRGBColorSpace;\n\t\t\t\t\t\tmaterial.emissive.set( 0xffffff );\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_emissive\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.emissiveMap, data[ 'def Shader \"Transform2d_emissive\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( 'color3f inputs:emissiveColor' in surface ) {\n\n\t\t\t\t\t\tconst color = surface[ 'color3f inputs:emissiveColor' ].replace( /[()]*/g, '' );\n\t\t\t\t\t\tmaterial.emissive.fromArray( JSON.parse( '[' + color + ']' ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'normal3f inputs:normal.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'normal3f inputs:normal.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.normalMap = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.normalMap.colorSpace = NoColorSpace;\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_normal\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.normalMap, data[ 'def Shader \"Transform2d_normal\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'float inputs:roughness.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'float inputs:roughness.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.roughness = 1.0;\n\t\t\t\t\t\tmaterial.roughnessMap = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.roughnessMap.colorSpace = NoColorSpace;\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_roughness\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.roughnessMap, data[ 'def Shader \"Transform2d_roughness\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( 'float inputs:roughness' in surface ) {\n\n\t\t\t\t\t\tmaterial.roughness = parseFloat( surface[ 'float inputs:roughness' ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'float inputs:metallic.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'float inputs:metallic.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.metalness = 1.0;\n\t\t\t\t\t\tmaterial.metalnessMap = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.metalnessMap.colorSpace = NoColorSpace;\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_metallic\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.metalnessMap, data[ 'def Shader \"Transform2d_metallic\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( 'float inputs:metallic' in surface ) {\n\n\t\t\t\t\t\tmaterial.metalness = parseFloat( surface[ 'float inputs:metallic' ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'float inputs:clearcoat.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'float inputs:clearcoat.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.clearcoat = 1.0;\n\t\t\t\t\t\tmaterial.clearcoatMap = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.clearcoatMap.colorSpace = NoColorSpace;\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_clearcoat\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.clearcoatMap, data[ 'def Shader \"Transform2d_clearcoat\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( 'float inputs:clearcoat' in surface ) {\n\n\t\t\t\t\t\tmaterial.clearcoat = parseFloat( surface[ 'float inputs:clearcoat' ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'float inputs:clearcoatRoughness.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'float inputs:clearcoatRoughness.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.clearcoatRoughness = 1.0;\n\t\t\t\t\t\tmaterial.clearcoatRoughnessMap = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.clearcoatRoughnessMap.colorSpace = NoColorSpace;\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_clearcoatRoughness\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.clearcoatRoughnessMap, data[ 'def Shader \"Transform2d_clearcoatRoughness\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( 'float inputs:clearcoatRoughness' in surface ) {\n\n\t\t\t\t\t\tmaterial.clearcoatRoughness = parseFloat( surface[ 'float inputs:clearcoatRoughness' ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'float inputs:ior' in surface ) {\n\n\t\t\t\t\t\tmaterial.ior = parseFloat( surface[ 'float inputs:ior' ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'float inputs:occlusion.connect' in surface ) {\n\n\t\t\t\t\t\tconst path = surface[ 'float inputs:occlusion.connect' ];\n\t\t\t\t\t\tconst sampler = findTexture( root, /(\\w+).output/.exec( path )[ 1 ] );\n\n\t\t\t\t\t\tmaterial.aoMap = buildTexture( sampler );\n\t\t\t\t\t\tmaterial.aoMap.colorSpace = NoColorSpace;\n\n\t\t\t\t\t\tif ( 'def Shader \"Transform2d_occlusion\"' in data ) {\n\n\t\t\t\t\t\t\tsetTextureParams( material.aoMap, data[ 'def Shader \"Transform2d_occlusion\"' ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( 'def Shader \"diffuseColor_texture\"' in data ) {\n\n\t\t\t\t\tconst sampler = data[ 'def Shader \"diffuseColor_texture\"' ];\n\n\t\t\t\t\tmaterial.map = buildTexture( sampler );\n\t\t\t\t\tmaterial.map.colorSpace = SRGBColorSpace;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 'def Shader \"normal_texture\"' in data ) {\n\n\t\t\t\t\tconst sampler = data[ 'def Shader \"normal_texture\"' ];\n\n\t\t\t\t\tmaterial.normalMap = buildTexture( sampler );\n\t\t\t\t\tmaterial.normalMap.colorSpace = NoColorSpace;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tfunction findTexture( data, id ) {\n\n\t\t\tfor ( const name in data ) {\n\n\t\t\t\tconst object = data[ name ];\n\n\t\t\t\tif ( name.startsWith( `def Shader \"${ id }\"` ) ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t\tif ( typeof object === 'object' ) {\n\n\t\t\t\t\tconst texture = findTexture( object, id );\n\n\t\t\t\t\tif ( texture ) return texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildTexture( data ) {\n\n\t\t\tif ( 'asset inputs:file' in data ) {\n\n\t\t\t\tconst path = data[ 'asset inputs:file' ].replace( /@*/g, '' );\n\n\t\t\t\tconst loader = new TextureLoader();\n\n\t\t\t\tconst texture = loader.load( assets[ path ] );\n\n\t\t\t\tconst map = {\n\t\t\t\t\t'\"clamp\"': ClampToEdgeWrapping,\n\t\t\t\t\t'\"mirror\"': MirroredRepeatWrapping,\n\t\t\t\t\t'\"repeat\"': RepeatWrapping\n\t\t\t\t};\n\n\t\t\t\tif ( 'token inputs:wrapS' in data ) {\n\n\t\t\t\t\ttexture.wrapS = map[ data[ 'token inputs:wrapS' ] ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( 'token inputs:wrapT' in data ) {\n\n\t\t\t\t\ttexture.wrapT = map[ data[ 'token inputs:wrapT' ] ];\n\n\t\t\t\t}\n\n\t\t\t\treturn texture;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfunction buildObject( data ) {\n\n\t\t\tconst geometry = buildGeometry( findMeshGeometry( data ) );\n\t\t\tconst material = buildMaterial( findMeshMaterial( data ) );\n\n\t\t\tconst mesh = geometry ? new Mesh( geometry, material ) : new Object3D();\n\n\t\t\tif ( 'matrix4d xformOp:transform' in data ) {\n\n\t\t\t\tconst array = JSON.parse( '[' + data[ 'matrix4d xformOp:transform' ].replace( /[()]*/g, '' ) + ']' );\n\n\t\t\t\tmesh.matrix.fromArray( array );\n\t\t\t\tmesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );\n\n\t\t\t}\n\n\t\t\treturn mesh;\n\n\t\t}\n\n\t\tfunction buildHierarchy( data, group ) {\n\n\t\t\tfor ( const name in data ) {\n\n\t\t\t\tif ( name.startsWith( 'def Scope' ) ) {\n\n\t\t\t\t\tbuildHierarchy( data[ name ], group );\n\n\t\t\t\t} else if ( name.startsWith( 'def Xform' ) ) {\n\n\t\t\t\t\tconst mesh = buildObject( data[ name ] );\n\n\t\t\t\t\tif ( /def Xform \"(\\w+)\"/.test( name ) ) {\n\n\t\t\t\t\t\tmesh.name = /def Xform \"(\\w+)\"/.exec( name )[ 1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup.add( mesh );\n\n\t\t\t\t\tbuildHierarchy( data[ name ], mesh );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst group = new Group();\n\n\t\tbuildHierarchy( root, group );\n\n\t\treturn group;\n\n\t}\n\n}\n\nexport { USDZLoader };\n","import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tColor\n} from 'three';\n\n/**\n * Description: A THREE loader for PLY ASCII files (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tconst loader = new PLYLoader();\n *\tloader.load('./models/ply/ascii/dolphins.ply', function (geometry) {\n *\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\n * If the PLY file uses non standard property names, they can be mapped while\n * loading. For example, the following maps the properties\n * “diffuse_(red|green|blue)” in the file to standard color names.\n *\n * loader.setPropertyNameMapping( {\n *\tdiffuse_red: 'red',\n *\tdiffuse_green: 'green',\n *\tdiffuse_blue: 'blue'\n * } );\n *\n * Custom properties outside of the defaults for position, uv, normal\n * and color attributes can be added using the setCustomPropertyNameMapping method.\n * For example, the following maps the element properties “custom_property_a”\n * and “custom_property_b” to an attribute “customAttribute” with an item size of 2.\n * Attribute item sizes are set from the number of element properties in the property array.\n *\n * loader.setCustomPropertyNameMapping( {\n *\tcustomAttribute: ['custom_property_a', 'custom_property_b'],\n * } );\n *\n */\n\nconst _color = new Color();\n\nclass PLYLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.propertyNameMapping = {};\n\t\tthis.customPropertyMapping = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tsetPropertyNameMapping( mapping ) {\n\n\t\tthis.propertyNameMapping = mapping;\n\n\t}\n\n\tsetCustomPropertyNameMapping( mapping ) {\n\n\t\tthis.customPropertyMapping = mapping;\n\n\t}\n\n\tparse( data ) {\n\n\t\tfunction parseHeader( data, headerLength = 0 ) {\n\n\t\t\tconst patternHeader = /^ply([\\s\\S]*)end_header(\\r\\n|\\r|\\n)/;\n\t\t\tlet headerText = '';\n\t\t\tconst result = patternHeader.exec( data );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\theaderText = result[ 1 ];\n\n\t\t\t}\n\n\t\t\tconst header = {\n\t\t\t\tcomments: [],\n\t\t\t\telements: [],\n\t\t\t\theaderLength: headerLength,\n\t\t\t\tobjInfo: ''\n\t\t\t};\n\n\t\t\tconst lines = headerText.split( /\\r\\n|\\r|\\n/ );\n\t\t\tlet currentElement;\n\n\t\t\tfunction make_ply_element_property( propertValues, propertyNameMapping ) {\n\n\t\t\t\tconst property = { type: propertValues[ 0 ] };\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.name = propertValues[ 3 ];\n\t\t\t\t\tproperty.countType = propertValues[ 1 ];\n\t\t\t\t\tproperty.itemType = propertValues[ 2 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.name = propertValues[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( property.name in propertyNameMapping ) {\n\n\t\t\t\t\tproperty.name = propertyNameMapping[ property.name ];\n\n\t\t\t\t}\n\n\t\t\t\treturn property;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\tlet line = lines[ i ];\n\t\t\t\tline = line.trim();\n\n\t\t\t\tif ( line === '' ) continue;\n\n\t\t\t\tconst lineValues = line.split( /\\s+/ );\n\t\t\t\tconst lineType = lineValues.shift();\n\t\t\t\tline = lineValues.join( ' ' );\n\n\t\t\t\tswitch ( lineType ) {\n\n\t\t\t\t\tcase 'format':\n\n\t\t\t\t\t\theader.format = lineValues[ 0 ];\n\t\t\t\t\t\theader.version = lineValues[ 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'comment':\n\n\t\t\t\t\t\theader.comments.push( line );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'element':\n\n\t\t\t\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentElement = {};\n\t\t\t\t\t\tcurrentElement.name = lineValues[ 0 ];\n\t\t\t\t\t\tcurrentElement.count = parseInt( lineValues[ 1 ] );\n\t\t\t\t\t\tcurrentElement.properties = [];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'property':\n\n\t\t\t\t\t\tcurrentElement.properties.push( make_ply_element_property( lineValues, scope.propertyNameMapping ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'obj_info':\n\n\t\t\t\t\t\theader.objInfo = line;\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.log( 'unhandled', lineType, lineValues );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t}\n\n\t\t\treturn header;\n\n\t\t}\n\n\t\tfunction parseASCIINumber( n, type ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':\n\t\t\t\tcase 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':\n\n\t\t\t\t\treturn parseInt( n );\n\n\t\t\t\tcase 'float': case 'double': case 'float32': case 'float64':\n\n\t\t\t\t\treturn parseFloat( n );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseASCIIElement( properties, tokens ) {\n\n\t\t\tconst element = {};\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\tif ( properties[ i ].type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\t\t\t\t\tconst n = parseASCIINumber( tokens.next(), properties[ i ].countType );\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\t\t\tlist.push( parseASCIINumber( tokens.next(), properties[ i ].itemType ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ properties[ i ].name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ properties[ i ].name ] = parseASCIINumber( tokens.next(), properties[ i ].type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn element;\n\n\t\t}\n\n\t\tfunction createBuffer() {\n\n\t\t\tconst buffer = {\n\t\t\t  indices: [],\n\t\t\t  vertices: [],\n\t\t\t  normals: [],\n\t\t\t  uvs: [],\n\t\t\t  faceVertexUvs: [],\n\t\t\t  colors: [],\n\t\t\t  faceVertexColors: []\n\t\t\t};\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t  buffer[ customProperty ] = [];\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction mapElementAttributes( properties ) {\n\n\t\t\tconst elementNames = properties.map( property => {\n\n\t\t\t\treturn property.name;\n\n\t\t\t} );\n\n\t\t\tfunction findAttrName( names ) {\n\n\t\t\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst name = names[ i ];\n\n\t\t\t\t\tif ( elementNames.includes( name ) ) return name;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tattrX: findAttrName( [ 'x', 'px', 'posx' ] ) || 'x',\n\t\t\t\tattrY: findAttrName( [ 'y', 'py', 'posy' ] ) || 'y',\n\t\t\t\tattrZ: findAttrName( [ 'z', 'pz', 'posz' ] ) || 'z',\n\t\t\t\tattrNX: findAttrName( [ 'nx', 'normalx' ] ),\n\t\t\t\tattrNY: findAttrName( [ 'ny', 'normaly' ] ),\n\t\t\t\tattrNZ: findAttrName( [ 'nz', 'normalz' ] ),\n\t\t\t\tattrS: findAttrName( [ 's', 'u', 'texture_u', 'tx' ] ),\n\t\t\t\tattrT: findAttrName( [ 't', 'v', 'texture_v', 'ty' ] ),\n\t\t\t\tattrR: findAttrName( [ 'red', 'diffuse_red', 'r', 'diffuse_r' ] ),\n\t\t\t\tattrG: findAttrName( [ 'green', 'diffuse_green', 'g', 'diffuse_g' ] ),\n\t\t\t\tattrB: findAttrName( [ 'blue', 'diffuse_blue', 'b', 'diffuse_b' ] ),\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseASCII( data, header ) {\n\n\t\t\t// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst patternBody = /end_header\\s+(\\S[\\s\\S]*\\S|\\S)\\s*$/;\n\t\t\tlet body, matches;\n\n\t\t\tif ( ( matches = patternBody.exec( data ) ) !== null ) {\n\n\t\t\t\tbody = matches[ 1 ].split( /\\s+/ );\n\n\t\t\t} else {\n\n\t\t\t\tbody = [ ];\n\n\t\t\t}\n\n\t\t\tconst tokens = new ArrayStream( body );\n\n\t\t\tloop: for ( let i = 0; i < header.elements.length; i ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ i ];\n\t\t\t\tconst attributeMap = mapElementAttributes( elementDesc.properties );\n\n\t\t\t\tfor ( let j = 0; j < elementDesc.count; j ++ ) {\n\n\t\t\t\t\tconst element = parseASCIIElement( elementDesc.properties, tokens );\n\n\t\t\t\t\tif ( ! element ) break loop;\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction postProcess( buffer ) {\n\n\t\t\tlet geometry = new BufferGeometry();\n\n\t\t\t// mandatory buffer data\n\n\t\t\tif ( buffer.indices.length > 0 ) {\n\n\t\t\t\tgeometry.setIndex( buffer.indices );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( buffer.vertices, 3 ) );\n\n\t\t\t// optional buffer data\n\n\t\t\tif ( buffer.normals.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( buffer.normals, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.uvs.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.uvs, 2 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.colors.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( buffer.colors, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.faceVertexUvs.length > 0 || buffer.faceVertexColors.length > 0 ) {\n\n\t\t\t\tgeometry = geometry.toNonIndexed();\n\n\t\t\t\tif ( buffer.faceVertexUvs.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.faceVertexUvs, 2 ) );\n\t\t\t\tif ( buffer.faceVertexColors.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( buffer.faceVertexColors, 3 ) );\n\n\t\t\t}\n\n\t\t\t// custom buffer data\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\tif ( buffer[ customProperty ].length > 0 ) {\n\n\t\t\t\t  \tgeometry.setAttribute(\n\t\t\t\t\t\tcustomProperty,\n\t\t\t\t\t\tnew Float32BufferAttribute(\n\t\t\t\t\t  \t\tbuffer[ customProperty ],\n\t\t\t\t\t  \t\tscope.customPropertyMapping[ customProperty ].length\n\t\t\t\t\t\t)\n\t\t\t\t  \t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction handleElement( buffer, elementName, element, cacheEntry ) {\n\n\t\t\tif ( elementName === 'vertex' ) {\n\n\t\t\t\tbuffer.vertices.push( element[ cacheEntry.attrX ], element[ cacheEntry.attrY ], element[ cacheEntry.attrZ ] );\n\n\t\t\t\tif ( cacheEntry.attrNX !== null && cacheEntry.attrNY !== null && cacheEntry.attrNZ !== null ) {\n\n\t\t\t\t\tbuffer.normals.push( element[ cacheEntry.attrNX ], element[ cacheEntry.attrNY ], element[ cacheEntry.attrNZ ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrS !== null && cacheEntry.attrT !== null ) {\n\n\t\t\t\t\tbuffer.uvs.push( element[ cacheEntry.attrS ], element[ cacheEntry.attrT ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0\n\t\t\t\t\t).convertSRGBToLinear();\n\n\t\t\t\t\tbuffer.colors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\t\tfor ( const elementProperty of scope.customPropertyMapping[ customProperty ] ) {\n\n\t\t\t\t\t  buffer[ customProperty ].push( element[ elementProperty ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( elementName === 'face' ) {\n\n\t\t\t\tconst vertex_indices = element.vertex_indices || element.vertex_index; // issue #9338\n\t\t\t\tconst texcoord = element.texcoord;\n\n\t\t\t\tif ( vertex_indices.length === 3 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 2 ] );\n\n\t\t\t\t\tif ( texcoord && texcoord.length === 6 ) {\n\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 0 ], texcoord[ 1 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 2 ], texcoord[ 3 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 4 ], texcoord[ 5 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( vertex_indices.length === 4 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 3 ] );\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 1 ], vertex_indices[ 2 ], vertex_indices[ 3 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// face colors\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0\n\t\t\t\t\t).convertSRGBToLinear();\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction binaryReadElement( at, properties ) {\n\n\t\t\tconst element = {};\n\t\t\tlet read = 0;\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\t\t\t\tconst valueReader = property.valueReader;\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\n\t\t\t\t\tconst n = property.countReader.read( at + read );\n\t\t\t\t\tread += property.countReader.size;\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tlist.push( valueReader.read( at + read ) );\n\t\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ property.name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ property.name ] = valueReader.read( at + read );\n\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn [ element, read ];\n\n\t\t}\n\n\t\tfunction setPropertyBinaryReaders( properties, body, little_endian ) {\n\n\t\t\tfunction getBinaryReader( dataview, type, little_endian ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t// corespondences for non-specific length types here match rply:\n\t\t\t\t\tcase 'int8':\tcase 'char':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'uint8':\tcase 'uchar':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'int16':\tcase 'short':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'uint16':\tcase 'ushort':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'int32':\tcase 'int':\t\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'uint32':\tcase 'uint':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float32': case 'float':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float64': case 'double':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat64( at, little_endian );\n\n\t\t\t\t\t}, size: 8 };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = properties.length; i < l; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.countReader = getBinaryReader( body, property.countType, little_endian );\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.itemType, little_endian );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.type, little_endian );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseBinary( data, header ) {\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst little_endian = ( header.format === 'binary_little_endian' );\n\t\t\tconst body = new DataView( data, header.headerLength );\n\t\t\tlet result, loc = 0;\n\n\t\t\tfor ( let currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ currentElement ];\n\t\t\t\tconst properties = elementDesc.properties;\n\t\t\t\tconst attributeMap = mapElementAttributes( properties );\n\n\t\t\t\tsetPropertyBinaryReaders( properties, body, little_endian );\n\n\t\t\t\tfor ( let currentElementCount = 0; currentElementCount < elementDesc.count; currentElementCount ++ ) {\n\n\t\t\t\t\tresult = binaryReadElement( loc, properties );\n\t\t\t\t\tloc += result[ 1 ];\n\t\t\t\t\tconst element = result[ 0 ];\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction extractHeaderText( bytes ) {\n\n\t\t\tlet i = 0;\n\t\t\tlet cont = true;\n\n\t\t\tlet line = '';\n\t\t\tconst lines = [];\n\n\t\t\tconst startLine = new TextDecoder().decode( bytes.subarray( 0, 5 ) );\n\t\t\tconst hasCRNL = /^ply\\r\\n/.test( startLine );\n\n\t\t\tdo {\n\n\t\t\t\tconst c = String.fromCharCode( bytes[ i ++ ] );\n\n\t\t\t\tif ( c !== '\\n' && c !== '\\r' ) {\n\n\t\t\t\t\tline += c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( line === 'end_header' ) cont = false;\n\t\t\t\t\tif ( line !== '' ) {\n\n\t\t\t\t\t\tlines.push( line );\n\t\t\t\t\t\tline = '';\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} while ( cont && i < bytes.length );\n\n\t\t\t// ascii section using \\r\\n as line endings\n\t\t\tif ( hasCRNL === true ) i ++;\n\n\t\t\treturn { headerText: lines.join( '\\r' ) + '\\r', headerLength: i };\n\n\t\t}\n\n\t\t//\n\n\t\tlet geometry;\n\t\tconst scope = this;\n\n\t\tif ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst bytes = new Uint8Array( data );\n\t\t\tconst { headerText, headerLength } = extractHeaderText( bytes );\n\t\t\tconst header = parseHeader( headerText, headerLength );\n\n\t\t\tif ( header.format === 'ascii' ) {\n\n\t\t\t\tconst text = new TextDecoder().decode( bytes );\n\n\t\t\t\tgeometry = parseASCII( text, header );\n\n\t\t\t} else {\n\n\t\t\t\tgeometry = parseBinary( data, header );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tgeometry = parseASCII( data, parseHeader( data ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ArrayStream {\n\n\tconstructor( arr ) {\n\n\t\tthis.arr = arr;\n\t\tthis.i = 0;\n\n\t}\n\n\tempty() {\n\n\t\treturn this.i >= this.arr.length;\n\n\t}\n\n\tnext() {\n\n\t\treturn this.arr[ this.i ++ ];\n\n\t}\n\n}\n\nexport { PLYLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tVector3\n} from 'three';\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n *  Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n *  There is perhaps some question as to how valid it is to always assume little-endian-ness.\n *  ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *  const loader = new STLLoader();\n *  loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n *    scene.add( new THREE.Mesh( geometry ) );\n *  });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n *  // use the same code to load STL as above\n *  if (geometry.hasColors) {\n *    material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n *  } else { .... }\n *  const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n *  const materials = [];\n *  const nGeometryGroups = geometry.groups.length;\n *\n *  const colorMap = ...; // Some logic to index colors.\n *\n *  for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n *  }\n *\n *  materials.push(material);\n *  const mesh = new THREE.Mesh(geometry, materials);\n */\n\n\nclass STLLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( data ) {\n\n\t\tfunction isBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 );\n\t\t\tconst n_faces = reader.getUint32( 80, true );\n\t\t\tconst expect = 80 + ( 32 / 8 ) + ( n_faces * face_size );\n\n\t\t\tif ( expect === reader.byteLength ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// An ASCII STL data must begin with 'solid ' as the first six bytes.\n\t\t\t// However, ASCII STLs lacking the SPACE after the 'd' are known to be\n\t\t\t// plentiful.  So, check the first 5 bytes for 'solid'.\n\n\t\t\t// Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n\t\t\t// https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n\t\t\t// Search for \"solid\" to start anywhere after those prefixes.\n\n\t\t\t// US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n\t\t\tconst solid = [ 115, 111, 108, 105, 100 ];\n\n\t\t\tfor ( let off = 0; off < 5; off ++ ) {\n\n\t\t\t\t// If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n\t\t\t\tif ( matchDataViewAt( solid, reader, off ) ) return false;\n\n\t\t\t}\n\n\t\t\t// Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction matchDataViewAt( query, reader, offset ) {\n\n\t\t\t// Check if each byte in query matches the corresponding byte from the current offset\n\n\t\t\tfor ( let i = 0, il = query.length; i < il; i ++ ) {\n\n\t\t\t\tif ( query[ i ] !== reader.getUint8( offset + i ) ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction parseBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst faces = reader.getUint32( 80, true );\n\n\t\t\tlet r, g, b, hasColors = false, colors;\n\t\t\tlet defaultR, defaultG, defaultB, alpha;\n\n\t\t\t// process STL header\n\t\t\t// check for default color in header (\"COLOR=rgba\" sequence).\n\n\t\t\tfor ( let index = 0; index < 80 - 10; index ++ ) {\n\n\t\t\t\tif ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) {\n\n\t\t\t\t\thasColors = true;\n\t\t\t\t\tcolors = new Float32Array( faces * 3 * 3 );\n\n\t\t\t\t\tdefaultR = reader.getUint8( index + 6 ) / 255;\n\t\t\t\t\tdefaultG = reader.getUint8( index + 7 ) / 255;\n\t\t\t\t\tdefaultB = reader.getUint8( index + 8 ) / 255;\n\t\t\t\t\talpha = reader.getUint8( index + 9 ) / 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst dataOffset = 84;\n\t\t\tconst faceLength = 12 * 4 + 2;\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst vertices = new Float32Array( faces * 3 * 3 );\n\t\t\tconst normals = new Float32Array( faces * 3 * 3 );\n\n\t\t\tconst color = new Color();\n\n\t\t\tfor ( let face = 0; face < faces; face ++ ) {\n\n\t\t\t\tconst start = dataOffset + face * faceLength;\n\t\t\t\tconst normalX = reader.getFloat32( start, true );\n\t\t\t\tconst normalY = reader.getFloat32( start + 4, true );\n\t\t\t\tconst normalZ = reader.getFloat32( start + 8, true );\n\n\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\tconst packedColor = reader.getUint16( start + 48, true );\n\n\t\t\t\t\tif ( ( packedColor & 0x8000 ) === 0 ) {\n\n\t\t\t\t\t\t// facet has its own unique color\n\n\t\t\t\t\t\tr = ( packedColor & 0x1F ) / 31;\n\t\t\t\t\t\tg = ( ( packedColor >> 5 ) & 0x1F ) / 31;\n\t\t\t\t\t\tb = ( ( packedColor >> 10 ) & 0x1F ) / 31;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tr = defaultR;\n\t\t\t\t\t\tg = defaultG;\n\t\t\t\t\t\tb = defaultB;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 1; i <= 3; i ++ ) {\n\n\t\t\t\t\tconst vertexstart = start + i * 12;\n\t\t\t\t\tconst componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );\n\n\t\t\t\t\tvertices[ componentIdx ] = reader.getFloat32( vertexstart, true );\n\t\t\t\t\tvertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );\n\t\t\t\t\tvertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );\n\n\t\t\t\t\tnormals[ componentIdx ] = normalX;\n\t\t\t\t\tnormals[ componentIdx + 1 ] = normalY;\n\t\t\t\t\tnormals[ componentIdx + 2 ] = normalZ;\n\n\t\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\t\tcolor.set( r, g, b ).convertSRGBToLinear();\n\n\t\t\t\t\t\tcolors[ componentIdx ] = color.r;\n\t\t\t\t\t\tcolors[ componentIdx + 1 ] = color.g;\n\t\t\t\t\t\tcolors[ componentIdx + 2 ] = color.b;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\t\t\t\tgeometry.hasColors = true;\n\t\t\t\tgeometry.alpha = alpha;\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction parseASCII( data ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst patternSolid = /solid([\\s\\S]*?)endsolid/g;\n\t\t\tconst patternFace = /facet([\\s\\S]*?)endfacet/g;\n\t\t\tconst patternName = /solid\\s(.+)/;\n\t\t\tlet faceCounter = 0;\n\n\t\t\tconst patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source;\n\t\t\tconst patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' );\n\t\t\tconst patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' );\n\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst groupNames = [];\n\n\t\t\tconst normal = new Vector3();\n\n\t\t\tlet result;\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet startVertex = 0;\n\t\t\tlet endVertex = 0;\n\n\t\t\twhile ( ( result = patternSolid.exec( data ) ) !== null ) {\n\n\t\t\t\tstartVertex = endVertex;\n\n\t\t\t\tconst solid = result[ 0 ];\n\n\t\t\t\tconst name = ( result = patternName.exec( solid ) ) !== null ? result[ 1 ] : '';\n\t\t\t\tgroupNames.push( name );\n\n\t\t\t\twhile ( ( result = patternFace.exec( solid ) ) !== null ) {\n\n\t\t\t\t\tlet vertexCountPerFace = 0;\n\t\t\t\t\tlet normalCountPerFace = 0;\n\n\t\t\t\t\tconst text = result[ 0 ];\n\n\t\t\t\t\twhile ( ( result = patternNormal.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tnormal.x = parseFloat( result[ 1 ] );\n\t\t\t\t\t\tnormal.y = parseFloat( result[ 2 ] );\n\t\t\t\t\t\tnormal.z = parseFloat( result[ 3 ] );\n\t\t\t\t\t\tnormalCountPerFace ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( ( result = patternVertex.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tvertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );\n\t\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\t\t\tvertexCountPerFace ++;\n\t\t\t\t\t\tendVertex ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// every face have to own ONE valid normal\n\n\t\t\t\t\tif ( normalCountPerFace !== 1 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the normal of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// each face have to own THREE valid vertices\n\n\t\t\t\t\tif ( vertexCountPerFace !== 3 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the vertices of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCounter ++;\n\n\t\t\t\t}\n\n\t\t\t\tconst start = startVertex;\n\t\t\t\tconst count = endVertex - startVertex;\n\n\t\t\t\tgeometry.userData.groupNames = groupNames;\n\n\t\t\t\tgeometry.addGroup( start, count, groupCount );\n\t\t\t\tgroupCount ++;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction ensureString( buffer ) {\n\n\t\t\tif ( typeof buffer !== 'string' ) {\n\n\t\t\t\treturn new TextDecoder().decode( buffer );\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction ensureBinary( buffer ) {\n\n\t\t\tif ( typeof buffer === 'string' ) {\n\n\t\t\t\tconst array_buffer = new Uint8Array( buffer.length );\n\t\t\t\tfor ( let i = 0; i < buffer.length; i ++ ) {\n\n\t\t\t\t\tarray_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian\n\n\t\t\t\t}\n\n\t\t\t\treturn array_buffer.buffer || array_buffer;\n\n\t\t\t} else {\n\n\t\t\t\treturn buffer;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// start\n\n\t\tconst binData = ensureBinary( data );\n\n\t\treturn isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) );\n\n\t}\n\n}\n\nexport { STLLoader };\n","import {\n\tCamera,\n\tClampToEdgeWrapping,\n\tDataTexture,\n\tFloatType,\n\tMesh,\n\tNearestFilter,\n\tPlaneGeometry,\n\tRGBAFormat,\n\tScene,\n\tShaderMaterial,\n\tWebGLRenderTarget\n} from 'three';\n\n/**\n * GPUComputationRenderer, based on SimulationRenderer by zz85\n *\n * The GPUComputationRenderer uses the concept of variables. These variables are RGBA float textures that hold 4 floats\n * for each compute element (texel)\n *\n * Each variable has a fragment shader that defines the computation made to obtain the variable in question.\n * You can use as many variables you need, and make dependencies so you can use textures of other variables in the shader\n * (the sampler uniforms are added automatically) Most of the variables will need themselves as dependency.\n *\n * The renderer has actually two render targets per variable, to make ping-pong. Textures from the current frame are used\n * as inputs to render the textures of the next frame.\n *\n * The render targets of the variables can be used as input textures for your visualization shaders.\n *\n * Variable names should be valid identifiers and should not collide with THREE GLSL used identifiers.\n * a common approach could be to use 'texture' prefixing the variable name; i.e texturePosition, textureVelocity...\n *\n * The size of the computation (sizeX * sizeY) is defined as 'resolution' automatically in the shader. For example:\n * #DEFINE resolution vec2( 1024.0, 1024.0 )\n *\n * -------------\n *\n * Basic use:\n *\n * // Initialization...\n *\n * // Create computation renderer\n * const gpuCompute = new GPUComputationRenderer( 1024, 1024, renderer );\n *\n * // Create initial state float textures\n * const pos0 = gpuCompute.createTexture();\n * const vel0 = gpuCompute.createTexture();\n * // and fill in here the texture data...\n *\n * // Add texture variables\n * const velVar = gpuCompute.addVariable( \"textureVelocity\", fragmentShaderVel, pos0 );\n * const posVar = gpuCompute.addVariable( \"texturePosition\", fragmentShaderPos, vel0 );\n *\n * // Add variable dependencies\n * gpuCompute.setVariableDependencies( velVar, [ velVar, posVar ] );\n * gpuCompute.setVariableDependencies( posVar, [ velVar, posVar ] );\n *\n * // Add custom uniforms\n * velVar.material.uniforms.time = { value: 0.0 };\n *\n * // Check for completeness\n * const error = gpuCompute.init();\n * if ( error !== null ) {\n *\t\tconsole.error( error );\n  * }\n *\n *\n * // In each frame...\n *\n * // Compute!\n * gpuCompute.compute();\n *\n * // Update texture uniforms in your visualization materials with the gpu renderer output\n * myMaterial.uniforms.myTexture.value = gpuCompute.getCurrentRenderTarget( posVar ).texture;\n *\n * // Do your rendering\n * renderer.render( myScene, myCamera );\n *\n * -------------\n *\n * Also, you can use utility functions to create ShaderMaterial and perform computations (rendering between textures)\n * Note that the shaders can have multiple input textures.\n *\n * const myFilter1 = gpuCompute.createShaderMaterial( myFilterFragmentShader1, { theTexture: { value: null } } );\n * const myFilter2 = gpuCompute.createShaderMaterial( myFilterFragmentShader2, { theTexture: { value: null } } );\n *\n * const inputTexture = gpuCompute.createTexture();\n *\n * // Fill in here inputTexture...\n *\n * myFilter1.uniforms.theTexture.value = inputTexture;\n *\n * const myRenderTarget = gpuCompute.createRenderTarget();\n * myFilter2.uniforms.theTexture.value = myRenderTarget.texture;\n *\n * const outputRenderTarget = gpuCompute.createRenderTarget();\n *\n * // Now use the output texture where you want:\n * myMaterial.uniforms.map.value = outputRenderTarget.texture;\n *\n * // And compute each frame, before rendering to screen:\n * gpuCompute.doRenderTarget( myFilter1, myRenderTarget );\n * gpuCompute.doRenderTarget( myFilter2, outputRenderTarget );\n *\n *\n *\n * @param {int} sizeX Computation problem size is always 2d: sizeX * sizeY elements.\n * @param {int} sizeY Computation problem size is always 2d: sizeX * sizeY elements.\n * @param {WebGLRenderer} renderer The renderer\n  */\n\nclass GPUComputationRenderer {\n\n\tconstructor( sizeX, sizeY, renderer ) {\n\n\t\tthis.variables = [];\n\n\t\tthis.currentTextureIndex = 0;\n\n\t\tlet dataType = FloatType;\n\n\t\tconst scene = new Scene();\n\n\t\tconst camera = new Camera();\n\t\tcamera.position.z = 1;\n\n\t\tconst passThruUniforms = {\n\t\t\tpassThruTexture: { value: null }\n\t\t};\n\n\t\tconst passThruShader = createShaderMaterial( getPassThroughFragmentShader(), passThruUniforms );\n\n\t\tconst mesh = new Mesh( new PlaneGeometry( 2, 2 ), passThruShader );\n\t\tscene.add( mesh );\n\n\n\t\tthis.setDataType = function ( type ) {\n\n\t\t\tdataType = type;\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addVariable = function ( variableName, computeFragmentShader, initialValueTexture ) {\n\n\t\t\tconst material = this.createShaderMaterial( computeFragmentShader );\n\n\t\t\tconst variable = {\n\t\t\t\tname: variableName,\n\t\t\t\tinitialValueTexture: initialValueTexture,\n\t\t\t\tmaterial: material,\n\t\t\t\tdependencies: null,\n\t\t\t\trenderTargets: [],\n\t\t\t\twrapS: null,\n\t\t\t\twrapT: null,\n\t\t\t\tminFilter: NearestFilter,\n\t\t\t\tmagFilter: NearestFilter\n\t\t\t};\n\n\t\t\tthis.variables.push( variable );\n\n\t\t\treturn variable;\n\n\t\t};\n\n\t\tthis.setVariableDependencies = function ( variable, dependencies ) {\n\n\t\t\tvariable.dependencies = dependencies;\n\n\t\t};\n\n\t\tthis.init = function () {\n\n\t\t\tif ( renderer.capabilities.maxVertexTextures === 0 ) {\n\n\t\t\t\treturn 'No support for vertex shader textures.';\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < this.variables.length; i ++ ) {\n\n\t\t\t\tconst variable = this.variables[ i ];\n\n\t\t\t\t// Creates rendertargets and initialize them with input texture\n\t\t\t\tvariable.renderTargets[ 0 ] = this.createRenderTarget( sizeX, sizeY, variable.wrapS, variable.wrapT, variable.minFilter, variable.magFilter );\n\t\t\t\tvariable.renderTargets[ 1 ] = this.createRenderTarget( sizeX, sizeY, variable.wrapS, variable.wrapT, variable.minFilter, variable.magFilter );\n\t\t\t\tthis.renderTexture( variable.initialValueTexture, variable.renderTargets[ 0 ] );\n\t\t\t\tthis.renderTexture( variable.initialValueTexture, variable.renderTargets[ 1 ] );\n\n\t\t\t\t// Adds dependencies uniforms to the ShaderMaterial\n\t\t\t\tconst material = variable.material;\n\t\t\t\tconst uniforms = material.uniforms;\n\n\t\t\t\tif ( variable.dependencies !== null ) {\n\n\t\t\t\t\tfor ( let d = 0; d < variable.dependencies.length; d ++ ) {\n\n\t\t\t\t\t\tconst depVar = variable.dependencies[ d ];\n\n\t\t\t\t\t\tif ( depVar.name !== variable.name ) {\n\n\t\t\t\t\t\t\t// Checks if variable exists\n\t\t\t\t\t\t\tlet found = false;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < this.variables.length; j ++ ) {\n\n\t\t\t\t\t\t\t\tif ( depVar.name === this.variables[ j ].name ) {\n\n\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( ! found ) {\n\n\t\t\t\t\t\t\t\treturn 'Variable dependency not found. Variable=' + variable.name + ', dependency=' + depVar.name;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuniforms[ depVar.name ] = { value: null };\n\n\t\t\t\t\t\tmaterial.fragmentShader = '\\nuniform sampler2D ' + depVar.name + ';\\n' + material.fragmentShader;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.currentTextureIndex = 0;\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\tthis.compute = function () {\n\n\t\t\tconst currentTextureIndex = this.currentTextureIndex;\n\t\t\tconst nextTextureIndex = this.currentTextureIndex === 0 ? 1 : 0;\n\n\t\t\tfor ( let i = 0, il = this.variables.length; i < il; i ++ ) {\n\n\t\t\t\tconst variable = this.variables[ i ];\n\n\t\t\t\t// Sets texture dependencies uniforms\n\t\t\t\tif ( variable.dependencies !== null ) {\n\n\t\t\t\t\tconst uniforms = variable.material.uniforms;\n\n\t\t\t\t\tfor ( let d = 0, dl = variable.dependencies.length; d < dl; d ++ ) {\n\n\t\t\t\t\t\tconst depVar = variable.dependencies[ d ];\n\n\t\t\t\t\t\tuniforms[ depVar.name ].value = depVar.renderTargets[ currentTextureIndex ].texture;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Performs the computation for this variable\n\t\t\t\tthis.doRenderTarget( variable.material, variable.renderTargets[ nextTextureIndex ] );\n\n\t\t\t}\n\n\t\t\tthis.currentTextureIndex = nextTextureIndex;\n\n\t\t};\n\n\t\tthis.getCurrentRenderTarget = function ( variable ) {\n\n\t\t\treturn variable.renderTargets[ this.currentTextureIndex ];\n\n\t\t};\n\n\t\tthis.getAlternateRenderTarget = function ( variable ) {\n\n\t\t\treturn variable.renderTargets[ this.currentTextureIndex === 0 ? 1 : 0 ];\n\n\t\t};\n\n\t\tthis.dispose = function () {\n\n\t\t\tmesh.geometry.dispose();\n\t\t\tmesh.material.dispose();\n\n\t\t\tconst variables = this.variables;\n\n\t\t\tfor ( let i = 0; i < variables.length; i ++ ) {\n\n\t\t\t\tconst variable = variables[ i ];\n\n\t\t\t\tif ( variable.initialValueTexture ) variable.initialValueTexture.dispose();\n\n\t\t\t\tconst renderTargets = variable.renderTargets;\n\n\t\t\t\tfor ( let j = 0; j < renderTargets.length; j ++ ) {\n\n\t\t\t\t\tconst renderTarget = renderTargets[ j ];\n\t\t\t\t\trenderTarget.dispose();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction addResolutionDefine( materialShader ) {\n\n\t\t\tmaterialShader.defines.resolution = 'vec2( ' + sizeX.toFixed( 1 ) + ', ' + sizeY.toFixed( 1 ) + ' )';\n\n\t\t}\n\n\t\tthis.addResolutionDefine = addResolutionDefine;\n\n\n\t\t// The following functions can be used to compute things manually\n\n\t\tfunction createShaderMaterial( computeFragmentShader, uniforms ) {\n\n\t\t\tuniforms = uniforms || {};\n\n\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\tname: 'GPUComputationShader',\n\t\t\t\tuniforms: uniforms,\n\t\t\t\tvertexShader: getPassThroughVertexShader(),\n\t\t\t\tfragmentShader: computeFragmentShader\n\t\t\t} );\n\n\t\t\taddResolutionDefine( material );\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tthis.createShaderMaterial = createShaderMaterial;\n\n\t\tthis.createRenderTarget = function ( sizeXTexture, sizeYTexture, wrapS, wrapT, minFilter, magFilter ) {\n\n\t\t\tsizeXTexture = sizeXTexture || sizeX;\n\t\t\tsizeYTexture = sizeYTexture || sizeY;\n\n\t\t\twrapS = wrapS || ClampToEdgeWrapping;\n\t\t\twrapT = wrapT || ClampToEdgeWrapping;\n\n\t\t\tminFilter = minFilter || NearestFilter;\n\t\t\tmagFilter = magFilter || NearestFilter;\n\n\t\t\tconst renderTarget = new WebGLRenderTarget( sizeXTexture, sizeYTexture, {\n\t\t\t\twrapS: wrapS,\n\t\t\t\twrapT: wrapT,\n\t\t\t\tminFilter: minFilter,\n\t\t\t\tmagFilter: magFilter,\n\t\t\t\tformat: RGBAFormat,\n\t\t\t\ttype: dataType,\n\t\t\t\tdepthBuffer: false\n\t\t\t} );\n\n\t\t\treturn renderTarget;\n\n\t\t};\n\n\t\tthis.createTexture = function () {\n\n\t\t\tconst data = new Float32Array( sizeX * sizeY * 4 );\n\t\t\tconst texture = new DataTexture( data, sizeX, sizeY, RGBAFormat, FloatType );\n\t\t\ttexture.needsUpdate = true;\n\t\t\treturn texture;\n\n\t\t};\n\n\t\tthis.renderTexture = function ( input, output ) {\n\n\t\t\t// Takes a texture, and render out in rendertarget\n\t\t\t// input = Texture\n\t\t\t// output = RenderTarget\n\n\t\t\tpassThruUniforms.passThruTexture.value = input;\n\n\t\t\tthis.doRenderTarget( passThruShader, output );\n\n\t\t\tpassThruUniforms.passThruTexture.value = null;\n\n\t\t};\n\n\t\tthis.doRenderTarget = function ( material, output ) {\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\t\tconst currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n\t\t\trenderer.xr.enabled = false; // Avoid camera modification\n\t\t\trenderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows\n\t\t\tmesh.material = material;\n\t\t\trenderer.setRenderTarget( output );\n\t\t\trenderer.render( scene, camera );\n\t\t\tmesh.material = passThruShader;\n\n\t\t\trenderer.xr.enabled = currentXrEnabled;\n\t\t\trenderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t};\n\n\t\t// Shaders\n\n\t\tfunction getPassThroughVertexShader() {\n\n\t\t\treturn\t'void main()\t{\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'\tgl_Position = vec4( position, 1.0 );\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'}\\n';\n\n\t\t}\n\n\t\tfunction getPassThroughFragmentShader() {\n\n\t\t\treturn\t'uniform sampler2D passThruTexture;\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'void main() {\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'\tvec2 uv = gl_FragCoord.xy / resolution.xy;\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'\tgl_FragColor = texture2D( passThruTexture, uv );\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'}\\n';\n\n\t\t}\n\n\t}\n\n}\n\nexport { GPUComputationRenderer };\n","import {\n\tTriangle,\n\tVector2,\n\tVector3\n} from 'three';\n\n/**\n * Utility class for sampling weighted random points on the surface of a mesh.\n *\n * Building the sampler is a one-time O(n) operation. Once built, any number of\n * random samples may be selected in O(logn) time. Memory usage is O(n).\n *\n * References:\n * - http://www.joesfer.com/?p=84\n * - https://stackoverflow.com/a/4322940/1314762\n */\n\nconst _face = new Triangle();\nconst _color = new Vector3();\nconst _uva = new Vector2(), _uvb = new Vector2(), _uvc = new Vector2();\n\nclass MeshSurfaceSampler {\n\n\tconstructor( mesh ) {\n\n\t\tthis.geometry = mesh.geometry;\n\t\tthis.randomFunction = Math.random;\n\n\t\tthis.indexAttribute = this.geometry.index;\n\t\tthis.positionAttribute = this.geometry.getAttribute( 'position' );\n\t\tthis.normalAttribute = this.geometry.getAttribute( 'normal' );\n\t\tthis.colorAttribute = this.geometry.getAttribute( 'color' );\n\t\tthis.uvAttribute = this.geometry.getAttribute( 'uv' );\n\t\tthis.weightAttribute = null;\n\n\t\tthis.distribution = null;\n\n\t}\n\n\tsetWeightAttribute( name ) {\n\n\t\tthis.weightAttribute = name ? this.geometry.getAttribute( name ) : null;\n\n\t\treturn this;\n\n\t}\n\n\tbuild() {\n\n\t\tconst indexAttribute = this.indexAttribute;\n\t\tconst positionAttribute = this.positionAttribute;\n\t\tconst weightAttribute = this.weightAttribute;\n\n\t\tconst totalFaces = indexAttribute ? ( indexAttribute.count / 3 ) : ( positionAttribute.count / 3 );\n\t\tconst faceWeights = new Float32Array( totalFaces );\n\n\t\t// Accumulate weights for each mesh face.\n\n\t\tfor ( let i = 0; i < totalFaces; i ++ ) {\n\n\t\t\tlet faceWeight = 1;\n\n\t\t\tlet i0 = 3 * i;\n\t\t\tlet i1 = 3 * i + 1;\n\t\t\tlet i2 = 3 * i + 2;\n\n\t\t\tif ( indexAttribute ) {\n\n\t\t\t\ti0 = indexAttribute.getX( i0 );\n\t\t\t\ti1 = indexAttribute.getX( i1 );\n\t\t\t\ti2 = indexAttribute.getX( i2 );\n\n\t\t\t}\n\n\t\t\tif ( weightAttribute ) {\n\n\t\t\t\tfaceWeight = weightAttribute.getX( i0 )\n\t\t\t\t\t+ weightAttribute.getX( i1 )\n\t\t\t\t\t+ weightAttribute.getX( i2 );\n\n\t\t\t}\n\n\t\t\t_face.a.fromBufferAttribute( positionAttribute, i0 );\n\t\t\t_face.b.fromBufferAttribute( positionAttribute, i1 );\n\t\t\t_face.c.fromBufferAttribute( positionAttribute, i2 );\n\t\t\tfaceWeight *= _face.getArea();\n\n\t\t\tfaceWeights[ i ] = faceWeight;\n\n\t\t}\n\n\t\t// Store cumulative total face weights in an array, where weight index\n\t\t// corresponds to face index.\n\n\t\tconst distribution = new Float32Array( totalFaces );\n\t\tlet cumulativeTotal = 0;\n\n\t\tfor ( let i = 0; i < totalFaces; i ++ ) {\n\n\t\t\tcumulativeTotal += faceWeights[ i ];\n\t\t\tdistribution[ i ] = cumulativeTotal;\n\n\t\t}\n\n\t\tthis.distribution = distribution;\n\t\treturn this;\n\n\t}\n\n\tsetRandomGenerator( randomFunction ) {\n\n\t\tthis.randomFunction = randomFunction;\n\t\treturn this;\n\n\t}\n\n\tsample( targetPosition, targetNormal, targetColor, targetUV ) {\n\n\t\tconst faceIndex = this.sampleFaceIndex();\n\t\treturn this.sampleFace( faceIndex, targetPosition, targetNormal, targetColor, targetUV );\n\n\t}\n\n\tsampleFaceIndex() {\n\n\t\tconst cumulativeTotal = this.distribution[ this.distribution.length - 1 ];\n\t\treturn this.binarySearch( this.randomFunction() * cumulativeTotal );\n\n\t}\n\n\tbinarySearch( x ) {\n\n\t\tconst dist = this.distribution;\n\t\tlet start = 0;\n\t\tlet end = dist.length - 1;\n\n\t\tlet index = - 1;\n\n\t\twhile ( start <= end ) {\n\n\t\t\tconst mid = Math.ceil( ( start + end ) / 2 );\n\n\t\t\tif ( mid === 0 || dist[ mid - 1 ] <= x && dist[ mid ] > x ) {\n\n\t\t\t\tindex = mid;\n\n\t\t\t\tbreak;\n\n\t\t\t} else if ( x < dist[ mid ] ) {\n\n\t\t\t\tend = mid - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstart = mid + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn index;\n\n\t}\n\n\tsampleFace( faceIndex, targetPosition, targetNormal, targetColor, targetUV ) {\n\n\t\tlet u = this.randomFunction();\n\t\tlet v = this.randomFunction();\n\n\t\tif ( u + v > 1 ) {\n\n\t\t\tu = 1 - u;\n\t\t\tv = 1 - v;\n\n\t\t}\n\n\t\t// get the vertex attribute indices\n\t\tconst indexAttribute = this.indexAttribute;\n\t\tlet i0 = faceIndex * 3;\n\t\tlet i1 = faceIndex * 3 + 1;\n\t\tlet i2 = faceIndex * 3 + 2;\n\t\tif ( indexAttribute ) {\n\n\t\t\ti0 = indexAttribute.getX( i0 );\n\t\t\ti1 = indexAttribute.getX( i1 );\n\t\t\ti2 = indexAttribute.getX( i2 );\n\n\t\t}\n\n\t\t_face.a.fromBufferAttribute( this.positionAttribute, i0 );\n\t\t_face.b.fromBufferAttribute( this.positionAttribute, i1 );\n\t\t_face.c.fromBufferAttribute( this.positionAttribute, i2 );\n\n\t\ttargetPosition\n\t\t\t.set( 0, 0, 0 )\n\t\t\t.addScaledVector( _face.a, u )\n\t\t\t.addScaledVector( _face.b, v )\n\t\t\t.addScaledVector( _face.c, 1 - ( u + v ) );\n\n\t\tif ( targetNormal !== undefined ) {\n\n\t\t\tif ( this.normalAttribute !== undefined ) {\n\n\t\t\t\t_face.a.fromBufferAttribute( this.normalAttribute, i0 );\n\t\t\t\t_face.b.fromBufferAttribute( this.normalAttribute, i1 );\n\t\t\t\t_face.c.fromBufferAttribute( this.normalAttribute, i2 );\n\t\t\t\ttargetNormal.set( 0, 0, 0 ).addScaledVector( _face.a, u ).addScaledVector( _face.b, v ).addScaledVector( _face.c, 1 - ( u + v ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\t_face.getNormal( targetNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetColor !== undefined && this.colorAttribute !== undefined ) {\n\n\t\t\t_face.a.fromBufferAttribute( this.colorAttribute, i0 );\n\t\t\t_face.b.fromBufferAttribute( this.colorAttribute, i1 );\n\t\t\t_face.c.fromBufferAttribute( this.colorAttribute, i2 );\n\n\t\t\t_color\n\t\t\t\t.set( 0, 0, 0 )\n\t\t\t\t.addScaledVector( _face.a, u )\n\t\t\t\t.addScaledVector( _face.b, v )\n\t\t\t\t.addScaledVector( _face.c, 1 - ( u + v ) );\n\n\t\t\ttargetColor.r = _color.x;\n\t\t\ttargetColor.g = _color.y;\n\t\t\ttargetColor.b = _color.z;\n\n\t\t}\n\n\t\tif ( targetUV !== undefined && this.uvAttribute !== undefined ) {\n\n\t\t\t_uva.fromBufferAttribute( this.uvAttribute, i0 );\n\t\t\t_uvb.fromBufferAttribute( this.uvAttribute, i1 );\n\t\t\t_uvc.fromBufferAttribute( this.uvAttribute, i2 );\n\t\t\ttargetUV.set( 0, 0 ).addScaledVector( _uva, u ).addScaledVector( _uvb, v ).addScaledVector( _uvc, 1 - ( u + v ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { MeshSurfaceSampler };\n","import {\n\tLine3,\n\tPlane,\n\tTriangle,\n\tVector3\n} from 'three';\n\n/**\n * Ported from: https://github.com/maurizzzio/quickhull3d/ by Mauricio Poppe (https://github.com/maurizzzio)\n */\n\nconst Visible = 0;\nconst Deleted = 1;\n\nconst _v1 = new Vector3();\nconst _line3 = new Line3();\nconst _plane = new Plane();\nconst _closestPoint = new Vector3();\nconst _triangle = new Triangle();\n\nclass ConvexHull {\n\n\tconstructor() {\n\n\t\tthis.tolerance = - 1;\n\n\t\tthis.faces = []; // the generated faces of the convex hull\n\t\tthis.newFaces = []; // this array holds the faces that are generated within a single iteration\n\n\t\t// the vertex lists work as follows:\n\t\t//\n\t\t// let 'a' and 'b' be 'Face' instances\n\t\t// let 'v' be points wrapped as instance of 'Vertex'\n\t\t//\n\t\t//     [v, v, ..., v, v, v, ...]\n\t\t//      ^             ^\n\t\t//      |             |\n\t\t//  a.outside     b.outside\n\t\t//\n\t\tthis.assigned = new VertexList();\n\t\tthis.unassigned = new VertexList();\n\n\t\tthis.vertices = []; \t// vertices of the hull (internal representation of given geometry data)\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\t// The algorithm needs at least four points.\n\n\t\tif ( points.length >= 4 ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tthis.vertices.push( new VertexNode( points[ i ] ) );\n\n\t\t\t}\n\n\t\t\tthis.compute();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tconst points = [];\n\n\t\tobject.updateMatrixWorld( true );\n\n\t\tobject.traverse( function ( node ) {\n\n\t\t\tconst geometry = node.geometry;\n\n\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\tconst attribute = geometry.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst point = new Vector3();\n\n\t\t\t\t\t\tpoint.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\tpoints.push( point );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this.setFromPoints( points );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst faces = this.faces;\n\n\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\t// compute signed distance and check on what half space the point lies\n\n\t\t\tif ( face.distanceToPoint( point ) > this.tolerance ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectRay( ray, target ) {\n\n\t\t// based on \"Fast Ray-Convex Polyhedron Intersection\" by Eric Haines, GRAPHICS GEMS II\n\n\t\tconst faces = this.faces;\n\n\t\tlet tNear = - Infinity;\n\t\tlet tFar = Infinity;\n\n\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\t// interpret faces as planes for the further computation\n\n\t\t\tconst vN = face.distanceToPoint( ray.origin );\n\t\t\tconst vD = face.normal.dot( ray.direction );\n\n\t\t\t// if the origin is on the positive side of a plane (so the plane can \"see\" the origin) and\n\t\t\t// the ray is turned away or parallel to the plane, there is no intersection\n\n\t\t\tif ( vN > 0 && vD >= 0 ) return null;\n\n\t\t\t// compute the distance from the ray’s origin to the intersection with the plane\n\n\t\t\tconst t = ( vD !== 0 ) ? ( - vN / vD ) : 0;\n\n\t\t\t// only proceed if the distance is positive. a negative distance means the intersection point\n\t\t\t// lies \"behind\" the origin\n\n\t\t\tif ( t <= 0 ) continue;\n\n\t\t\t// now categorized plane as front-facing or back-facing\n\n\t\t\tif ( vD > 0 ) {\n\n\t\t\t\t// plane faces away from the ray, so this plane is a back-face\n\n\t\t\t\ttFar = Math.min( t, tFar );\n\n\t\t\t} else {\n\n\t\t\t\t// front-face\n\n\t\t\t\ttNear = Math.max( t, tNear );\n\n\t\t\t}\n\n\t\t\tif ( tNear > tFar ) {\n\n\t\t\t\t// if tNear ever is greater than tFar, the ray must miss the convex hull\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// evaluate intersection point\n\n\t\t// always try tNear first since its the closer intersection point\n\n\t\tif ( tNear !== - Infinity ) {\n\n\t\t\tray.at( tNear, target );\n\n\t\t} else {\n\n\t\t\tray.at( tFar, target );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tintersectsRay( ray ) {\n\n\t\treturn this.intersectRay( ray, _v1 ) !== null;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.faces = [];\n\t\tthis.vertices = [];\n\n\t\treturn this;\n\n\t}\n\n\t// Adds a vertex to the 'assigned' list of vertices and assigns it to the given face\n\n\taddVertexToFace( vertex, face ) {\n\n\t\tvertex.face = face;\n\n\t\tif ( face.outside === null ) {\n\n\t\t\tthis.assigned.append( vertex );\n\n\t\t} else {\n\n\t\t\tthis.assigned.insertBefore( face.outside, vertex );\n\n\t\t}\n\n\t\tface.outside = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t// Removes a vertex from the 'assigned' list of vertices and from the given face\n\n\tremoveVertexFromFace( vertex, face ) {\n\n\t\tif ( vertex === face.outside ) {\n\n\t\t\t// fix face.outside link\n\n\t\t\tif ( vertex.next !== null && vertex.next.face === face ) {\n\n\t\t\t\t// face has at least 2 outside vertices, move the 'outside' reference\n\n\t\t\t\tface.outside = vertex.next;\n\n\t\t\t} else {\n\n\t\t\t\t// vertex was the only outside vertex that face had\n\n\t\t\t\tface.outside = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.assigned.remove( vertex );\n\n\t\treturn this;\n\n\t}\n\n\t// Removes all the visible vertices that a given face is able to see which are stored in the 'assigned' vertex list\n\n\tremoveAllVerticesFromFace( face ) {\n\n\t\tif ( face.outside !== null ) {\n\n\t\t\t// reference to the first and last vertex of this face\n\n\t\t\tconst start = face.outside;\n\t\t\tlet end = face.outside;\n\n\t\t\twhile ( end.next !== null && end.next.face === face ) {\n\n\t\t\t\tend = end.next;\n\n\t\t\t}\n\n\t\t\tthis.assigned.removeSubList( start, end );\n\n\t\t\t// fix references\n\n\t\t\tstart.prev = end.next = null;\n\t\t\tface.outside = null;\n\n\t\t\treturn start;\n\n\t\t}\n\n\t}\n\n\t// Removes all the visible vertices that 'face' is able to see\n\n\tdeleteFaceVertices( face, absorbingFace ) {\n\n\t\tconst faceVertices = this.removeAllVerticesFromFace( face );\n\n\t\tif ( faceVertices !== undefined ) {\n\n\t\t\tif ( absorbingFace === undefined ) {\n\n\t\t\t\t// mark the vertices to be reassigned to some other face\n\n\t\t\t\tthis.unassigned.appendChain( faceVertices );\n\n\n\t\t\t} else {\n\n\t\t\t\t// if there's an absorbing face try to assign as many vertices as possible to it\n\n\t\t\t\tlet vertex = faceVertices;\n\n\t\t\t\tdo {\n\n\t\t\t\t\t// we need to buffer the subsequent vertex at this point because the 'vertex.next' reference\n\t\t\t\t\t// will be changed by upcoming method calls\n\n\t\t\t\t\tconst nextVertex = vertex.next;\n\n\t\t\t\t\tconst distance = absorbingFace.distanceToPoint( vertex.point );\n\n\t\t\t\t\t// check if 'vertex' is able to see 'absorbingFace'\n\n\t\t\t\t\tif ( distance > this.tolerance ) {\n\n\t\t\t\t\t\tthis.addVertexToFace( vertex, absorbingFace );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.unassigned.append( vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// now assign next vertex\n\n\t\t\t\t\tvertex = nextVertex;\n\n\t\t\t\t} while ( vertex !== null );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Reassigns as many vertices as possible from the unassigned list to the new faces\n\n\tresolveUnassignedPoints( newFaces ) {\n\n\t\tif ( this.unassigned.isEmpty() === false ) {\n\n\t\t\tlet vertex = this.unassigned.first();\n\n\t\t\tdo {\n\n\t\t\t\t// buffer 'next' reference, see .deleteFaceVertices()\n\n\t\t\t\tconst nextVertex = vertex.next;\n\n\t\t\t\tlet maxDistance = this.tolerance;\n\n\t\t\t\tlet maxFace = null;\n\n\t\t\t\tfor ( let i = 0; i < newFaces.length; i ++ ) {\n\n\t\t\t\t\tconst face = newFaces[ i ];\n\n\t\t\t\t\tif ( face.mark === Visible ) {\n\n\t\t\t\t\t\tconst distance = face.distanceToPoint( vertex.point );\n\n\t\t\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\t\t\tmaxFace = face;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( maxDistance > 1000 * this.tolerance ) break;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// 'maxFace' can be null e.g. if there are identical vertices\n\n\t\t\t\tif ( maxFace !== null ) {\n\n\t\t\t\t\tthis.addVertexToFace( vertex, maxFace );\n\n\t\t\t\t}\n\n\t\t\t\tvertex = nextVertex;\n\n\t\t\t} while ( vertex !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Computes the extremes of a simplex which will be the initial hull\n\n\tcomputeExtremes() {\n\n\t\tconst min = new Vector3();\n\t\tconst max = new Vector3();\n\n\t\tconst minVertices = [];\n\t\tconst maxVertices = [];\n\n\t\t// initially assume that the first vertex is the min/max\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tminVertices[ i ] = maxVertices[ i ] = this.vertices[ 0 ];\n\n\t\t}\n\n\t\tmin.copy( this.vertices[ 0 ].point );\n\t\tmax.copy( this.vertices[ 0 ].point );\n\n\t\t// compute the min/max vertex on all six directions\n\n\t\tfor ( let i = 0, l = this.vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = this.vertices[ i ];\n\t\t\tconst point = vertex.point;\n\n\t\t\t// update the min coordinates\n\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\tif ( point.getComponent( j ) < min.getComponent( j ) ) {\n\n\t\t\t\t\tmin.setComponent( j, point.getComponent( j ) );\n\t\t\t\t\tminVertices[ j ] = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update the max coordinates\n\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\tif ( point.getComponent( j ) > max.getComponent( j ) ) {\n\n\t\t\t\t\tmax.setComponent( j, point.getComponent( j ) );\n\t\t\t\t\tmaxVertices[ j ] = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// use min/max vectors to compute an optimal epsilon\n\n\t\tthis.tolerance = 3 * Number.EPSILON * (\n\t\t\tMath.max( Math.abs( min.x ), Math.abs( max.x ) ) +\n\t\t\tMath.max( Math.abs( min.y ), Math.abs( max.y ) ) +\n\t\t\tMath.max( Math.abs( min.z ), Math.abs( max.z ) )\n\t\t);\n\n\t\treturn { min: minVertices, max: maxVertices };\n\n\t}\n\n\t// Computes the initial simplex assigning to its faces all the points\n\t// that are candidates to form part of the hull\n\n\tcomputeInitialHull() {\n\n\t\tconst vertices = this.vertices;\n\t\tconst extremes = this.computeExtremes();\n\t\tconst min = extremes.min;\n\t\tconst max = extremes.max;\n\n\t\t// 1. Find the two vertices 'v0' and 'v1' with the greatest 1d separation\n\t\t// (max.x - min.x)\n\t\t// (max.y - min.y)\n\t\t// (max.z - min.z)\n\n\t\tlet maxDistance = 0;\n\t\tlet index = 0;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst distance = max[ i ].point.getComponent( i ) - min[ i ].point.getComponent( i );\n\n\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\tmaxDistance = distance;\n\t\t\t\tindex = i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst v0 = min[ index ];\n\t\tconst v1 = max[ index ];\n\t\tlet v2;\n\t\tlet v3;\n\n\t\t// 2. The next vertex 'v2' is the one farthest to the line formed by 'v0' and 'v1'\n\n\t\tmaxDistance = 0;\n\t\t_line3.set( v0.point, v1.point );\n\n\t\tfor ( let i = 0, l = this.vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = vertices[ i ];\n\n\t\t\tif ( vertex !== v0 && vertex !== v1 ) {\n\n\t\t\t\t_line3.closestPointToPoint( vertex.point, true, _closestPoint );\n\n\t\t\t\tconst distance = _closestPoint.distanceToSquared( vertex.point );\n\n\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\tv2 = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// 3. The next vertex 'v3' is the one farthest to the plane 'v0', 'v1', 'v2'\n\n\t\tmaxDistance = - 1;\n\t\t_plane.setFromCoplanarPoints( v0.point, v1.point, v2.point );\n\n\t\tfor ( let i = 0, l = this.vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = vertices[ i ];\n\n\t\t\tif ( vertex !== v0 && vertex !== v1 && vertex !== v2 ) {\n\n\t\t\t\tconst distance = Math.abs( _plane.distanceToPoint( vertex.point ) );\n\n\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\tv3 = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst faces = [];\n\n\t\tif ( _plane.distanceToPoint( v3.point ) < 0 ) {\n\n\t\t\t// the face is not able to see the point so 'plane.normal' is pointing outside the tetrahedron\n\n\t\t\tfaces.push(\n\t\t\t\tFace.create( v0, v1, v2 ),\n\t\t\t\tFace.create( v3, v1, v0 ),\n\t\t\t\tFace.create( v3, v2, v1 ),\n\t\t\t\tFace.create( v3, v0, v2 )\n\t\t\t);\n\n\t\t\t// set the twin edge\n\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\tconst j = ( i + 1 ) % 3;\n\n\t\t\t\t// join face[ i ] i > 0, with the first face\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 2 ).setTwin( faces[ 0 ].getEdge( j ) );\n\n\t\t\t\t// join face[ i ] with face[ i + 1 ], 1 <= i <= 3\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 1 ).setTwin( faces[ j + 1 ].getEdge( 0 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// the face is able to see the point so 'plane.normal' is pointing inside the tetrahedron\n\n\t\t\tfaces.push(\n\t\t\t\tFace.create( v0, v2, v1 ),\n\t\t\t\tFace.create( v3, v0, v1 ),\n\t\t\t\tFace.create( v3, v1, v2 ),\n\t\t\t\tFace.create( v3, v2, v0 )\n\t\t\t);\n\n\t\t\t// set the twin edge\n\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\tconst j = ( i + 1 ) % 3;\n\n\t\t\t\t// join face[ i ] i > 0, with the first face\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 2 ).setTwin( faces[ 0 ].getEdge( ( 3 - i ) % 3 ) );\n\n\t\t\t\t// join face[ i ] with face[ i + 1 ]\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 0 ).setTwin( faces[ j + 1 ].getEdge( 1 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// the initial hull is the tetrahedron\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.faces.push( faces[ i ] );\n\n\t\t}\n\n\t\t// initial assignment of vertices to the faces of the tetrahedron\n\n\t\tfor ( let i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = vertices[ i ];\n\n\t\t\tif ( vertex !== v0 && vertex !== v1 && vertex !== v2 && vertex !== v3 ) {\n\n\t\t\t\tmaxDistance = this.tolerance;\n\t\t\t\tlet maxFace = null;\n\n\t\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tconst distance = this.faces[ j ].distanceToPoint( vertex.point );\n\n\t\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\t\tmaxFace = this.faces[ j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( maxFace !== null ) {\n\n\t\t\t\t\tthis.addVertexToFace( vertex, maxFace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Removes inactive faces\n\n\treindexFaces() {\n\n\t\tconst activeFaces = [];\n\n\t\tfor ( let i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\n\t\t\tif ( face.mark === Visible ) {\n\n\t\t\t\tactiveFaces.push( face );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.faces = activeFaces;\n\n\t\treturn this;\n\n\t}\n\n\t// Finds the next vertex to create faces with the current hull\n\n\tnextVertexToAdd() {\n\n\t\t// if the 'assigned' list of vertices is empty, no vertices are left. return with 'undefined'\n\n\t\tif ( this.assigned.isEmpty() === false ) {\n\n\t\t\tlet eyeVertex, maxDistance = 0;\n\n\t\t\t// grap the first available face and start with the first visible vertex of that face\n\n\t\t\tconst eyeFace = this.assigned.first().face;\n\t\t\tlet vertex = eyeFace.outside;\n\n\t\t\t// now calculate the farthest vertex that face can see\n\n\t\t\tdo {\n\n\t\t\t\tconst distance = eyeFace.distanceToPoint( vertex.point );\n\n\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\teyeVertex = vertex;\n\n\t\t\t\t}\n\n\t\t\t\tvertex = vertex.next;\n\n\t\t\t} while ( vertex !== null && vertex.face === eyeFace );\n\n\t\t\treturn eyeVertex;\n\n\t\t}\n\n\t}\n\n\t// Computes a chain of half edges in CCW order called the 'horizon'.\n\t// For an edge to be part of the horizon it must join a face that can see\n\t// 'eyePoint' and a face that cannot see 'eyePoint'.\n\n\tcomputeHorizon( eyePoint, crossEdge, face, horizon ) {\n\n\t\t// moves face's vertices to the 'unassigned' vertex list\n\n\t\tthis.deleteFaceVertices( face );\n\n\t\tface.mark = Deleted;\n\n\t\tlet edge;\n\n\t\tif ( crossEdge === null ) {\n\n\t\t\tedge = crossEdge = face.getEdge( 0 );\n\n\t\t} else {\n\n\t\t\t// start from the next edge since 'crossEdge' was already analyzed\n\t\t\t// (actually 'crossEdge.twin' was the edge who called this method recursively)\n\n\t\t\tedge = crossEdge.next;\n\n\t\t}\n\n\t\tdo {\n\n\t\t\tconst twinEdge = edge.twin;\n\t\t\tconst oppositeFace = twinEdge.face;\n\n\t\t\tif ( oppositeFace.mark === Visible ) {\n\n\t\t\t\tif ( oppositeFace.distanceToPoint( eyePoint ) > this.tolerance ) {\n\n\t\t\t\t\t// the opposite face can see the vertex, so proceed with next edge\n\n\t\t\t\t\tthis.computeHorizon( eyePoint, twinEdge, oppositeFace, horizon );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// the opposite face can't see the vertex, so this edge is part of the horizon\n\n\t\t\t\t\thorizon.push( edge );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tedge = edge.next;\n\n\t\t} while ( edge !== crossEdge );\n\n\t\treturn this;\n\n\t}\n\n\t// Creates a face with the vertices 'eyeVertex.point', 'horizonEdge.tail' and 'horizonEdge.head' in CCW order\n\n\taddAdjoiningFace( eyeVertex, horizonEdge ) {\n\n\t\t// all the half edges are created in ccw order thus the face is always pointing outside the hull\n\n\t\tconst face = Face.create( eyeVertex, horizonEdge.tail(), horizonEdge.head() );\n\n\t\tthis.faces.push( face );\n\n\t\t// join face.getEdge( - 1 ) with the horizon's opposite edge face.getEdge( - 1 ) = face.getEdge( 2 )\n\n\t\tface.getEdge( - 1 ).setTwin( horizonEdge.twin );\n\n\t\treturn face.getEdge( 0 ); // the half edge whose vertex is the eyeVertex\n\n\n\t}\n\n\t//  Adds 'horizon.length' faces to the hull, each face will be linked with the\n\t//  horizon opposite face and the face on the left/right\n\n\taddNewFaces( eyeVertex, horizon ) {\n\n\t\tthis.newFaces = [];\n\n\t\tlet firstSideEdge = null;\n\t\tlet previousSideEdge = null;\n\n\t\tfor ( let i = 0; i < horizon.length; i ++ ) {\n\n\t\t\tconst horizonEdge = horizon[ i ];\n\n\t\t\t// returns the right side edge\n\n\t\t\tconst sideEdge = this.addAdjoiningFace( eyeVertex, horizonEdge );\n\n\t\t\tif ( firstSideEdge === null ) {\n\n\t\t\t\tfirstSideEdge = sideEdge;\n\n\t\t\t} else {\n\n\t\t\t\t// joins face.getEdge( 1 ) with previousFace.getEdge( 0 )\n\n\t\t\t\tsideEdge.next.setTwin( previousSideEdge );\n\n\t\t\t}\n\n\t\t\tthis.newFaces.push( sideEdge.face );\n\t\t\tpreviousSideEdge = sideEdge;\n\n\t\t}\n\n\t\t// perform final join of new faces\n\n\t\tfirstSideEdge.next.setTwin( previousSideEdge );\n\n\t\treturn this;\n\n\t}\n\n\t// Adds a vertex to the hull\n\n\taddVertexToHull( eyeVertex ) {\n\n\t\tconst horizon = [];\n\n\t\tthis.unassigned.clear();\n\n\t\t// remove 'eyeVertex' from 'eyeVertex.face' so that it can't be added to the 'unassigned' vertex list\n\n\t\tthis.removeVertexFromFace( eyeVertex, eyeVertex.face );\n\n\t\tthis.computeHorizon( eyeVertex.point, null, eyeVertex.face, horizon );\n\n\t\tthis.addNewFaces( eyeVertex, horizon );\n\n\t\t// reassign 'unassigned' vertices to the new faces\n\n\t\tthis.resolveUnassignedPoints( this.newFaces );\n\n\t\treturn\tthis;\n\n\t}\n\n\tcleanup() {\n\n\t\tthis.assigned.clear();\n\t\tthis.unassigned.clear();\n\t\tthis.newFaces = [];\n\n\t\treturn this;\n\n\t}\n\n\tcompute() {\n\n\t\tlet vertex;\n\n\t\tthis.computeInitialHull();\n\n\t\t// add all available vertices gradually to the hull\n\n\t\twhile ( ( vertex = this.nextVertexToAdd() ) !== undefined ) {\n\n\t\t\tthis.addVertexToHull( vertex );\n\n\t\t}\n\n\t\tthis.reindexFaces();\n\n\t\tthis.cleanup();\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nclass Face {\n\n\tconstructor() {\n\n\t\tthis.normal = new Vector3();\n\t\tthis.midpoint = new Vector3();\n\t\tthis.area = 0;\n\n\t\tthis.constant = 0; // signed distance from face to the origin\n\t\tthis.outside = null; // reference to a vertex in a vertex list this face can see\n\t\tthis.mark = Visible;\n\t\tthis.edge = null;\n\n\t}\n\n\tstatic create( a, b, c ) {\n\n\t\tconst face = new Face();\n\n\t\tconst e0 = new HalfEdge( a, face );\n\t\tconst e1 = new HalfEdge( b, face );\n\t\tconst e2 = new HalfEdge( c, face );\n\n\t\t// join edges\n\n\t\te0.next = e2.prev = e1;\n\t\te1.next = e0.prev = e2;\n\t\te2.next = e1.prev = e0;\n\n\t\t// main half edge reference\n\n\t\tface.edge = e0;\n\n\t\treturn face.compute();\n\n\t}\n\n\tgetEdge( i ) {\n\n\t\tlet edge = this.edge;\n\n\t\twhile ( i > 0 ) {\n\n\t\t\tedge = edge.next;\n\t\t\ti --;\n\n\t\t}\n\n\t\twhile ( i < 0 ) {\n\n\t\t\tedge = edge.prev;\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn edge;\n\n\t}\n\n\tcompute() {\n\n\t\tconst a = this.edge.tail();\n\t\tconst b = this.edge.head();\n\t\tconst c = this.edge.next.head();\n\n\t\t_triangle.set( a.point, b.point, c.point );\n\n\t\t_triangle.getNormal( this.normal );\n\t\t_triangle.getMidpoint( this.midpoint );\n\t\tthis.area = _triangle.getArea();\n\n\t\tthis.constant = this.normal.dot( this.midpoint );\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) - this.constant;\n\n\t}\n\n}\n\n// Entity for a Doubly-Connected Edge List (DCEL).\n\nclass HalfEdge {\n\n\n\tconstructor( vertex, face ) {\n\n\t\tthis.vertex = vertex;\n\t\tthis.prev = null;\n\t\tthis.next = null;\n\t\tthis.twin = null;\n\t\tthis.face = face;\n\n\t}\n\n\thead() {\n\n\t\treturn this.vertex;\n\n\t}\n\n\ttail() {\n\n\t\treturn this.prev ? this.prev.vertex : null;\n\n\t}\n\n\tlength() {\n\n\t\tconst head = this.head();\n\t\tconst tail = this.tail();\n\n\t\tif ( tail !== null ) {\n\n\t\t\treturn tail.point.distanceTo( head.point );\n\n\t\t}\n\n\t\treturn - 1;\n\n\t}\n\n\tlengthSquared() {\n\n\t\tconst head = this.head();\n\t\tconst tail = this.tail();\n\n\t\tif ( tail !== null ) {\n\n\t\t\treturn tail.point.distanceToSquared( head.point );\n\n\t\t}\n\n\t\treturn - 1;\n\n\t}\n\n\tsetTwin( edge ) {\n\n\t\tthis.twin = edge;\n\t\tedge.twin = this;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// A vertex as a double linked list node.\n\nclass VertexNode {\n\n\tconstructor( point ) {\n\n\t\tthis.point = point;\n\t\tthis.prev = null;\n\t\tthis.next = null;\n\t\tthis.face = null; // the face that is able to see this vertex\n\n\t}\n\n}\n\n// A double linked list that contains vertex nodes.\n\nclass VertexList {\n\n\tconstructor() {\n\n\t\tthis.head = null;\n\t\tthis.tail = null;\n\n\t}\n\n\tfirst() {\n\n\t\treturn this.head;\n\n\t}\n\n\tlast() {\n\n\t\treturn this.tail;\n\n\t}\n\n\tclear() {\n\n\t\tthis.head = this.tail = null;\n\n\t\treturn this;\n\n\t}\n\n\t// Inserts a vertex before the target vertex\n\n\tinsertBefore( target, vertex ) {\n\n\t\tvertex.prev = target.prev;\n\t\tvertex.next = target;\n\n\t\tif ( vertex.prev === null ) {\n\n\t\t\tthis.head = vertex;\n\n\t\t} else {\n\n\t\t\tvertex.prev.next = vertex;\n\n\t\t}\n\n\t\ttarget.prev = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t// Inserts a vertex after the target vertex\n\n\tinsertAfter( target, vertex ) {\n\n\t\tvertex.prev = target;\n\t\tvertex.next = target.next;\n\n\t\tif ( vertex.next === null ) {\n\n\t\t\tthis.tail = vertex;\n\n\t\t} else {\n\n\t\t\tvertex.next.prev = vertex;\n\n\t\t}\n\n\t\ttarget.next = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t// Appends a vertex to the end of the linked list\n\n\tappend( vertex ) {\n\n\t\tif ( this.head === null ) {\n\n\t\t\tthis.head = vertex;\n\n\t\t} else {\n\n\t\t\tthis.tail.next = vertex;\n\n\t\t}\n\n\t\tvertex.prev = this.tail;\n\t\tvertex.next = null; // the tail has no subsequent vertex\n\n\t\tthis.tail = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t// Appends a chain of vertices where 'vertex' is the head.\n\n\tappendChain( vertex ) {\n\n\t\tif ( this.head === null ) {\n\n\t\t\tthis.head = vertex;\n\n\t\t} else {\n\n\t\t\tthis.tail.next = vertex;\n\n\t\t}\n\n\t\tvertex.prev = this.tail;\n\n\t\t// ensure that the 'tail' reference points to the last vertex of the chain\n\n\t\twhile ( vertex.next !== null ) {\n\n\t\t\tvertex = vertex.next;\n\n\t\t}\n\n\t\tthis.tail = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t// Removes a vertex from the linked list\n\n\tremove( vertex ) {\n\n\t\tif ( vertex.prev === null ) {\n\n\t\t\tthis.head = vertex.next;\n\n\t\t} else {\n\n\t\t\tvertex.prev.next = vertex.next;\n\n\t\t}\n\n\t\tif ( vertex.next === null ) {\n\n\t\t\tthis.tail = vertex.prev;\n\n\t\t} else {\n\n\t\t\tvertex.next.prev = vertex.prev;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Removes a list of vertices whose 'head' is 'a' and whose 'tail' is b\n\n\tremoveSubList( a, b ) {\n\n\t\tif ( a.prev === null ) {\n\n\t\t\tthis.head = b.next;\n\n\t\t} else {\n\n\t\t\ta.prev.next = b.next;\n\n\t\t}\n\n\t\tif ( b.next === null ) {\n\n\t\t\tthis.tail = a.prev;\n\n\t\t} else {\n\n\t\t\tb.next.prev = a.prev;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn this.head === null;\n\n\t}\n\n}\n\nexport { ConvexHull, Face, HalfEdge, VertexNode, VertexList };\n","import {IViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {Importer} from '../../assetmanager'\n\nexport abstract class BaseImporterPlugin implements IViewerPluginSync {\n    declare ['constructor']: typeof BaseImporterPlugin\n    public static readonly PluginType: string\n\n    protected abstract _importer: Importer\n\n    toJSON: any = null // disable serialization\n\n    onAdded(viewer: ThreeViewer) {\n        viewer.assetManager.importer.addImporter(this._importer)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.assetManager.importer.removeImporter(this._importer)\n    }\n\n    dispose() {\n        return\n    }\n\n}\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {IGeometry, iGeometryCommons, IMaterial, IScene, ISceneEventMap, Mesh2, PhysicalMaterial} from '../../core'\nimport {BufferAttribute, BufferGeometry, Euler, InterleavedBufferAttribute, PlaneGeometry, Vector3, Event} from 'three'\nimport {onChange, onChange2, serialize} from 'ts-browser-helpers'\nimport {bindToValue, OrbitControls3} from '../../three'\nimport {uiConfig, uiFolderContainer, uiNumber, uiToggle} from 'uiconfig.js'\n\n@uiFolderContainer('Ground Plane')\nexport class BaseGroundPlugin<TE extends AViewerPluginEventMap = AViewerPluginEventMap> extends AViewerPluginSync<TE> {\n    public static readonly PluginType: string = 'BaseGroundPlugin'\n    public static readonly OldPluginType: string = 'Ground'\n\n    get enabled() {\n        return this.visible\n    }\n\n    set enabled(value) {\n        this.visible = value\n    }\n\n    protected _geometry: IGeometry&PlaneGeometry\n\n    protected _mesh: Mesh2<IGeometry&PlaneGeometry, IMaterial>\n    protected _defaultMaterial: IMaterial\n    private _transformNeedRefresh = true\n\n    constructor() {\n        super()\n        this._refreshMaterial = this._refreshMaterial.bind(this)\n        this._refreshTransform = this._refreshTransform.bind(this)\n        this._refreshCameraLimits = this._refreshCameraLimits.bind(this)\n        this.refresh = this.refresh.bind(this)\n        this._refresh2 = this._refresh2.bind(this)\n        this._onSceneUpdate = this._onSceneUpdate.bind(this)\n        this._preRender = this._preRender.bind(this)\n        this._postFrame = this._postFrame.bind(this)\n        this._geometry = iGeometryCommons.upgradeGeometry.call(new PlaneGeometry(1, 1, 1, 1))\n        this._geometry.attributes.uv2 = (this._geometry.attributes.uv as any as BufferAttribute | InterleavedBufferAttribute).clone()\n        this._geometry.attributes.uv2.needsUpdate = true\n        this._mesh = this._createMesh()\n        this._mesh.userData.physicsMass = 0\n        this._mesh.userData.physicsBodyType = 'static'\n        this._mesh.userData.userSelectable = false\n        this._mesh.userData.isGroundMesh = true\n        this._mesh.castShadow = true\n        this._mesh.receiveShadow = true\n        if (!this._mesh.name) this._mesh.name = 'Ground Plane'\n        this._mesh.visible = false\n        this._defaultMaterial = this._mesh.material\n        this.refresh()\n    }\n\n    @uiToggle('Visible')\n    @onChange(BaseGroundPlugin.prototype.refreshTransform)\n    @serialize() visible = true\n\n    @uiNumber('Size')\n    @onChange2(BaseGroundPlugin.prototype._onSceneUpdate)\n    @serialize() size = 8\n\n    @uiNumber('Height (yOffset)')\n    @onChange2(BaseGroundPlugin.prototype._onSceneUpdate)\n    @serialize() yOffset = 0\n\n    @uiToggle('Render to Depth')\n    @onChange(BaseGroundPlugin.prototype._refresh2)\n    @serialize() renderToDepth = true\n\n    /**\n     * If false, the ground will not be tonemapped in post processing.\n     * note: this will only work when {@link GBufferPlugin} is being used. Also needs {@link renderToDepth} to be true.\n     */\n    @uiToggle('Tonemap Ground')\n    @onChange(BaseGroundPlugin.prototype._refresh2)\n    @serialize() tonemapGround = true\n\n    /**\n     * If true, the camera will be limited to not go below the ground.\n     * note: this will only work when {@link OrbitControls3} or three.js OrbitControls are being used.\n     */\n    @uiToggle('Limit Camera Above Ground')\n    @onChange(BaseGroundPlugin.prototype._refreshCameraLimits)\n    @serialize() limitCameraAboveGround = false\n\n    @uiToggle('Auto Adjust Transform')\n    @onChange(BaseGroundPlugin.prototype.refreshTransform)\n    @serialize() autoAdjustTransform = true\n\n    @serialize('material')\n    @uiConfig()\n    @bindToValue({obj: 'mesh', key: 'material', allowUndefined: true})\n    protected _material?: IMaterial\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n        // if (viewer.getPlugin('TweakpaneUi')) console.error('TweakpaneUiPlugin must be added after Ground Plugin')\n\n        viewer.scene.addObject(this._mesh, {addToRoot: true})\n        viewer.scene.addEventListener('sceneUpdate', this._onSceneUpdate) // todo: refresh when update...\n        // todo use object3dmanager here instead of addSceneObject\n        viewer.scene.addEventListener('addSceneObject', this._onSceneUpdate)\n        viewer.addEventListener('preRender', this._preRender)\n        viewer.addEventListener('postFrame', this._postFrame)\n        this.refresh()\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        this._mesh?.dispose(true)\n        this._removeMaterial()\n        viewer.scene.removeEventListener('sceneUpdate', this._onSceneUpdate)\n        viewer.scene.removeEventListener('addSceneObject', this._onSceneUpdate)\n        viewer.removeEventListener('postFrame', this._postFrame)\n        viewer.removeEventListener('preRender', this._preRender)\n        return super.onRemove(viewer)\n    }\n\n    protected _postFrame() {\n        if (this._transformNeedRefresh) this._refreshTransform()\n        if (!this._viewer) return\n    }\n\n    protected _preRender() {\n        if (!this._viewer) return\n    }\n\n    dispose(): void {\n        this._removeMaterial()\n        this._geometry.dispose()\n        this._material?.dispose() // todo\n        this._mesh?.dispose?.()\n        super.dispose()\n    }\n\n    protected _removeMaterial() {\n        if (!this._material || this._material === this._defaultMaterial) return\n        // this._manager?.materials?.unregisterMaterial(this._material)\n        this._material.userData.renderToDepth = this._material.userData.__renderToDepth\n        this._material.userData.__renderToDepth = undefined\n        // todo reset gBufferData.tonemapEnabled also\n        this._material = this._defaultMaterial\n    }\n\n    protected _onSceneUpdate(event?: ISceneEventMap['addSceneObject' | 'sceneUpdate'] & Event<'addSceneObject' | 'sceneUpdate', IScene>) {\n        if (event?.object?.assetType === 'widget' || event?.object?.userData?.isWidgetRoot) return\n        if (event?.geometryChanged === false) return\n        if (event?.updateGround !== false)\n            this.refreshTransform()\n    }\n\n    /**\n     * Extra flag for plugins to disable transform refresh like when animating or dragging\n     */\n    enableRefreshTransform = true\n\n    refreshTransform(): void {\n        if (!this.enableRefreshTransform) return\n        this._transformNeedRefresh = true\n    }\n\n    public refresh(): void {\n        if (!this._viewer) return\n        this._refreshMaterial()\n        this.refreshTransform()\n        this._refreshCameraLimits()\n    }\n\n    // because of inheritance breaks onChange\n    private _refresh2(): void {\n        this.refresh()\n    }\n\n\n    private _cameraLimitsSet = false\n    private _cameraLastMaxPolarAngle = Math.PI\n    private _refreshCameraLimits() {\n        const orbit = this._viewer?.scene.mainCamera.controls as OrbitControls3\n        if (!orbit) return\n        if (orbit.maxPolarAngle === undefined) {\n            console.warn('refreshCameraLimits only available with orbit controls.')\n            return\n        }\n        if (this.limitCameraAboveGround) {\n            if (!this._cameraLimitsSet) this._cameraLastMaxPolarAngle = orbit.maxPolarAngle\n            orbit.maxPolarAngle = Math.PI / 2\n            this._cameraLimitsSet = true\n        } else if (this._cameraLimitsSet) {\n            orbit.maxPolarAngle = this._cameraLastMaxPolarAngle\n            this._cameraLimitsSet = false\n        }\n\n    }\n\n    // not serialized. this can be controlled by other plugins like ModelStagePlugin and serialized there\n    useModelBounds = true\n\n    protected _refreshTransform() {\n        if (!this._mesh) return false\n        if (!this._viewer) return false\n        let updated = false\n        if (this.visible !== this._mesh.visible) {\n            this._mesh.visible = this.visible\n            updated = true\n        }\n        if (this.isDisabled()) {\n            if (updated) this._viewer?.scene.setDirty()\n            return false\n        }\n        if (this.autoAdjustTransform) {\n            this._mesh.userData.bboxVisible = false\n\n            const bbox = this.useModelBounds ?\n                this._viewer.scene.getModelBounds(true, true, true) :\n                this._viewer.scene.getBounds(true, true, true)\n\n            this._mesh.userData.bboxVisible = true\n            const v = bbox.getCenter(\n                new Vector3()).sub(new Vector3(0,\n                bbox.getSize(new Vector3()).y / 2 + this.yOffset,\n                0))\n            updated = updated || v.clone().sub(this._mesh.position).length() > 0.0001\n            if (updated) {\n                this._mesh.position.copy(v)\n            }\n        }\n        updated = updated || Math.abs(this._mesh.scale.x - this.size) > 0.0001\n        // todo: check rotation, someone could externally change it\n        if (updated) {\n            this._mesh.scale.setScalar(this.size)\n            // this._mesh.lookAt(new Vector3().fromArray(this._options.up))\n            this._mesh.setRotationFromEuler(new Euler(-Math.PI / 2., 0, this._mesh.rotation.z))\n            this._mesh.matrixWorldNeedsUpdate = true\n            this._mesh.setDirty({refreshScene: false, source: BaseGroundPlugin.PluginType})\n            // this._viewer.scene.setDirty()\n        }\n        this._mesh.visible = this.size >= 0.0001\n        this._transformNeedRefresh = false\n        return true\n    }\n\n\n    protected _createMesh(mesh?: Mesh2<IGeometry&PlaneGeometry, IMaterial>): Mesh2<IGeometry&PlaneGeometry, IMaterial> {\n        if (!mesh) mesh = new Mesh2(this._geometry, this._createMaterial())\n        else mesh.geometry = this._geometry\n        return mesh\n    }\n\n    setGeometry(g?: BufferGeometry) {\n        if (!g) g = this._geometry\n        else if (this._geometry) this._geometry.dispose()\n        if (!g) return\n        this._geometry = g as IGeometry & PlaneGeometry\n        iGeometryCommons.upgradeGeometry.call(this._geometry)\n        if (!this._geometry.attributes.uv2) {\n            this._geometry.attributes.uv2 = (this._geometry.attributes.uv as any as BufferAttribute | InterleavedBufferAttribute).clone()\n            this._geometry.attributes.uv2.needsUpdate = true\n        }\n        if (this._mesh) this._mesh.geometry = this._geometry\n    }\n\n\n    protected _createMaterial(material?: PhysicalMaterial): PhysicalMaterial {\n        if (!material) material = new PhysicalMaterial({\n            name: 'BaseGroundMaterial',\n            color: 0xffffff,\n            roughness: 0.8,\n            metalness: 0.5,\n        })\n        material.userData.runtimeMaterial = true\n        return material\n    }\n\n    protected _refreshMaterial() {\n        if (!this._viewer) return\n        if (this.isDisabled()) return\n        if (!this._material) { // new material\n            // this._removeMaterial()\n            this._material = this._defaultMaterial\n            // const id = this._material?.uuid\n            // if (!id) console.warn('No material found for ground')\n            this._viewer.scene.setDirty()\n            // if (this._mesh && this._material) {\n            //     this._mesh.material = this._material // must be set even if same, for update event handlers.\n            // }\n        }\n        if (this._material.userData.__renderToDepth === undefined) {\n            this._material.userData.__renderToDepth = this._material.userData.renderToDepth\n        }\n        if (this._material.userData.renderToDepth !== this.renderToDepth) {\n            this._material.userData.renderToDepth = this.renderToDepth // required to work with SSR, SSAO etc when the ground is transparent / transmissive\n        }\n        if (!this._material.userData.gBufferData) this._material.userData.gBufferData = {}\n        if (this._material.userData.gBufferData.__tonemapEnabled === undefined) {\n            this._material.userData.gBufferData.__tonemapEnabled = this._material.userData.gBufferData.tonemapEnabled\n        }\n        if (this._material.userData.gBufferData.tonemapEnabled !== this.tonemapGround) {\n            this._material.userData.gBufferData.tonemapEnabled = this.tonemapGround\n        }\n        // this._material.userData.ssaoDisabled = true //todo should be in BakedGroundPlugin\n        // this._material.userData.sscsDisabled = true //todo should be in BakedGroundPlugin\n\n        // if (this._material.userData.__postTonemap === undefined) {\n        //     this._material.userData.__postTonemap = this._material.userData.postTonemap\n        // }\n        // if (this._material.userData.postTonemap !== this.tonemapGround) {\n        //     this._material.userData.postTonemap = this.tonemapGround\n        // }\n        this._viewer.setDirty(this) // todo: something else also?\n        return\n    }\n\n    get material() {\n        return this._material\n    }\n\n    get mesh() {\n        return this._mesh\n    }\n\n    fromJSON(data: any, meta?: any): this | null {\n        if (data.options) {\n            console.error('todo: support old webgi v0 file')\n        }\n        if (!super.fromJSON(data, meta)) return null\n        // if (this._material && this._material.transmission >= 0.01) this._material.transparent = true\n        this.refresh()\n        // Note: baked shadow reset is done in ShadowMapBaker.fromJSON\n        return this\n    }\n\n}\n\ndeclare module '../../core/IScene' {\n    interface ISceneSetDirtyOptions {\n        updateGround?: boolean\n    }\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {ICamera, IScene, ISceneEventMap, TControlsCtor} from '../../core'\nimport {EventListener2} from 'three'\n\nexport abstract class ACameraControlsPlugin extends AViewerPluginSync {\n    readonly enabled = true\n    toJSON: any = undefined\n    protected abstract _controlsCtor: TControlsCtor\n    abstract readonly controlsKey: string\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n        this._registerControls(viewer.scene.mainCamera)\n        viewer.scene.addEventListener('mainCameraChange', this._cameraChanged)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        this._unregisterControls(viewer.scene.mainCamera)\n        viewer.scene.removeEventListener('mainCameraChange', this._cameraChanged)\n        super.onRemove(viewer)\n    }\n\n    private _registerControls(camera?: ICamera) {\n        camera?.setControlsCtor?.(this.controlsKey, this._controlsCtor)\n    }\n\n    private _unregisterControls(camera?: ICamera) {\n        camera?.removeControlsCtor?.(this.controlsKey)\n    }\n\n    private _cameraChanged: EventListener2<'mainCameraChange', ISceneEventMap, IScene> = (e) => {\n        this._unregisterControls(e.lastCamera)\n        this._registerControls(e.camera)\n    }\n}\n","import {createDiv, onChange, serialize} from 'ts-browser-helpers'\nimport {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiToggle} from 'uiconfig.js'\n\nexport abstract class AAssetManagerProcessStatePlugin<TE extends AViewerPluginEventMap = AViewerPluginEventMap> extends AViewerPluginSync<TE> {\n    @uiToggle('Enabled')\n    @onChange(AAssetManagerProcessStatePlugin.prototype._onEnabledChange)\n    @serialize() enabled = true\n\n    protected _mainDiv: HTMLDivElement\n    protected _contentDiv: HTMLDivElement | undefined\n\n    private _onEnabledChange() {\n        if (!this.enabled) this._mainDiv.style.display = 'none'\n    }\n\n    protected constructor(suffix: string, public readonly container?: HTMLElement) {\n        super()\n        this._mainDiv = createDiv({\n            id: 'assetManager' + suffix,\n            addToBody: false,\n            innerHTML: '',\n        })\n        this._contentDiv = createDiv({\n            id: 'assetManager' + suffix + 'Content',\n            addToBody: false,\n            innerHTML: '',\n        })\n        if (!this.enabled) {\n            this._mainDiv.style.display = 'none'\n        }\n        this._mainDiv.appendChild(this._contentDiv)\n        this._onProcessStateUpdate = this._onProcessStateUpdate.bind(this)\n    }\n\n    protected abstract _updateMainDiv(processState: Map<string, {state: string, progress?: number|undefined}>): void\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n\n        ;(this.container ?? viewer.container).appendChild(this._mainDiv)\n        this._updateMainDiv(viewer.assetManager.processState)\n        viewer.assetManager.addEventListener('processStateUpdate', this._onProcessStateUpdate)\n    }\n\n    protected _onProcessStateUpdate() {\n        if (!this._viewer) return\n        this._updateMainDiv(this._viewer.assetManager.processState)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        this._mainDiv.remove()\n        // this._contentDiv?.remove()\n        viewer.assetManager.removeEventListener('processStateUpdate', this._onProcessStateUpdate)\n        return super.onRemove(viewer)\n    }\n}\n","import {Texture, Vector4} from 'three'\nimport {CopyShader} from 'three/examples/jsm/shaders/CopyShader.js'\nimport {ExtendedShaderPass} from './ExtendedShaderPass'\nimport {IPass} from './Pass'\nimport {glsl} from 'ts-browser-helpers'\n\nexport class AddBlendTexturePass extends ExtendedShaderPass implements IPass {\n    constructor(texture?: Texture, maxIntensity = 120) {\n        super({\n            vertexShader: CopyShader.vertexShader,\n            fragmentShader: glsl`\n                uniform vec4 weight;\n                uniform vec4 weight2;\n                varying vec2 vUv;\n                void main() {\n                    vec4 texel = clamp(weight * tDiffuseTexelToLinear ( texture2D( tDiffuse, vUv ) ) + weight2 * tDiffuse2TexelToLinear ( texture2D( tDiffuse2, vUv ) ), vec4(0), vec4(MAX_INTENSITY));\n                    gl_FragColor = texel;\n                    #include <colorspace_fragment>\n                }\n            `,\n            uniforms: {\n                'tDiffuse': {value: null},\n                'tDiffuse2': {value: texture},\n                'weight': {value: new Vector4(1, 1, 1, 1)},\n                'weight2': {value: new Vector4(1, 1, 1, 1)},\n            },\n            defines: {\n                ['MAX_INTENSITY']: maxIntensity,\n            },\n        }, 'tDiffuse', 'tDiffuse2')\n        this.clear = false\n        this.needsSwap = true\n    }\n\n}\n","import {OrthographicCamera, PerspectiveCamera} from 'three'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {onChange, serialize} from 'ts-browser-helpers'\nimport {ICamera, ILight, IObject3D} from '../../core'\nimport {ProgressivePlugin} from './ProgressivePlugin'\n\nexport type TCamera = ICamera & (PerspectiveCamera|OrthographicCamera)\n\n/**\n * SSAA Plugin\n *\n * Jitters the render camera and optionally other cameras in the scene\n * to create a super-sampled anti-aliasing effect.\n * This is done across multiple frames by integrating with the ProgressivePlugin\n * @category Plugins\n */\n@uiFolderContainer('SSAA Plugin')\nexport class SSAAPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'SSAAPlugin'\n\n    @serialize() @uiToggle('Enabled')\n    @onChange(SSAAPlugin.prototype.setDirty)\n        enabled = true\n\n    @serialize() @uiSlider('Renders/Frame', [1, 32], 1)\n    @onChange(SSAAPlugin.prototype.setDirty)\n        rendersPerFrame = 1\n\n    @serialize() @uiToggle('Render Camera')\n    @onChange(SSAAPlugin.prototype.setDirty)\n        jitterRenderCamera = true\n\n    @serialize() @uiToggle('Light Cameras')\n    @onChange(SSAAPlugin.prototype.setDirty)\n        jitterLightCameras = true\n\n    private _hasSetOffsetRC = false\n    private _hasSetOffsetLC = false\n\n    public trackedJitterCameras = new Map<TCamera, {width: number, height: number}>() // todo register other cameras and light shadows cameras when added to the scene and changed.\n\n    dependencies = [ProgressivePlugin]\n\n    constructor(rendersPerFrame = 1) {\n        super()\n        this.rendersPerFrame = rendersPerFrame\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.addEventListener('preRender', this._preRender)\n        viewer.addEventListener('postRender', this._postRender)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n        viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        viewer.removeEventListener('preRender', this._preRender)\n        viewer.removeEventListener('postRender', this._postRender)\n        viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n        return super.onRemove(viewer)\n    }\n\n    setDirty() {\n        if (!this._viewer) return\n        this._viewer.rendersPerFrame = this.rendersPerFrame\n        this._viewer.setDirty()\n        this.uiConfig?.uiRefresh?.(true, 'postFrame')\n    }\n\n    private _objectAdd = (e: {object?: IObject3D})=>{\n        const obj = e.object as ILight\n        if (obj && obj.shadow && obj.shadow.camera && obj.shadow.mapSize) {\n            this.trackedJitterCameras.set(obj.shadow.camera as TCamera, obj.shadow.mapSize)\n        }\n    }\n\n    private _objectRemove = (e: {object?: IObject3D})=>{\n        const obj = e.object as ILight\n        if (obj && obj.shadow && obj.shadow.camera) {\n            const camera = obj.shadow.camera as TCamera\n            this._clearJitter(camera)\n            this.trackedJitterCameras.delete(camera)\n        }\n    }\n\n    private _jitter(camera: TCamera, size: {\n        width: number,\n        height: number\n    }, frameCount: number, main = false) {\n        if (camera.userData.disableJitter) return\n        if (camera.userData.__jittered) {\n            this._viewer?.console.warn('SSAAPlugin: Camera already jittered')\n            return\n        }\n        const sample = {...this.jitterOffsets[frameCount % this.jitterOffsets.length]}\n        // const sample = {...offsets[Math.floor(Math.random() * (offsets.length - 0.001))]}\n        // {\n        //     sample.x += 1 * (Math.random() - 0.5)\n        //     sample.y += 1 * (Math.random() - 0.5)\n        // }\n        const aspect = camera.aspect\n        const height = camera.autoAspect || !main ? size.height : size.width / aspect\n        camera.setViewOffset(size.width, height, sample.x, sample.y, size.width, height)\n        camera.userData.__jittered = true\n    }\n    private _clearJitter(camera: TCamera) {\n        if (!camera.userData.__jittered) return\n        camera.clearViewOffset()\n        delete camera.userData.__jittered\n    }\n\n    private _preRender = ()=> {\n        const v = this._viewer\n        if (!v || !this.enabled || v.renderManager.frameCount <= 1) return\n        this.rendersPerFrame = v.rendersPerFrame // just to sync. todo: should this be here?. ideally there should be a event fired from the viewer when the prop changes\n\n        const cam = v.scene.renderCamera as TCamera\n\n        if (this.jitterRenderCamera) this._jitter(cam, {\n            width: v.renderManager.renderSize.x * v.renderManager.renderScale,\n            height: v.renderManager.renderSize.y * v.renderManager.renderScale,\n        }, v.renderManager.frameCount, true)\n        if (this.jitterLightCameras)\n            this.trackedJitterCameras.entries().forEach((a) => this._jitter(...a, v.renderManager.frameCount))\n\n        this._hasSetOffsetRC = this.jitterRenderCamera\n        this._hasSetOffsetLC = this.jitterLightCameras\n\n        v.renderManager.resetShadows()\n    }\n    private _postRender = ()=> {\n        const v = this._viewer\n        if (!v) return\n        if (this._hasSetOffsetRC) {\n            this._clearJitter(v.scene.renderCamera as TCamera)\n            this._hasSetOffsetRC = false\n        }\n        if (this._hasSetOffsetLC) {\n            this.trackedJitterCameras.keys().forEach((camera) => this._clearJitter(camera))\n            this._hasSetOffsetLC = false\n        }\n    }\n\n    jitterOffsets = [\n        {x: 0, y: 0},\n        {x: -0.5, y: 0},\n        {x: -0.375, y: -0.25},\n        {x: -0.1875, y: -0.125},\n        {x: -0.125, y: -0.375},\n        {x: 0.0625, y: -0.0625},\n        {x: 0.125, y: -0.3125},\n        {x: 0.375, y: -0.4375},\n        {x: 0.3125, y: -0.1875},\n        {x: 0.25, y: 0.0625},\n        {x: 0.4375, y: 0.25},\n        {x: 0.1875, y: 0.3125},\n        {x: 0, y: 0.4375},\n        {x: -0.0625, y: 0.1875},\n        {x: -0.25, y: 0.375},\n        {x: -0.4375, y: 0.5},\n        {x: -0.3125, y: 0.125},\n    ]\n}\n\n\n","import {IUniform, Texture, TextureDataType, UnsignedByteType, WebGLRenderTarget} from 'three'\nimport {IPassID, IPipelinePass} from '../../postprocessing'\nimport {ISerializedConfig, ThreeViewer} from '../../viewer'\nimport {PipelinePassPlugin} from '../base/PipelinePassPlugin'\nimport {uiFolderContainer, uiImage, uiInput} from 'uiconfig.js'\nimport {ICamera, IRenderManager, IScene, IWebGLRenderer} from '../../core'\nimport {AddBlendTexturePass} from '../../postprocessing/AddBlendTexturePass'\nimport {getOrCall, serialize, ValOrFunc} from 'ts-browser-helpers'\nimport {IShaderPropertiesUpdater} from '../../materials'\nimport {SerializationMetaType} from '../../utils'\nimport {SSAAPlugin} from './SSAAPlugin'\n\nexport type ProgressivePluginTarget = WebGLRenderTarget\n\n/**\n * Progressive Plugin\n *\n * Adds a post-render pass to blend the last frame with the current frame.\n * This can be used to create a progressive rendering effect which is useful for progressive shadows, gi, denoising, baking, anti-aliasing, and many other effects.\n * @category Plugins\n */\n@uiFolderContainer('Progressive Plugin')\nexport class ProgressivePlugin\n    extends PipelinePassPlugin<ProgressiveBlendPass, 'progressive'> implements IShaderPropertiesUpdater {\n\n    readonly passId = 'progressive'\n    public static readonly PluginType = 'ProgressivePlugin'\n    public static readonly OldPluginType = 'Progressive'\n\n    /**\n     * Different targets for different render cameras.\n     * Need to save them all here since we need them in the next frame.\n     * @protected\n     */\n    protected _targets = new Map<string, ProgressivePluginTarget>()\n\n    @serialize() @uiInput('Frame count') maxFrameCount: number\n\n    // @uiImage('Last Texture', {readOnly: true}) texture?: Texture\n\n    get texture(): Texture | undefined {\n        return this.target?.texture\n    }\n\n    get target(): ProgressivePluginTarget | undefined {\n        return this._viewer ? this._targets.get(this._viewer.scene.renderCamera.uuid) : undefined\n    }\n\n    getTarget(camera?: ICamera) {\n        return this._viewer ? this._targets.get((camera ? camera : this._viewer.scene.renderCamera).uuid) : undefined\n    }\n\n    get textures() {\n        return this._viewer ? Array.from(this._targets.values()).map(t => t.texture) : []\n    }\n\n    @uiImage('Last Texture', {readOnly: true})\n    get mainTexture() {\n        return this._viewer ? this.getTarget(this._viewer.scene.mainCamera)?.texture : undefined\n    }\n\n    /**\n     * Note - this is not used right now\n     */\n    // @onChange2(ProgressivePlugin.prototype._createTarget)\n    // @uiDropdown('Buffer Type', threeConstMappings.TextureDataType.uiConfig)\n    readonly bufferType: TextureDataType // cannot be changed after creation (for now)\n\n    constructor(\n        maxFrameCount = 32,\n        bufferType: TextureDataType = UnsignedByteType, // this is not used. todo use halffloat when rgbm = false\n        enabled = true,\n    ) {\n        super()\n        this.maxFrameCount = maxFrameCount\n        this.enabled = enabled\n        this.bufferType = bufferType\n    }\n\n    protected _createTarget(camera?: ICamera, recreate = false) {\n        if (!this._viewer) return\n        camera = camera ?? this._viewer.scene.renderCamera\n        if (recreate) this._disposeTarget(camera)\n        if (this._targets.has(camera.uuid)) return this._targets.get(camera.uuid)\n        const target = this._viewer.renderManager.composerTarget.clone(true) as WebGLRenderTarget\n        target.texture.name = 'progressiveLastBuffer_' + camera.uuid\n        // target.texture.type = this.bufferType\n        this._targets.set(camera.uuid, target)\n        // if (this._pass) this._pass.target = this.target\n        return target\n    }\n\n    protected _disposeTarget(camera?: ICamera) {\n        if (!this._viewer) return\n        if (!camera) {\n            this._targets.forEach((t) => this._viewer!.renderManager.disposeTarget(t))\n            this._targets.clear()\n        } else {\n            const t = this._targets.get(camera.uuid)\n            if (t) {\n                this._viewer!.renderManager.disposeTarget(t)\n                this._targets.delete(camera.uuid)\n            }\n        }\n    }\n\n    protected _createPass() {\n        // this._createTarget(true)\n        const pass = new ProgressiveBlendPass(this.passId, ()=>this.target ?? this._createTarget(), this._viewer?.renderManager.maxHDRIntensity) // todo: disposeTarget somewhere\n        pass.dirty = () => (this._viewer?.renderManager.frameCount || 0) < this.maxFrameCount // todo use isConverged function\n        return pass\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        this._disposeTarget()\n        return super.onRemove(viewer)\n    }\n    /**\n     *\n     * @param postRender - if called after rendering frame.\n     */\n    public isConverged(postRender = false): boolean {\n        return (this._viewer?.renderManager.frameCount || 0) >= this.maxFrameCount - 1 + (postRender ? 1 : 0)\n    }\n\n    updateShaderProperties(material: {defines: Record<string, string | number | undefined>; uniforms: {[p: string]: IUniform}}): this {\n        if (material.uniforms.tLastFrame) material.uniforms.tLastFrame.value = this.target?.texture ?? undefined\n        return this\n    }\n\n    /**\n     * Get recording delta post render, For use with animations to sync with converge mode in canvas recorder. See PopmotionPlugin for usage.\n     * @returns {number} - delta time in milliseconds, or 0 when converging, or -1 in case of not recording in converge mode\n     */\n    postFrameConvergedRecordingDelta(_ = 'CanvasRecorder'): number {\n        // const recorder = this._viewer!.getPluginByType<IConvergedCanvasRecorder&IViewerPlugin>(recorderPlugin)\n        // if (recorder && recorder.isRecording() && recorder.convergeMode)\n        //     return this.isConverged(true) ? 1. / recorder.videoFrameRate : 0\n        return -1\n    }\n\n    get convergedPromise() {\n        return new Promise<void>(resolve=>{\n            if (this.isConverged()) {\n                this._viewer?.doOnce('postFrame', ()=>resolve())\n            } else {\n                const l = ()=>{\n                    if (!this.isConverged(true)) return\n                    this._viewer?.removeEventListener('postRender', l)\n                    this._viewer?.doOnce('postFrame', ()=>resolve())\n                }\n                this._viewer?.addEventListener('postRender', l)\n            }\n        })\n    }\n\n    fromJSON(data: ISerializedConfig&{pass?: any}, meta?: SerializationMetaType): this|null|Promise<this|null> {\n        if (data.jitter !== undefined) {\n            const ssaa = this._viewer?.getPlugin(SSAAPlugin)\n            if (!ssaa) {\n                console.warn('Loading old webgi v0 file, add SSAAPlugin to get anti-aliasing')\n            } else {\n                data = {...data}\n                ssaa.enabled = data.jitter\n                delete data.jitter\n            }\n        }\n        return super.fromJSON(data, meta)\n    }\n\n}\n\nexport class ProgressiveBlendPass extends AddBlendTexturePass implements IPipelinePass {\n    before = ['screen']\n    after = ['render']\n    required = ['render']\n    dirty: ValOrFunc<boolean> = () => false\n    constructor(public readonly passId: IPassID, public target?: ValOrFunc<WebGLRenderTarget|undefined>, maxIntensity = 120) {\n        super(undefined, maxIntensity)\n    }\n\n    copyToWriteBuffer = true\n\n    render(renderer: IWebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget, deltaTime: number, maskActive: boolean) {\n        if (!this.enabled) return\n        const target = getOrCall(this.target)\n        if (!target) {\n            console.warn('ProgressiveBlendPass: target not defined')\n            return\n        }\n        this.needsSwap = false\n        if (renderer.renderManager.frameCount < 1) {\n            if (readBuffer?.texture)\n                renderer.renderManager.blit(target, {\n                    source: readBuffer.texture,\n                    respectColorSpace: false,\n                })\n            return\n        }\n        super.render(renderer, writeBuffer, readBuffer, deltaTime, maskActive)\n\n        if (this.copyToWriteBuffer) {\n            renderer.renderManager.blit(target, {\n                source: writeBuffer.texture,\n                respectColorSpace: false,\n            })\n            this.needsSwap = true\n        }\n    }\n\n    beforeRender(_: IScene, _1: ICamera, renderManager: IRenderManager) {\n        if (!this.enabled) return\n        if (!this.target) {\n            console.error('ProgressiveBlendPass: render target undefined')\n            return\n        }\n        let f = 1. / (Math.max(renderManager.frameCount, 0) + 1)\n        this.uniforms.weight.value.set(f, f, f, f)\n        f = 1. - f\n        this.uniforms.weight2.value.set(f, f, f, f)\n        this.uniforms.tDiffuse2.value = getOrCall(this.target)?.texture\n        this.material.uniformsNeedUpdate = true\n    }\n\n}\n","#if defined(HAS_DEPTH_BUFFER)\n#if DEPTH_PACKING == 3200\n#define unpackDepth(rgba_depth) (1.0 - rgba_depth.r)\n#elif DEPTH_PACKING == 3201\n#define unpackDepth(rgba_depth) unpackRGBAToDepth(rgba_depth)\n#endif\nuniform sampler2D tDepthBuffer;\n#define getDepth(uv) unpackDepth(texture2D(tDepthBuffer, uv))\n#endif\n\n","import {\n    RGBADepthPacking,\n    BufferGeometry,\n    Camera,\n    Color,\n    DepthPackingStrategies,\n    DoubleSide,\n    FrontSide,\n    MeshDepthMaterial,\n    MeshDepthMaterialParameters,\n    NoBlending,\n    Object3D,\n    Scene,\n    Texture,\n    TextureDataType,\n    UnsignedByteType,\n    WebGLRenderer,\n    WebGLRenderTarget, Group,\n} from 'three'\nimport {GBufferRenderPass} from '../../postprocessing'\nimport {ThreeViewer, ViewerRenderManager} from '../../viewer'\nimport {MaterialExtension} from '../../materials'\nimport {PipelinePassPlugin} from '../base/PipelinePassPlugin'\nimport {uiDropdown, uiFolderContainer, uiImage} from 'uiconfig.js'\nimport {shaderReplaceString} from '../../utils'\nimport {onChange} from 'ts-browser-helpers'\nimport DepthBufferUnpack from './shaders/DepthBufferPlugin.unpack.glsl'\nimport {threeConstMappings} from '../../three'\nimport {IMaterial, PhysicalMaterial} from '../../core'\n\n// type DepthBufferPluginTarget = WebGLRenderTarget\nexport type DepthBufferPluginTarget = WebGLRenderTarget\nexport type DepthBufferPluginPass = GBufferRenderPass<'depth', DepthBufferPluginTarget|undefined>\n\n/**\n * Depth Buffer Plugin\n *\n * Adds a pre-render pass to render the depth buffer to a render target that can be used as gbuffer or for postprocessing.\n * @category Plugins\n */\n@uiFolderContainer('Depth Buffer Plugin')\nexport class DepthBufferPlugin\n    extends PipelinePassPlugin<DepthBufferPluginPass, 'depth'> {\n\n    readonly passId = 'depth'\n    public static readonly PluginType = 'DepthBufferPlugin'\n\n    target?: DepthBufferPluginTarget\n\n    @uiImage('Depth Buffer', {readOnly: true}) texture?: Texture\n\n    // @uiConfig() // not supported in this material yet\n    readonly material: MeshDepthMaterial = new MeshDepthMaterialOverride({\n        depthPacking: RGBADepthPacking,\n        blending: NoBlending,\n        transparent: true,\n    })\n\n    @onChange(DepthBufferPlugin.prototype._depthPackingChanged)\n    @uiDropdown('Depth Packing', threeConstMappings.DepthPackingStrategies.uiConfig) depthPacking: DepthPackingStrategies\n\n    // @onChange2(DepthBufferPlugin.prototype._createTarget)\n    // @uiDropdown('Buffer Type', threeConstMappings.TextureDataType.uiConfig)\n    readonly bufferType: TextureDataType // cannot be changed after creation (for now) todo line 139: unregisterMaterialExtensions, maybe because the priority is not set so its added at the end?\n\n    // @uiToggle()\n    // @onChange2(DepthBufferPlugin.prototype._createTarget)\n    readonly isPrimaryGBuffer: boolean // cannot be changed after creation (for now)\n\n    protected _depthPackingChanged() {\n        this.material.depthPacking = this.depthPacking\n        this.material.needsUpdate = true\n        if (this.unpackExtension && this.unpackExtension.extraDefines) {\n            this.unpackExtension.extraDefines.DEPTH_PACKING = this.depthPacking\n            this.unpackExtension.setDirty?.()\n        }\n        this.setDirty()\n    }\n\n    unpackExtension: MaterialExtension = {\n        shaderExtender: (shader)=>{\n            const includes = ['depth_buffer_unpack', 'gbuffer_unpack', 'packing'] as const\n            const include = includes.find(i=>shader.fragmentShader.includes(`#include <${i}>`))\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader,\n                `#include <${include}>`,\n                '\\n' + DepthBufferUnpack + '\\n', {append: include === 'packing'})\n        },\n        extraUniforms: {\n            tDepthBuffer: ()=>({value: this.target?.texture}),\n        },\n        extraDefines: {\n            ['DEPTH_PACKING']: RGBADepthPacking,\n            ['HAS_DEPTH_BUFFER']: ()=>this.target?.texture ? 1 : undefined,\n            ['HAS_GBUFFER']: ()=>this.isPrimaryGBuffer && this.target?.texture ? 1 : undefined,\n        },\n        priority: 100,\n        isCompatible: () => true,\n    }\n\n    private _isPrimaryGBufferSet = false\n    protected _createTarget(recreate = true) {\n        if (!this._viewer) return\n        if (recreate) this._disposeTarget()\n        const rm = this._viewer.renderManager\n        if (!this.target)\n            this.target = this._viewer.renderManager.createTarget<DepthBufferPluginTarget>(\n                {\n                    depthBuffer: true,\n                    samples: this._viewer.renderManager.zPrepass && this.isPrimaryGBuffer && rm.msaa ? // requirement for zPrepass\n                        typeof rm.msaa !== 'number' ? ViewerRenderManager.DEFAULT_MSAA_SAMPLES : rm.msaa : 0,\n                    type: this.bufferType,\n                    // magFilter: NearestFilter,\n                    // minFilter: NearestFilter,\n                    // generateMipmaps: false,\n                    // encoding: LinearEncoding,\n                })\n\n        this.texture = this.target.texture\n        this.texture.name = 'depthBuffer'\n\n        // if (this._pass) this._pass.target = this.target\n\n        if (this.isPrimaryGBuffer) {\n            this._viewer.renderManager.gbufferTarget = this.target\n            this._viewer.renderManager.gbufferUnpackExtension = this.unpackExtension\n            this._viewer.renderManager.screenPass.material.registerMaterialExtensions([this.unpackExtension])\n            this._isPrimaryGBufferSet = true\n        }\n    }\n\n    protected _disposeTarget() {\n        if (!this._viewer) return\n        if (this.target) {\n            this._viewer.renderManager.disposeTarget(this.target)\n            this.target = undefined\n        }\n        this.texture = undefined\n        if (this._isPrimaryGBufferSet) { // using a separate flag as when isPrimaryGBuffer is changed, we cannot check it.\n            this._viewer.renderManager.gbufferTarget = undefined\n            this._viewer.renderManager.gbufferUnpackExtension = undefined\n            // this._viewer.renderManager.screenPass.material.unregisterMaterialExtensions([this.unpackExtension]) // todo this has an issue\n            this._isPrimaryGBufferSet = false\n        }\n    }\n\n    protected _createPass() {\n        this._createTarget(true)\n        if (!this.target) throw new Error('DepthBufferPlugin: target not created')\n        this.material.userData.isGBufferMaterial = true\n        const pass = new GBufferRenderPass(this.passId, ()=>this.target, this.material, new Color(0, 0, 0), 1)\n        const preprocessMaterial = pass.preprocessMaterial\n        pass.preprocessMaterial = (m) => preprocessMaterial(m, m.userData.renderToDepth) // if renderToDepth is undefined then renderToGbuffer is taken internally\n        pass.before = ['render']\n        pass.after = []\n        pass.required = ['render']\n        return pass\n    }\n\n    constructor(\n        bufferType: TextureDataType = UnsignedByteType,\n        isPrimaryGBuffer = false,\n        enabled = true,\n        depthPacking: DepthPackingStrategies = RGBADepthPacking,\n    ) {\n        super()\n        this.enabled = enabled\n        this.depthPacking = depthPacking\n        this.bufferType = bufferType\n        this.isPrimaryGBuffer = isPrimaryGBuffer\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        this._disposeTarget()\n        return super.onRemove(viewer)\n    }\n\n}\n\nexport class MeshDepthMaterialOverride extends MeshDepthMaterial {\n\n    constructor(parameters: MeshDepthMaterialParameters) {\n        super(parameters)\n        this.reset()\n    }\n\n    onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group) {\n        super.onBeforeRender(renderer, scene, camera, geometry, object, group)\n\n        let material = (object as any).material as IMaterial & Partial<PhysicalMaterial>\n        if (Array.isArray(material)) { // todo: add support for multi materials.\n            material = material[0]\n        }\n        if (!material) return\n\n        if (material.map !== undefined) this.map = material.map // in case there is alpha in the map.\n        if (material.side !== undefined) this.side = material.side ?? FrontSide\n        if (material.alphaMap !== undefined) this.alphaMap = material.alphaMap\n        if (material.alphaTest !== undefined) this.alphaTest = material.alphaTest < 1e-4 ? 1e-4 : material.alphaTest\n        if (material.alphaHash !== undefined) this.alphaHash = material.alphaHash\n\n        if (material.displacementMap !== undefined) this.displacementMap = material.displacementMap\n        if (material.displacementScale !== undefined) this.displacementScale = material.displacementScale\n        if (material.displacementBias !== undefined) this.displacementBias = material.displacementBias\n\n        if (material.wireframe !== undefined) this.wireframe = material.wireframe\n        if (material.wireframeLinewidth !== undefined) this.wireframeLinewidth = material.wireframeLinewidth\n\n        this.needsUpdate = true\n        // @ts-expect-error todo add to type\n        renderer.resetCurrentMaterial && renderer.resetCurrentMaterial()\n    }\n\n    onAfterRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group) {\n        super.onAfterRender(renderer, scene, camera, geometry, object, group)\n\n        this.reset()\n    }\n\n    reset() {\n        this.map = null\n        this.side = DoubleSide\n        this.alphaMap = null\n        this.alphaTest = 0.001\n        this.alphaHash = false\n\n        this.displacementMap = null\n        this.displacementScale = 1\n        this.displacementBias = 0\n\n        this.wireframe = false\n        this.wireframeLinewidth = 1\n    }\n}\n","import {\n    BufferGeometry,\n    Camera,\n    Color,\n    DoubleSide, Group,\n    HalfFloatType,\n    LinearSRGBColorSpace,\n    MeshNormalMaterial,\n    MeshNormalMaterialParameters,\n    NearestFilter,\n    NoBlending,\n    Object3D,\n    Scene,\n    TangentSpaceNormalMap,\n    Texture,\n    TextureDataType,\n    WebGLRenderer,\n    WebGLRenderTarget,\n} from 'three'\nimport {GBufferRenderPass} from '../../postprocessing'\nimport {ThreeViewer} from '../../viewer'\nimport {PipelinePassPlugin} from '../base/PipelinePassPlugin'\nimport {IMaterial, IObject3D, PhysicalMaterial} from '../../core'\nimport {uiFolderContainer, uiImage} from 'uiconfig.js'\n\n// type NormalBufferPluginTarget = WebGLRenderTarget\nexport type NormalBufferPluginTarget = WebGLRenderTarget\nexport type NormalBufferPluginPass = GBufferRenderPass<'normal', NormalBufferPluginTarget|undefined>\n/**\n * Normal Buffer Plugin\n *\n * Adds a pre-render pass to render the normal buffer to a render target that can be used for postprocessing.\n * @category Plugins\n */\n@uiFolderContainer('Normal Buffer Plugin')\nexport class NormalBufferPlugin\n    extends PipelinePassPlugin<NormalBufferPluginPass, 'normal'> {\n\n    readonly passId = 'normal'\n    public static readonly PluginType = 'NormalBufferPlugin'\n\n    target?: NormalBufferPluginTarget\n    @uiImage('Normal Buffer', {readOnly: true}) texture?: Texture\n    readonly material: MeshNormalMaterial = new MeshNormalMaterialOverride({\n        blending: NoBlending,\n    })\n\n    // @onChange2(NormalBufferPlugin.prototype._createTarget)\n    // @uiDropdown('Buffer Type', threeConstMappings.TextureDataType.uiConfig)\n    readonly bufferType: TextureDataType // cannot be changed after creation (for now)\n\n    protected _createTarget(recreate = true) {\n        if (!this._viewer) return\n        if (recreate) this._disposeTarget()\n\n        // const rm = this._viewer.renderManager\n        if (!this.target) this.target = this._viewer.renderManager.createTarget<NormalBufferPluginTarget>(\n            {\n                depthBuffer: true,\n                // samples: rm.msaa ? typeof rm.msaa !== 'number' ? ViewerRenderManager.DEFAULT_MSAA_SAMPLES : rm.msaa : 0,\n                samples: 0,\n                type: this.bufferType,\n                magFilter: NearestFilter,\n                minFilter: NearestFilter,\n                generateMipmaps: false,\n                colorSpace: LinearSRGBColorSpace,\n            })\n        this.texture = this.target.texture\n        this.texture.name = 'normalBuffer'\n\n        // if (this._pass) this._pass.target = this.target\n    }\n    protected _disposeTarget() {\n        if (!this._viewer) return\n        if (this.target) {\n            this._viewer.renderManager.disposeTarget(this.target)\n            this.target = undefined\n        }\n        this.texture = undefined\n    }\n\n    protected _createPass() {\n        this._createTarget(true)\n        if (!this.target) throw new Error('NormalBufferPlugin: target not created')\n        this.material.userData.isGBufferMaterial = true\n        const pass = new GBufferRenderPass(this.passId, ()=>this.target, this.material, new Color(0, 0, 0), 1)\n        const preprocessMaterial = pass.preprocessMaterial\n        pass.preprocessMaterial = (m) => preprocessMaterial(m, true)\n\n        // not calling super, since we don't want to check for depth here\n        // const preprocessObject = pass.preprocessObject\n        pass.preprocessObject = (object: IObject3D) => {\n            if (object.customNormalMaterial) {\n                const mat = object.customNormalMaterial\n                mat.allowOverride = false\n                // todo save the current forcedOverrideMaterial to restore it later?\n                object.forcedOverrideMaterial = mat\n                return undefined\n            }\n            // return preprocessObject(object)\n            return object.material\n        }\n\n        // const postprocessObject = pass.postprocessObject\n        pass.postprocessObject = (object: IObject3D) => {\n            if (object.customNormalMaterial) {\n                delete object.forcedOverrideMaterial\n            }\n            // postprocessObject(object)\n        }\n\n\n        pass.before = ['render']\n        pass.after = []\n        pass.required = ['render']\n        return pass\n    }\n\n    constructor(\n        bufferType: TextureDataType = HalfFloatType,\n        enabled = true,\n    ) {\n        super()\n        this.enabled = enabled\n        this.bufferType = bufferType\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        this._disposeTarget()\n        return super.onRemove(viewer)\n    }\n\n}\n\nexport class MeshNormalMaterialOverride extends MeshNormalMaterial {\n\n    constructor(parameters: MeshNormalMaterialParameters) {\n        super(parameters)\n        this.reset()\n    }\n\n    onBeforeRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group) {\n        super.onBeforeRender(renderer, scene, camera, geometry, object, group)\n\n        if (!(object as any).material) return\n        const material = (object as any).material as IMaterial & Partial<PhysicalMaterial>\n\n        if (material.bumpMap !== undefined) this.bumpMap = material.bumpMap\n        if (material.bumpScale !== undefined) this.bumpScale = material.bumpScale\n        // if (material.alphaMap !== undefined) this.alphaMap = material.alphaMap\n        if (material.alphaTest !== undefined) this.alphaTest = material.alphaTest < 1e-4 ? 1e-4 : material.alphaTest\n        if (material.alphaHash !== undefined) this.alphaHash = material.alphaHash\n\n        if (material.normalMap !== undefined) this.normalMap = material.normalMap\n        if (material.normalMapType !== undefined) this.normalMapType = material.normalMapType\n        if (material.normalScale !== undefined) this.normalScale.copy(material.normalScale)\n\n        if (material.displacementMap !== undefined) this.displacementMap = material.displacementMap\n        if (material.displacementScale !== undefined) this.displacementScale = material.displacementScale\n        if (material.displacementBias !== undefined) this.displacementBias = material.displacementBias\n\n        if (material.flatShading !== undefined) this.flatShading = material.flatShading\n\n        if (material.side !== undefined) this.side = material.side\n\n        if (material.wireframe !== undefined) this.wireframe = material.wireframe\n        if (material.wireframeLinewidth !== undefined) this.wireframeLinewidth = material.wireframeLinewidth\n\n        // @ts-expect-error todo add to type\n        renderer.resetCurrentMaterial && renderer.resetCurrentMaterial()\n\n    }\n\n    onAfterRender(renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, object: Object3D, group: Group) {\n        super.onAfterRender(renderer, scene, camera, geometry, object, group)\n        this.reset()\n    }\n\n    reset() {\n        this.bumpMap = null\n        this.bumpScale = 1\n        // this.alphaMap = null\n        this.alphaTest = 0\n\n        this.normalMap = null\n        this.normalMapType = TangentSpaceNormalMap\n\n        this.displacementMap = null\n        this.displacementScale = 1\n        this.displacementBias = 0\n\n        this.flatShading = false\n\n        this.side = DoubleSide\n\n        this.wireframe = false\n        this.wireframeLinewidth = 1\n    }\n}\n","import {LinearFilter, WebGLRenderTarget} from 'three'\nimport {IPassID, IPipelinePass} from '../../postprocessing'\nimport {ThreeViewer} from '../../viewer'\nimport {PipelinePassPlugin} from '../base/PipelinePassPlugin'\nimport {uiFolderContainer, uiToggle} from 'uiconfig.js'\nimport {ITexture, IWebGLRenderer} from '../../core'\nimport {AddBlendTexturePass} from '../../postprocessing/AddBlendTexturePass'\nimport {now, serialize, timeout, ValOrFunc} from 'ts-browser-helpers'\nimport {ProgressivePlugin} from './ProgressivePlugin'\nimport {IRenderTarget} from '../../rendering'\n\n/**\n * FrameFade Plugin\n *\n * Adds a post-render pass to smoothly fade to a new rendered frame over time.\n * This is useful for example when changing the camera position, material, object properties, etc to avoid a sudden jump.\n * @category Plugins\n */\n@uiFolderContainer('FrameFade Plugin')\nexport class FrameFadePlugin\n    extends PipelinePassPlugin<FrameFadeBlendPass, 'frameFade'> {\n\n    readonly passId = 'frameFade'\n    public static readonly PluginType = 'FrameFadePlugin'\n\n    dependencies = [ProgressivePlugin]\n\n    // disables fadeOn... options but not serialized\n    isEditor = false\n\n    @serialize() @uiToggle() fadeOnActiveCameraChange = true\n    @serialize() @uiToggle() fadeOnMaterialUpdate = true\n    @serialize() @uiToggle() fadeOnSceneUpdate = true\n\n    protected _pointerEnabled = true\n    protected _target?: IRenderTarget\n\n    constructor(\n        enabled = true,\n    ) {\n        super()\n        this.enabled = enabled\n        this.startTransition = this.startTransition.bind(this)\n        this.stopTransition = this.stopTransition.bind(this)\n        this._fadeCam = this._fadeCam.bind(this)\n        this._fadeMat = this._fadeMat.bind(this)\n        this.isDisabled = ((sup)=>()=>!this._pointerEnabled || sup())(this.isDisabled)\n    }\n\n    saveFrameTimeThreshold = 500 // ms\n\n    /**\n     * Start a frame fade transition.\n     * Note that the current frame data will only be used if the last running transition is ended or near the end. To do it anyway, call {@link stopTransition} first\n     * @param duration\n     */\n    public async startTransition(duration: number) { // duration in ms\n        if (!this._viewer || !this._pass || this.isDisabled()) return\n        if (!this._target)\n            this._target = this._viewer.renderManager.getTempTarget({\n                sizeMultiplier: 1.,\n                minFilter: LinearFilter,\n                magFilter: LinearFilter,\n                colorSpace: (this._viewer.renderManager.composerTarget.texture as ITexture).colorSpace,\n            })\n\n        if (this._pass.fadeTimeState < this.saveFrameTimeThreshold) // only save if very near the end\n            this._pass.toSaveFrame = true\n\n        this._pass.fadeTimeState = Math.max(duration, this._pass.fadeTimeState)\n        this._pass.fadeTime = this._pass.fadeTimeState\n        // this._pass.enabled = true\n        this.setDirty()\n        await timeout(duration)\n    }\n\n    /**\n     * Stop a frame fade transition if running. Note that it will be stopped next frame.\n     */\n    public stopTransition() {\n        if (!this._pass) return\n        this._pass.fadeTimeState = 0. // will be stopped in update on next frame\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.scene.addEventListener('mainCameraUpdate', this.stopTransition)\n        viewer.scene.addEventListener('mainCameraChange', this._fadeCam)\n        viewer.scene.addEventListener('materialUpdate', this._fadeMat)\n        viewer.scene.addEventListener('sceneUpdate', this._fadeScene)\n        viewer.scene.addEventListener('objectUpdate', this._fadeObjectUpdate)\n        window.addEventListener('pointermove', this._onPointerMove) // has to be on window\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.scene.removeEventListener('mainCameraUpdate', this.stopTransition)\n        viewer.scene.removeEventListener('mainCameraChange', this._fadeCam)\n        viewer.scene.removeEventListener('materialUpdate', this._fadeMat)\n        viewer.scene.removeEventListener('sceneUpdate', this._fadeScene)\n        viewer.scene.removeEventListener('objectUpdate', this._fadeObjectUpdate)\n        window.removeEventListener('pointermove', this._onPointerMove)\n        super.onRemove(viewer)\n    }\n\n    private _fadeCam = async(ev: any)=>\n        ev.frameFade !== false && !this.isEditor && this.fadeOnActiveCameraChange && this.startTransition(ev.fadeDuration || 1000)\n    private _fadeMat = async(ev: any)=>\n        ev.frameFade !== false && !this.isEditor && this.fadeOnMaterialUpdate && this.startTransition(ev.fadeDuration || 200)\n    private _fadeScene = async(ev: any)=>\n        ev.frameFade !== false && !this.isEditor && this.fadeOnSceneUpdate && this.startTransition(ev.fadeDuration || 500)\n    private _fadeObjectUpdate = async(ev: any)=>\n        ev.frameFade && !this.isEditor && this.startTransition(ev.fadeDuration || 500)\n\n    private _onPointerMove = (ev: PointerEvent)=> {\n        const canvas = this._viewer?.canvas\n        if (!canvas) {\n            this._pointerEnabled = false\n            return\n        }\n\n        // no button is pressed\n        if (!ev.buttons || ev.target !== canvas) {\n            this._pointerEnabled = true\n            return\n        }\n\n        // check if pointer is over canvas\n        const rect = canvas.getBoundingClientRect()\n        const x = (ev.clientX - rect.left) / rect.width\n        const y = (ev.clientY - rect.top) / rect.height\n        this._pointerEnabled = x < 0 || x > 1 || y < 0 || y > 1\n    }\n\n    setDirty() {\n        super.setDirty()\n        if (this.isDisabled()) return\n        this._viewer?.setDirty()\n    }\n\n    get dirty() {\n        return !this.isDisabled() && !!this._pass && this._pass.fadeTimeState > 0\n    }\n\n    set dirty(_: boolean) {\n        console.error('FrameFadePlugin.dirty is readonly')\n    }\n\n    protected _createPass() {\n        return new FrameFadeBlendPass(this.passId, this, this._viewer?.renderManager.maxHDRIntensity)\n    }\n\n    get canFrameFade() {\n        return this._target && this._pointerEnabled &&\n            this.dirty && this._pass &&\n            this._pass.fadeTimeState > 0.001 &&\n            this._viewer && this._viewer.scene.renderCamera === this._viewer.scene.mainCamera\n    }\n\n    get lastFrame() {\n        return this._viewer?.getPlugin(ProgressivePlugin)?.texture\n    }\n\n    get target() {\n        return this._target\n    }\n\n    protected _beforeRender(): boolean {\n        if (!super._beforeRender() || !this._pass) return false\n\n        if (this.isDisabled()) this.stopTransition()\n\n        if (this._pass.fadeTimeState < 0.001) {\n            this._pass.toSaveFrame = false\n            if (this._target && this._viewer) {\n                this._viewer.renderManager.releaseTempTarget(this._target)\n                this._target = undefined\n            }\n        }\n        return true\n    }\n\n}\n\nexport class FrameFadeBlendPass extends AddBlendTexturePass implements IPipelinePass {\n    before = ['progressive', 'taa']\n    after = ['render']\n    required = ['render', 'progressive']\n    dirty: ValOrFunc<boolean> = () => false\n\n    fadeTime = 0 // ms\n    fadeTimeState = 0\n    toSaveFrame = false\n\n    private _lastTime = 0\n\n    constructor(public readonly passId: IPassID, public plugin: FrameFadePlugin, maxIntensity = 120) {\n        super(undefined, maxIntensity)\n    }\n\n    render(renderer: IWebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget, deltaTime: number, maskActive: boolean) {\n        this.needsSwap = false\n        const target = this.plugin.target\n\n        if (!this.plugin.canFrameFade || !target) return\n        const lastFrame = this.plugin.lastFrame\n        if (this.toSaveFrame && lastFrame) {\n            renderer.renderManager.blit(target, {source: lastFrame, respectColorSpace: false})\n            this._lastTime = 0\n            this.toSaveFrame = false\n        }\n\n        this.uniforms.tDiffuse2.value = target.texture\n\n        const weight = this.fadeTimeState / this.fadeTime\n        this.uniforms.weight2.value.setScalar(weight)\n        this.uniforms.weight2.value.w = 1\n        this.uniforms.weight.value.setScalar(1. - weight)\n        this.uniforms.weight.value.w = 1\n        super.render(renderer, writeBuffer, readBuffer, deltaTime, maskActive)\n        this.needsSwap = true\n\n        const time = now()\n        if (this._lastTime < 10) this._lastTime = time - 10 // ms\n        const dt = time - this._lastTime\n        this._lastTime = time\n\n        this.fadeTimeState -= dt\n    }\n\n}\n\ndeclare module '../../core/IObject'{\n    export interface IObjectSetDirtyOptions{\n        frameFade?: boolean\n    }\n}","#include <randomHelpers>\n#include <common>\n#include <packing>\n#define THREE_PACKING_INCLUDED\n#include <cameraHelpers>\n\nvarying vec2 vUv;\n\nuniform sampler2D tLastThis;\n\n#ifndef D_frameCount\n#define D_frameCount\nuniform float frameCount;\n#endif\n\nuniform vec4 saoData;\nuniform vec4 saoBiasEpsilon;\nuniform vec2 screenSize;\n\nconst float INV_NUM_SAMPLES = 1.0 / float(NUM_SAMPLES);\n\nint getSelectionBit(in int number) {\n    #ifdef WebGL2Context\n    return (number/8) % 2;\n    #else\n    return int(mod(floor(float(number)/8.), 2.));\n    #endif\n}\n\nvec3 packFloatToRGB(const in float x) {\n    const vec3 code = vec3(1.0, 255.0, 65025.0);\n    vec3 pack = vec3(code * x);\n    pack.gb = fract(pack.gb);\n    pack.rg -= pack.gb * (1.0 / 256.0);\n    return pack;\n}\n\nvec3 getPositionFromOffset(const in vec2 uvOffset) {\n    #if defined(HAS_DEPTH_BUFFER) || defined(HAS_NORMAL_DEPTH_BUFFER)\n    float d = getDepth(uvOffset);\n    #else\n    float d = 0.5;\n    #endif\n\n    #if LINEAR_DEPTH == 0\n    float centerViewZ = viewZFromNDCZ(d);\n    return screenToView3(uvOffset, centerViewZ);\n    #else\n    d = mix(-cameraNearFar.x, -cameraNearFar.y, d);\n    return screenToView3(uvOffset, d);\n    #endif\n}\n\nfloat getOcclusion(const in vec2 uv,\nconst in int id,\nconst in float randomAngle,\nconst in float occlusionSphereRadius,\nconst in vec3 centerPosition,\nconst in vec3 centerNormal) {\n    float screenSpaceRadius = (float(id) + mod(randomAngle, 1.) + 0.5) * INV_NUM_SAMPLES;\n    float angle = screenSpaceRadius * (float(NUM_SPIRAL_TURNS) * 6.28318) + randomAngle;\n    screenSpaceRadius = (screenSpaceRadius * occlusionSphereRadius);\n    vec2 uvOffset = uv + floor(screenSpaceRadius * vec2(cos(angle), sin(angle))) / screenSize;\n    #if CHECK_GBUFFER_FLAG == 1\n    if (getSelectionBit(getGBufferFlags(uvOffset.xy).a) < 1) return 0.0;\n    #endif\n    vec3 samplePosition = getPositionFromOffset(uvOffset);\n    vec3 direction = samplePosition - centerPosition;\n    float d2 = dot(direction, direction)/(saoBiasEpsilon.w * saoBiasEpsilon.w);\n    float ao = max((dot(centerNormal, direction)/saoBiasEpsilon.w - saoBiasEpsilon.x) / (saoBiasEpsilon.z * d2 + saoBiasEpsilon.y), 0.0);\n    return ao;\n}\n\nvoid main() {\n\n    // initial values\n    float centerDepth = 0.5;\n    vec3 centerNormal = vec3(0, 1, 0);\n\n    #ifdef HAS_NORMAL_DEPTH_BUFFER\n    getDepthNormal(vUv, centerDepth, centerNormal);\n    #else\n    #ifdef HAS_DEPTH_BUFFER\n    centerDepth = getDepth(vUv);\n    #endif\n\n// todo - add support for NormalBufferPlugin\n//    #ifdef HAS_NORMAL_BUFFER\n//    centerDepth = getDepth(vUv);\n//    #endif\n\n    #endif\n\n    //    if (centerDepth >= (1.0 - EPSILON)) {\n    //        discard;\n    //    }\n\n    #if LINEAR_DEPTH == 0\n    float centerViewZ = viewZFromNDCZ(centerDepth);\n    #else\n    float centerViewZ = mix(-cameraNearFar.x, -cameraNearFar.y, centerDepth);\n    #endif\n\n    vec3 centerPosition = screenToView3(vUv, centerViewZ);\n\n    // .09 is a number to match the previous AO results.\n    float occlusionSphereScreenRadius = saoData.z * saoBiasEpsilon.w / (-centerPosition.z);\n\n    //    if (occlusionSphereScreenRadius < 1.) {\n    //        discard;\n    //    }\n\n    float randomAngle = 6.2 * random3(vec3(vUv, frameCount * 0.1));\n\n    float sum = 0.0;\n\n    sum += getOcclusion(vUv, 0, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #if NUM_SAMPLES > 1\n    sum += getOcclusion(vUv, 1, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 2\n    sum += getOcclusion(vUv, 2, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 3\n    sum += getOcclusion(vUv, 3, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 4\n    sum += getOcclusion(vUv, 4, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 5\n    sum += getOcclusion(vUv, 5, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 6\n    sum += getOcclusion(vUv, 6, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 7\n    sum += getOcclusion(vUv, 7, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 8\n    sum += getOcclusion(vUv, 8, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 9\n    sum += getOcclusion(vUv, 9, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n    #if NUM_SAMPLES > 10\n    sum += getOcclusion(vUv, 10, randomAngle, occlusionSphereScreenRadius, centerPosition, centerNormal);\n    #endif\n\n    float aoValue = sum * saoData.y * INV_NUM_SAMPLES;\n\n    // this is not needed since ao can be disabled by not adding the material extension or the patch.\n    // bool disableAO = getSelectionBit(getGBufferFlags(vUv).a) > 0 ? true : false;\n\n    aoValue = 1. - clamp(aoValue, 0., 1.);\n\n    // todo why so many packing options?\n    #if SSAO_PACKING == 1 // (r: ssao, gba: depth)\n    // so that depth can also be sampled with ssao if required?\n    gl_FragColor.gba = packFloatToRGB(centerDepth);\n    gl_FragColor.r = aoValue;// + (lastAO.r) * frameCount)/(frameCount+1.);\n    #elif SSAO_PACKING == 2 // (rgb: ssao, a: 1)\n    gl_FragColor.rgb = vec3(aoValue);\n    gl_FragColor.a = 1.;\n    #elif SSAO_PACKING == 3 // (rgba: packed_ssao)\n    gl_FragColor.rgba = packDepthToRGBA(aoValue); // from packing\n    #elif SSAO_PACKING == 4 // (rgb: packed_ssao, a: 1)\n    gl_FragColor.rgb = packFloatToRGB(aoValue);\n    gl_FragColor.a = 1.;\n    #endif\n\n    //    vec4 lastAO = texture2D( tLastThis, vUv );\n    //    gl_FragColor.r = (vec4(aoValue)).r;// + (lastAO.r) * frameCount)/(frameCount+1.);\n    //    gl_FragColor.r = aoValue + (lastAO.r) * frameCount)/(frameCount+1.);\n    //    gl_FragColor.r = aoValue;\n    //    gl_FragColor = vec4(centerDepth);\n}\n","\n#ifndef USE_TRANSMISSION\n\n#if defined(SSAO_ENABLED) && SSAO_ENABLED > 0\n\nvec3 screenPos_ao = viewToScreen(vViewPosition.xyz);\n\n#if SSAO_ENABLED == 2 // split mode\nif(screenPos_ao.x > ssaoSplitX){\n#endif\n\n// note: depth can also be sampled and used when SSAO_PACKING = 1.\n\n// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\nfloat ambientOcclusion = tSSAOMapTexelToLinear ( texture2D( tSSAOMap, viewToScreen(vViewPosition.xyz).xy )).r; //todo: need to check encoding for tSSAOMap?\n\nreflectedLight.indirectDiffuse *= ambientOcclusion;\n\n#if defined( USE_ENVMAP )\n\nfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\nreflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\n#endif\n\n#else\n#include <aomap_fragment>\n#endif\n\n#if SSAO_ENABLED == 2 // split mode\n}\n#endif\n\n#endif\n\n","import {\n    LinearSRGBColorSpace,\n    MathUtils,\n    Matrix4,\n    Texture,\n    TextureDataType,\n    UnsignedByteType,\n    Vector2,\n    Vector4,\n    WebGLRenderTarget,\n} from 'three'\nimport {ExtendedShaderPass, IPassID, IPipelinePass} from '../../postprocessing'\nimport {ThreeViewer} from '../../viewer'\nimport {PipelinePassPlugin} from '../base/PipelinePassPlugin'\nimport {uiConfig, uiFolderContainer, uiImage, uiSlider, uiToggle} from 'uiconfig.js'\nimport {\n    ICamera,\n    IMaterial,\n    IRenderManager,\n    IScene,\n    IWebGLRenderer,\n    PerspectiveCamera2,\n    PhysicalMaterial,\n} from '../../core'\nimport {getOrCall, glsl, onChange2, serialize, updateBit, ValOrFunc} from 'ts-browser-helpers'\nimport {MaterialExtension} from '../../materials'\nimport {shaderReplaceString, shaderUtils} from '../../utils'\nimport {getTexelDecoding, matDefine, matDefineBool, uniform} from '../../three'\nimport ssaoPass from './shaders/SSAOPlugin.pass.glsl'\nimport ssaoPatch from './shaders/SSAOPlugin.patch.glsl'\nimport {uiConfigMaterialExtension} from '../../materials/MaterialExtender'\nimport {GBufferPlugin} from './GBufferPlugin'\nimport {GBufferUpdaterContext} from './GBufferMaterial'\n\nexport type SSAOPluginTarget = WebGLRenderTarget\n\n/**\n * SSAO Packing modes for different texture formats and use cases\n *\n * - **Mode 1**: `(r: ssao, gba: depth)` - SSAO in red channel, depth in green/blue/alpha\n * - **Mode 2**: `(rgb: ssao, a: 1)` - SSAO in RGB channels, alpha set to 1\n * - **Mode 3**: `(rgba: packed_ssao)` - Packed SSAO data across all RGBA channels\n * - **Mode 4**: `(rgb: packed_ssao, a: 1)` - Packed SSAO in RGB channels, alpha set to 1\n *\n * @remarks\n * Currently only modes 1 and 2 are fully supported in the shader implementation.\n * Modes 3 and 4 are available for future use but may require additional shader updates.\n */\nexport type SSAOPacking = 1 | 2 | 3 | 4\n\n/**\n * Screen Space Ambient Occlusion (SSAO) Plugin for enhanced lighting and depth perception in 3D scenes.\n *\n * SSAO is a real-time ambient occlusion technique that approximates the soft shadows that occur in creases,\n * holes, and surfaces that are close to each other. This plugin adds a pre-render pass that calculates\n * ambient occlusion data which is then used by materials during the main render pass.\n *\n * ## Key Features\n * - **Real-time SSAO calculation** using screen-space techniques\n * - **Multiple packing modes** for different texture formats and optimization needs\n * - **Per-material control** - materials can disable SSAO individually via userData\n * - **Configurable quality settings** including sample count, radius, bias, and intensity\n * - **Automatic serialization** of all settings with viewer configuration\n * - **GBuffer integration** for optimized depth and normal data access\n *\n * ## Dependencies\n * This plugin automatically adds {@link GBufferPlugin} as a dependency for efficient depth and normal data.\n *\n * ## Usage Scenarios\n * - **Architectural visualization** - enhances depth perception in interior scenes\n * - **Product visualization** - adds realistic ambient shadows to showcase products\n * - **Game environments** - provides cost-effective ambient occlusion for real-time rendering\n * - **CAD visualization** - improves understanding of complex mechanical assemblies\n *\n * ## Performance Considerations\n * - Use lower `sizeMultiplier` values (0.5-0.75) for better performance on mobile devices\n * - Combine with {@link ProgressivePlugin} and `TemporalAAPlugin` for temporal accumulation\n * - Consider disabling SSAO on transparent or unlit materials to save processing\n *\n * @example Basic Usage\n * ```typescript\n * import {ThreeViewer, SSAOPlugin} from 'threepipe'\n *\n * const viewer = new ThreeViewer({\n *   plugins: [new SSAOPlugin()]\n * })\n *\n * // Access the plugin and configure settings\n * const ssaoPlugin = viewer.getPlugin(SSAOPlugin)!\n * ssaoPlugin.pass.intensity = 1.2\n * ssaoPlugin.pass.radius = 0.5\n * ```\n *\n * @example Per-Material Control\n * ```typescript\n * // Disable SSAO for a specific material\n * material.userData.ssaoDisabled = true\n *\n * // Disable SSAO casting (material won't contribute to AO calculation)\n * material.userData.ssaoCastDisabled = true\n * ```\n *\n * @example High Performance Setup\n * ```typescript\n * const ssaoPlugin = new SSAOPlugin(\n *   UnsignedByteType,  // Buffer type\n *   0.5,               // Size multiplier for better performance\n *   true,              // Enabled\n *   1                  // Packing mode\n * )\n * viewer.addPlugin(ssaoPlugin)\n * ```\n *\n * @category Plugins\n */\n@uiFolderContainer('SSAO Plugin')\nexport class SSAOPlugin\n    extends PipelinePassPlugin<SSAOPluginPass, 'ssao'> {\n\n    readonly passId = 'ssao'\n    public static readonly PluginType = 'SSAOPlugin'\n    public static readonly OldPluginType = 'SSAO'\n\n    /**\n     * Plugin dependencies - automatically adds GBufferPlugin for depth and normal data\n     * @internal\n     */\n    dependencies = [GBufferPlugin]\n\n    /** The render target containing SSAO data */\n    target?: SSAOPluginTarget\n\n    /** Debug texture preview of the SSAO buffer (read-only) */\n    @uiImage('SSAO Buffer', {readOnly: true, tags: ['debug']})\n        texture?: Texture\n\n    @uiConfig(undefined, {unwrapContents: true})\n    declare protected _pass?: SSAOPluginPass\n\n    /**\n     * Buffer data type for the SSAO render target.\n     * Cannot be changed after plugin creation.\n     *\n     * @remarks\n     * - `UnsignedByteType` - Standard 8-bit precision, good performance\n     * - `HalfFloatType` - 16-bit precision, better quality but slower\n     * - `FloatType` - 32-bit precision, highest quality but slowest\n     */\n    readonly bufferType: TextureDataType\n\n    /**\n     * Render target size multiplier relative to the main canvas size.\n     * Cannot be changed after plugin creation.\n     *\n     * @remarks\n     * - `1.0` - Full resolution (highest quality)\n     * - `0.75` - 75% resolution (good balance)\n     * - `0.5` - Half resolution (better performance)\n     * - `0.25` - Quarter resolution (mobile performance)\n     */\n    readonly sizeMultiplier: number\n\n    /**\n     * SSAO data packing mode for the render target.\n     * Cannot be changed after plugin creation.\n     *\n     * @see {@link SSAOPacking} for available packing modes\n     */\n    readonly packing: SSAOPacking\n\n    /**\n     * Creates a new SSAOPlugin instance.\n     *\n     * @param bufferType - Data type for the SSAO buffer (default: UnsignedByteType)\n     * @param sizeMultiplier - Size multiplier for the render target (default: 1.0)\n     * @param enabled - Whether the plugin is initially enabled (default: true)\n     * @param packing - SSAO data packing mode (default: 1)\n     */\n    constructor(\n        bufferType: TextureDataType = UnsignedByteType,\n        sizeMultiplier = 1,\n        enabled = true,\n        packing: SSAOPacking = 1,\n    ) {\n        super()\n        this.enabled = enabled\n        this.bufferType = bufferType\n        this.sizeMultiplier = sizeMultiplier\n        this.packing = packing\n    }\n\n    protected _createTarget(recreate = true) {\n        if (!this._viewer) return\n        if (recreate) this._disposeTarget()\n        if (!this.target)\n            this.target = this._viewer.renderManager.createTarget<SSAOPluginTarget>(\n                {\n                    depthBuffer: false,\n                    type: this.bufferType,\n                    sizeMultiplier: this.sizeMultiplier,\n                    // magFilter: NearestFilter,\n                    // minFilter: NearestFilter,\n                    // generateMipmaps: false,\n                    // encoding: LinearEncoding,\n                    colorSpace: LinearSRGBColorSpace,\n                })\n\n        this.texture = this.target.texture\n        this.texture.name = 'ssaoBuffer'\n\n        // if (this._pass) this._pass.target = this.target\n    }\n\n    protected _disposeTarget() {\n        if (!this._viewer) return\n        if (this.target) {\n            this._viewer.renderManager.disposeTarget(this.target)\n            this.target = undefined\n        }\n        this.texture = undefined\n    }\n\n    private _gbufferUnpackExtension = undefined as MaterialExtension|undefined\n    private _gbufferUnpackExtensionChanged = ()=>{\n        if (!this._pass || !this._viewer) throw new Error('SSAOPlugin: pass/viewer not created yet')\n        const newExtension = this._viewer.renderManager.gbufferUnpackExtension\n        if (this._gbufferUnpackExtension === newExtension) return\n        if (this._gbufferUnpackExtension) this._pass.material.unregisterMaterialExtensions([this._gbufferUnpackExtension])\n        this._gbufferUnpackExtension = newExtension\n        if (this._gbufferUnpackExtension) this._pass.material.registerMaterialExtensions([this._gbufferUnpackExtension])\n        else this._viewer.console.warn('SSAOPlugin: GBuffer unpack extension removed')\n    }\n\n    protected _createPass() {\n        if (!this._viewer) throw new Error('SSAOPlugin: viewer not set')\n        if (!this._viewer.renderManager.gbufferTarget || !this._viewer.renderManager.gbufferUnpackExtension)\n            throw new Error('SSAOPlugin: GBuffer target not created. GBufferPlugin or DepthBufferPlugin is required.')\n        this._createTarget(true)\n        return new SSAOPluginPass(this.passId, ()=>this.target, this.packing)\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.forPlugin(GBufferPlugin, (gbuffer) => {\n            gbuffer.registerGBufferUpdater(this.constructor.PluginType, this.updateGBufferFlags.bind(this))\n        }, (gbuffer)=>{\n            gbuffer.unregisterGBufferUpdater(this.constructor.PluginType)\n        }, this)\n        this._gbufferUnpackExtensionChanged()\n        viewer.renderManager.addEventListener('gbufferUnpackExtensionChanged', this._gbufferUnpackExtensionChanged)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        this._disposeTarget()\n        return super.onRemove(viewer)\n    }\n\n    fromJSON(data: any, meta?: any): this|null|Promise<this|null> {\n        // legacy\n        if (data.passes?.ssao) {\n            data = {...data}\n            data.pass = data.passes.ssao\n            delete data.passes\n            if (data.pass.enabled !== undefined) data.enabled = data.pass.enabled\n        }\n        return super.fromJSON(data, meta)\n    }\n\n    updateGBufferFlags(data: Vector4, c: GBufferUpdaterContext): void {\n        if (!c.material || !c.material.userData) return\n        const disabled = c.material.userData.ssaoCastDisabled || c.material.userData.pluginsDisabled\n        const x = disabled ? 0 : 1\n        data.w = updateBit(data.w, 3, x)\n\n        if (disabled && this._pass) this._pass.checkGBufferFlag = true\n    }\n    /**\n     * @deprecated use {@link target} instead\n     */\n    get aoTarget() {\n        console.warn('SSAOPlugin: aoTarget is deprecated, use target instead')\n        return this.target\n    }\n\n}\n\n@uiFolderContainer('SSAO Pass')\nexport class SSAOPluginPass extends ExtendedShaderPass implements IPipelinePass {\n    before = ['render']\n    after = ['gbuffer', 'depth']\n    required = ['render'] // gbuffer required check done in plugin.\n\n    // todo bilateralPass\n    // @serialize() readonly bilateralPass: BilateralFilterPass\n\n    // todo old deserialize\n    // @serialize() readonly parameters: SSAOParams = {\n    //     intensity: 0.25,\n    //     occlusionWorldRadius: 1,\n    //     bias: 0.001,\n    //     falloff: 1.3,\n    // }\n    @serialize()\n    @uiSlider('Intensity', [0, 4], 0.0001)\n    @onChange2(SSAOPluginPass.prototype.setDirty)\n        intensity = 0.25\n\n    @serialize()\n    @uiSlider('Occlusion World Radius', [0.1, 8], 0.01)\n    @onChange2(SSAOPluginPass.prototype.setDirty)\n        occlusionWorldRadius = 1\n\n    /**\n     * Whether to automatically adapt the occlusion radius based on the scene size.\n     * This is useful when scene is not centered or normalized\n     */\n    @serialize()\n    @onChange2(SSAOPluginPass.prototype.setDirty)\n    @uiToggle()\n        autoRadius = false\n\n    @serialize()\n    @uiSlider('Bias', [0.00001, 0.01], 0.00001)\n    @onChange2(SSAOPluginPass.prototype.setDirty)\n        bias = 0.001\n\n    @serialize()\n    @uiSlider('Falloff', [0.01, 3], 0.01)\n    @onChange2(SSAOPluginPass.prototype.setDirty)\n        falloff = 1.3\n\n    @serialize()\n    @uiSlider('Num Samples', [1, 11], 1, {tags: ['performance']})\n    @matDefine('NUM_SAMPLES', undefined, undefined, SSAOPluginPass.prototype.setDirty)\n        numSamples = 8\n\n    /**\n     * Whether to check for gbuffer flag or not. This is used to disable SSAO casting by some objects. its enabled automatically by the SSAOPlugin when required.\n     * This is disabled by default so that we dont read texture for no reason.\n     */\n    @matDefineBool('CHECK_GBUFFER_FLAG')\n        checkGBufferFlag = false\n\n    // todo after bilateralPass is implemented\n    // @bindToValue({obj: 'bilateralPass', key: 'enabled', onChange: 'setDirty'})\n    // smoothEnabled = true\n    // todo after bilateralPass is implemented\n    // @bindToValue({obj: 'bilateralPass', key: 'enabled', onChange: 'setDirty'})\n    // smoothEdgeSharpness = true\n\n    @uiSlider('Split', [0, 1], 0.01, {tags: ['debug']})\n    @serialize() @uniform({propKey: 'ssaoSplitX', onChange: SSAOPluginPass.prototype.setDirty})\n        split = 0\n\n    constructor(public readonly passId: IPassID, public target?: ValOrFunc<WebGLRenderTarget|undefined>, packing: SSAOPacking = 1) {\n        super({\n            defines: {\n                ['LINEAR_DEPTH']: 1, // todo set from unpack extension\n                ['NUM_SAMPLES']: 11,\n                ['NUM_SPIRAL_TURNS']: 3,\n                ['SSAO_PACKING']: packing, // 1 is (r: ssao, gba: depth), 2 is (rgb: ssao, a: 1), 3 is (rgba: packed_ssao), 4 is (rgb: packed ssao, a: 1)\n                ['PERSPECTIVE_CAMERA']: 1, // set in PerspectiveCamera2\n                ['CHECK_GBUFFER_FLAG']: 0,\n            },\n            uniforms: {\n                // tLastThis: {value: null},\n                screenSize: {value: new Vector2(0, 0)}, // set in ExtendedRenderMaterial\n                saoData: {value: new Vector4()},\n                frameCount: {value: 0}, // set in RenderManager\n                cameraNearFar: {value: new Vector2(0.1, 1000)}, // set in PerspectiveCamera2\n                projection: {value: new Matrix4()}, // set in PerspectiveCamera2\n                saoBiasEpsilon: {value: new Vector4(1, 1, 1, 1)},\n                sceneBoundingRadius: {value: 0},\n\n                // split mode\n                ssaoSplitX: {value: 0.5},\n            },\n\n            vertexShader: shaderUtils.defaultVertex,\n\n            fragmentShader: ssaoPass,\n\n        }, 'tDiffuse') // why is tLastThis not here. because encoding and size doesnt matter?\n\n        this.needsSwap = false\n        this.clear = true\n        // this.bilateralPass = new BilateralFilterPass(this._target as any, gBufferUnpack, 'rrrr')\n        // this._multiplyPass = new GenericBlendTexturePass(this._target.texture as any, 'c = vec4((1.0-b.r) * a.xyz, a.a);')\n        // this._getUiConfig = this._getUiConfig.bind(this)\n    }\n\n    copyToWriteBuffer = false\n\n    render(renderer: IWebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget, deltaTime: number, maskActive: boolean) {\n        this.needsSwap = false\n        if (!this.enabled) return\n\n        const target = getOrCall(this.target)\n        if (!target) {\n            console.warn('SSAOPluginPass: target not defined')\n            return\n        }\n        this._updateParameters()\n        // if (!this.material.defines.HAS_GBUFFER) {\n        //     console.warn('SSAOPluginPass: DepthNormalBuffer required for ssao')\n        // }\n\n        // tLastThis is not used anymore. the ssao is merged across frames with progressive plugin\n        // renderer.renderManager.blit(writeBuffer, {\n        //     source: target.texture,\n        //     respectColorSpace: true,\n        // })\n        // this.uniforms.tLastThis.value = writeBuffer.texture\n        super.render(renderer, target, readBuffer, deltaTime, maskActive)\n\n        // todo\n        // if (this.smoothEnabled) {\n        //     this.bilateralPass.render(renderer, writeBuffer, readBuffer, deltaTime, maskActive)\n        // }\n\n        if (this.copyToWriteBuffer) {\n            renderer.renderManager.blit(writeBuffer, {\n                source: target.texture,\n                respectColorSpace: true,\n            })\n            this.needsSwap = true\n        }\n\n    }\n\n    private _projScale = 1\n    private _updateParameters() {\n        // const projectionScale = 1 / (Math.tan(DEG2RAD * (camera as any).fov / 2) * 2);\n        const saoData = this.material.uniforms.saoData.value\n        // saoData.x = projectionScale;\n        saoData.y = this.intensity\n        saoData.z = this.occlusionWorldRadius\n        // saoData.w = this.accIndex_++;\n\n        saoData.z *= this._projScale * 0.25//* 100 / 2\n\n        const saoBiasEpsilon = this.material.uniforms.saoBiasEpsilon.value\n        saoBiasEpsilon.x = this.bias\n        saoBiasEpsilon.y = 0.001\n        saoBiasEpsilon.z = this.falloff\n\n        if (this.autoRadius) {\n            saoBiasEpsilon.w = Math.min(this.material.uniforms.sceneBoundingRadius.value, 100)\n        } else {\n            saoBiasEpsilon.w = 1\n        }\n\n        // this.material.uniforms.size.value.set(this._target.texture.image?.width, this._target.texture.image?.height)\n    }\n\n    beforeRender(scene: IScene, camera: ICamera, renderManager: IRenderManager) {\n        if (!this.enabled) return\n        this.updateShaderProperties([camera, renderManager, scene])\n        const fov = Math.max(1, (scene.mainCamera as PerspectiveCamera2).fov ?? 1)\n        const h = renderManager?.webglRenderer.domElement.height || 1\n        const w = 1 // renderManager?.webglRenderer.domElement.width || 1\n        this._projScale = h / (2 * w * Math.tan(0.5 * fov * MathUtils.DEG2RAD))\n    }\n\n    readonly materialExtension: MaterialExtension = {\n        extraUniforms: {\n            tSSAOMap: ()=>({value: getOrCall(this.target)?.texture ?? null}),\n            ssaoSplitX: this.material.uniforms.ssaoSplitX,\n        },\n        shaderExtender: (shader, _material, _renderer) => {\n            if (!shader.defines?.SSAO_ENABLED) return\n            // todo: only SSAO_PACKING = 1 and 2 are supported. Not 3 and 4 right now.\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#include <aomap_fragment>', ssaoPatch)\n        },\n        onObjectRender: (_object, material, renderer: any) => {\n            // const opaque = !material.transparent && (!material.transmission || material.transmission < 0.001)\n            const x: any = this.enabled && // opaque &&\n            renderer.userData.screenSpaceRendering !== false &&\n            !material.userData?.pluginsDisabled &&\n            !material.userData?.ssaoDisabled ? this.split > 0 ? 2 : 1 : 0\n\n            if (material.defines!.SSAO_ENABLED !== x) {\n                material.defines!.SSAO_ENABLED = x\n                material.needsUpdate = true\n            }\n        },\n        parsFragmentSnippet: ()=>glsl`\n             uniform sampler2D tSSAOMap;\n            #if defined(SSAO_ENABLED) && SSAO_ENABLED == 2\n            uniform float ssaoSplitX;\n            #endif\n             ${getTexelDecoding('tSSAOMap', getOrCall(this.target)?.texture.colorSpace)}\n             #include <simpleCameraHelpers>\n        `,\n        computeCacheKey: () => {\n            return (this.enabled ? '1' : '0') + getOrCall(this.target)?.texture?.colorSpace\n        },\n        uuid: SSAOPlugin.PluginType,\n        ...uiConfigMaterialExtension(this._getUiConfig.bind(this), SSAOPlugin.PluginType),\n        isCompatible: material => {\n            return (material as PhysicalMaterial).isPhysicalMaterial\n        },\n    }\n\n    /**\n     * Returns a uiConfig to toggle SSAO on a material.\n     * This uiConfig is added to each material by extension\n     * @param material\n     * @private\n     */\n    protected _getUiConfig(material: IMaterial) {\n        return {\n            type: 'folder',\n            label: 'SSAO',\n            children: [\n                {\n                    type: 'checkbox',\n                    label: 'Enabled',\n                    get value() {\n                        return !(material.userData.ssaoDisabled ?? false)\n                    },\n                    set value(v) {\n                        if (v === !(material.userData.ssaoDisabled ?? false)) return\n                        material.userData.ssaoDisabled = !v\n                        material.setDirty()\n                    },\n                    onChange: this.setDirty,\n                },\n                {\n                    type: 'checkbox',\n                    label: 'Cast SSAO',\n                    get value() {\n                        return !(material.userData.ssaoCastDisabled ?? false)\n                    },\n                    set value(v) {\n                        if (v === !(material.userData.ssaoCastDisabled ?? false)) return\n                        material.userData.ssaoCastDisabled = !v\n                        material.setDirty()\n                    },\n                    onChange: this.setDirty,\n                },\n            ],\n        }\n    }\n\n}\n\ndeclare module '../../core/IMaterial' {\n    interface IMaterialUserData {\n        /**\n         * Disable SSAOPlugin for this material.\n         */\n        ssaoDisabled?: boolean\n        /**\n         * Cast SSAO on other objects.\n         * if casting is not working when this is false, ensure render to depth is true, like for transparent objects\n         */\n        ssaoCastDisabled?: boolean\n    }\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {IRenderTarget} from '../../rendering'\nimport {createDiv, createStyles, getOrCall, onChange, ValOrArr, ValOrFunc} from 'ts-browser-helpers'\nimport {ShaderMaterial, SRGBColorSpace, Vector4, WebGLRenderTarget} from 'three'\nimport styles from './RenderTargetPreviewPlugin.css?inline'\nimport {CustomContextMenu} from '../../utils'\nimport {uiFolderContainer, uiToggle} from 'uiconfig.js'\nimport {ITexture} from '../../core'\nimport {ExtendedCopyPass} from '../../postprocessing'\n\nexport interface RenderTargetBlock {\n    target: ValOrFunc<IRenderTarget|{texture?: ValOrArr<ITexture>, textures?: ITexture[]}|undefined|null>\n    name: string\n    visible: boolean\n    transparent: boolean\n    originalColorSpace: boolean\n    div: HTMLDivElement\n    material?: ShaderMaterial // see ExtendedCopyPass\n    textureIndex?: number // for MRT targets — which texture to preview/export\n}\n\n/**\n * RenderTargetPreviewPlugin is a useful development and debugging plugin that renders any registered render-target to the screen in small collapsable panels.\n *\n * @category Plugins\n */\n@uiFolderContainer('Render Target Preview Plugin')\nexport class RenderTargetPreviewPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'RenderTargetPreviewPlugin'\n\n    @uiToggle('Enabled')\n    @onChange(RenderTargetPreviewPlugin.prototype.refreshUi) enabled = true\n    toJSON: any = null\n\n    mainDiv: HTMLDivElement = createDiv({id: 'RenderTargetPreviewPluginContainer', addToBody: false})\n    stylesheet?: HTMLStyleElement\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n\n    targetBlocks: RenderTargetBlock[] = []\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n\n        viewer.addEventListener('postRender', this._postRender)\n        this.stylesheet = createStyles(styles, viewer.container)\n        this.refreshUi()\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        viewer.removeEventListener('postRender', this._postRender)\n        this.stylesheet?.remove()\n        this.stylesheet = undefined\n        this.refreshUi()\n        super.onRemove(viewer)\n    }\n\n    private _postRender = () => {\n        if (!this._viewer) return\n\n        for (const targetBlock of this.targetBlocks) {\n            if (!targetBlock.visible) continue\n            const rt = getOrCall(targetBlock.target)\n            if (!rt) {\n                // todo draw white or pink\n                continue\n            }\n            const rect = targetBlock.div.getBoundingClientRect()\n            let tex = targetBlock.textureIndex !== undefined && (rt as any).textures?.[targetBlock.textureIndex]\n                ? (rt as any).textures[targetBlock.textureIndex]\n                : rt.texture\n            const canvasRect = this._viewer.canvas.getBoundingClientRect()\n            rect.x = rect.x - canvasRect.x\n            rect.y = canvasRect.height + canvasRect.y - rect.y - rect.height\n            if (Array.isArray(tex)) {\n                tex = tex[0]\n            }\n            const outputColorSpace = this._viewer.renderManager.webglRenderer.outputColorSpace\n            if (!targetBlock.originalColorSpace) this._viewer.renderManager.webglRenderer.outputColorSpace = SRGBColorSpace\n            this._viewer.renderManager.blit(null, {\n                source: tex,\n                clear: !targetBlock.transparent,\n                // transparent: targetBlock.transparent, // todo\n                respectColorSpace: !targetBlock.originalColorSpace,\n                viewport: new Vector4(rect.x, rect.y, rect.width, rect.height),\n                material: targetBlock.material,\n            })\n            this._viewer.renderManager.webglRenderer.outputColorSpace = outputColorSpace\n        }\n    }\n\n    /**\n     *\n     * @param target - render target or a function that returns a render target\n     * @param name - name of the target\n     * @param transparent - if true, the target will be rendered with transparency\n     * @param originalColorSpace - if true, the target will be rendered in its original color space\n     * @param visible - initial visibility\n     * @param material - snippet for {@link ExtendedCopyPass} or a custom {@link ExtendedShaderMaterial} or three.js ShaderMaterial. Example to read just the red channel `(s)=>s + ' = vec4(' + s + '.r);'`\n     */\n    addTarget(target: RenderTargetBlock['target'], name: string, transparent = false, originalColorSpace = false, visible = true, material?: ValOrFunc<string, [string]> | ShaderMaterial, textureIndex?: number): this {\n        if (!target) return this\n        const div = document.createElement('div')\n        const targetDef: RenderTargetBlock = {target, name, transparent, div, originalColorSpace, visible, textureIndex}\n        if (material) targetDef.material = (material as ShaderMaterial)?.isMaterial ? material as ShaderMaterial : new ExtendedCopyPass(material as any).material\n\n        div.classList.add('RenderTargetPreviewPluginTarget')\n        if (!targetDef.visible) div.classList.add('RenderTargetPreviewPluginCollapsed')\n        const header = document.createElement('div')\n        header.classList.add('RenderTargetPreviewPluginTargetHeader')\n        header.innerText = name\n        header.onclick = () => {\n            targetDef.visible = !targetDef.visible\n            if (!targetDef.visible) div.classList.add('RenderTargetPreviewPluginCollapsed')\n            else div.classList.remove('RenderTargetPreviewPluginCollapsed')\n            this._viewer?.setDirty()\n        }\n        header.oncontextmenu = (e) => {\n            e.preventDefault()\n            e.stopPropagation()\n            CustomContextMenu.Create({\n                'Download': () => this.downloadTarget(target, textureIndex),\n                'Remove': () => this.removeTarget(target),\n            }, e.clientX, e.clientY)\n        }\n        div.appendChild(header)\n        this.mainDiv.appendChild(div)\n        this.targetBlocks.push(targetDef)\n        this.refreshUi()\n        // todo auto remove target on dispose?\n        return this\n    }\n\n    removeTarget(target: RenderTargetBlock['target']): this {\n        const index = this.targetBlocks.findIndex(t => t.target === target)\n        if (index >= 0) {\n            const t = this.targetBlocks[index]\n            this.targetBlocks.splice(index, 1)\n            t.div.remove()\n        }\n        this.refreshUi()\n        return this\n    }\n    downloadTarget(target1: RenderTargetBlock['target'], textureIndex?: number): this {\n        if (!this._viewer) return this\n        const target = getOrCall(target1)\n        if (!target) return this\n        const blob = this._viewer.renderManager.exportRenderTarget(target as WebGLRenderTarget, 'auto', textureIndex ?? 0)\n        this._viewer.exportBlob(blob, 'renderTarget.' + (blob.ext || 'png'))\n        return this\n    }\n\n    refreshUi(): void {\n        if (!this.mainDiv) return\n        if (!this._viewer) {\n            if (this.mainDiv.parentElement) this.mainDiv.remove()\n            this.mainDiv.style.display = 'none'\n            this.mainDiv.style.zIndex = '1000'\n            return\n        }\n        if (!this.mainDiv.parentElement) this._viewer.container?.appendChild(this.mainDiv)\n        this.mainDiv.style.display = !this.isDisabled() ? 'flex' : 'none'\n        this.mainDiv.style.zIndex = parseInt(this._viewer.canvas.style.zIndex || '0') + 1 + ''\n        this._viewer?.setDirty()\n    }\n\n    setDirty() { // for enable/disable functions\n        this.refreshUi()\n    }\n\n    dispose() {\n        for (const target of this.targetBlocks) {\n            this.removeTarget(target.target)\n        }\n        super.dispose()\n    }\n\n}\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {createDiv, createStyles, getOrCall, onChange, ValOrFunc} from 'ts-browser-helpers'\nimport styles from './GeometryUVPreviewPlugin.css?inline'\nimport {CustomContextMenu} from '../../utils'\nimport {uiFolderContainer, uiToggle} from 'uiconfig.js'\nimport {IGeometry} from '../../core'\nimport {UVsDebug} from 'three/examples/jsm/utils/UVsDebug.js'\n\nexport interface TargetBlock {\n    target: ValOrFunc<IGeometry|undefined>\n    name: string\n    visible: boolean\n    div: HTMLDivElement\n    uvCanvas?: HTMLCanvasElement\n}\n\n@uiFolderContainer('Render Target Preview Plugin')\nexport class GeometryUVPreviewPlugin<TE extends AViewerPluginEventMap = AViewerPluginEventMap> extends AViewerPluginSync<TE> {\n    static readonly PluginType = 'GeometryUVPreviewPlugin'\n\n    @uiToggle('Enabled')\n    @onChange(GeometryUVPreviewPlugin.prototype.refreshUi) enabled = true\n    toJSON: any = null\n\n    mainDiv: HTMLDivElement = createDiv({id: 'GeometryUVPreviewPluginContainer', addToBody: false})\n    stylesheet?: HTMLStyleElement\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n\n    targetBlocks: TargetBlock[] = []\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n\n        viewer.addEventListener('postRender', this._postRender)\n        this.stylesheet = createStyles(styles, viewer.container)\n        this.refreshUi()\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        viewer.removeEventListener('postRender', this._postRender)\n        this.stylesheet?.remove()\n        this.stylesheet = undefined\n        this.refreshUi()\n        super.onRemove(viewer)\n    }\n\n    private _postRender = () => {\n        if (!this._viewer) return\n\n        for (const target of this.targetBlocks) {\n            if (!target.visible) continue\n            const geo = getOrCall(target.target)\n            if (!geo?.attributes?.uv) {\n                // todo draw white or pink\n                continue\n            }\n            if (!target.uvCanvas) {\n                target.uvCanvas = UVsDebug(geo, 1024)\n                target.uvCanvas.style.width = '100%'\n                target.uvCanvas.style.height = '100%'\n            }\n            if (target.uvCanvas && target.uvCanvas.parentElement !== target.div) target.div.appendChild(target.uvCanvas)\n        }\n    }\n\n    addGeometry(target: ValOrFunc<IGeometry|undefined>, name: string, visible = true): this {\n        if (!target) return this\n        const div = document.createElement('div')\n        const targetDef: TargetBlock = {target, name, div, visible}\n        div.classList.add('GeometryUVPreviewPluginTarget')\n        if (!targetDef.visible) div.classList.add('GeometryUVPreviewPluginCollapsed')\n        const header = document.createElement('div')\n        header.classList.add('GeometryUVPreviewPluginTargetHeader')\n        header.innerText = name\n        header.onclick = () => {\n            targetDef.visible = !targetDef.visible\n            if (!targetDef.visible) div.classList.add('GeometryUVPreviewPluginCollapsed')\n            else div.classList.remove('GeometryUVPreviewPluginCollapsed')\n            this._viewer?.setDirty()\n        }\n        header.oncontextmenu = (e) => {\n            e.preventDefault()\n            e.stopPropagation()\n            CustomContextMenu.Create({\n                'Download': () => this.downloadGeometryUV(targetDef),\n                'Remove': () => this.removeGeometry(target),\n            }, e.clientX, e.clientY)\n        }\n        div.appendChild(header)\n        this.mainDiv.appendChild(div)\n        this.targetBlocks.push(targetDef)\n        this.refreshUi()\n        return this\n    }\n\n    removeGeometry(target: ValOrFunc<IGeometry|undefined>): this {\n        const index = this.targetBlocks.findIndex(t => t.target === target)\n        if (index >= 0) {\n            const t = this.targetBlocks[index]\n            this.targetBlocks.splice(index, 1)\n            t.div.remove()\n        }\n        this.refreshUi()\n        return this\n    }\n\n    downloadGeometryUV(targetDef: TargetBlock): this {\n        if (!this._viewer) return this\n        if (!targetDef.uvCanvas) return this\n        const canvas = targetDef.uvCanvas\n        const url = canvas.toDataURL('image/png')\n        const link = document.createElement('a')\n        document.body.appendChild(link)\n        link.style.display = 'none'\n        link.href = url\n        link.download = 'renderTarget.' + 'png'\n        link.click()\n        document.body.removeChild(link)\n        URL.revokeObjectURL(url)\n        return this\n    }\n\n    refreshUi(): void {\n        if (!this.mainDiv) return\n        if (!this._viewer) {\n            if (this.mainDiv.parentElement) this.mainDiv.remove()\n            this.mainDiv.style.display = 'none'\n            this.mainDiv.style.zIndex = '1000'\n            return\n        }\n        if (!this.mainDiv.parentElement) this._viewer.container?.appendChild(this.mainDiv)\n        this.mainDiv.style.display = !this.isDisabled() ? 'flex' : 'none'\n        this.mainDiv.style.zIndex = parseInt(this._viewer.canvas.style.zIndex || '0') + 1 + ''\n        this._viewer?.setDirty()\n    }\n\n    setDirty() { // for enable/disable functions\n        this.refreshUi()\n    }\n\n    dispose() {\n        for (const target of this.targetBlocks) {\n            this.removeGeometry(target.target)\n        }\n        super.dispose()\n    }\n\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {serialize} from 'ts-browser-helpers'\n\n/**\n * Viewer UI Config Plugin\n *\n * Just a plugin wrapper over the `viewer.uiConfig\n *\n * @category Plugins\n */\nexport class ViewerUiConfigPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'ViewerUiConfigPlugin'\n    enabled = true\n    serializeWithViewer = false\n    constructor() {\n        super()\n        this.uiConfig = {}\n    }\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this.uiConfig = viewer.uiConfig\n        this.uiConfig.expanded = true\n    }\n\n    @serialize('viewer')\n    declare protected _viewer: ThreeViewer | undefined // todo: fix deserialization throwing error\n\n    // toJSON(): any {\n    //     return this._viewer?.toJSON() ?? {}\n    // }\n    // fromJSON(data: ISerializedViewerConfig, meta?: SerializationMetaType): this | null {\n    //     this._viewer?.fromJSON(data, meta)\n    //     return this\n    // }\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {serialize} from 'ts-browser-helpers'\nimport {RootScene} from '../../core'\n\nexport class SceneUiConfigPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'SceneUiConfigPlugin'\n    enabled = true\n    serializeWithViewer = false\n    constructor() {\n        super()\n        this.uiConfig = {}\n    }\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this.uiConfig = viewer.scene.uiConfig\n        this._scene = viewer.scene\n    }\n    @serialize('scene')\n    protected _scene: RootScene | undefined\n}\n","import {uiButton, uiFolderContainer} from 'uiconfig.js'\nimport {AViewerPluginEventMap, AViewerPluginSync} from '../../viewer'\n\nexport interface FullScreenPluginEventMap extends AViewerPluginEventMap{\n    enter: object\n    exit: object\n}\n\n/**\n * Full Screen Plugin\n *\n * A simple plugin that provides functions to {@link enter}, {@link exit}, {@link toggle} full screen mode and check if the viewer is in full screen mode with {@link isFullScreen}.\n *\n * Implementation from:\n * https://stackoverflow.com/questions/50568474/how-to-enter-fullscreen-in-three-js\n *\n * @todo: try out some lib like https://github.com/sindresorhus/screenfull for proper cross browser support\n * @category Plugins\n */\n@uiFolderContainer('Full Screen')\nexport class FullScreenPlugin extends AViewerPluginSync<FullScreenPluginEventMap> {\n    public static readonly PluginType = 'FullScreenPlugin'\n\n    toJSON: any = undefined\n\n    enabled = true\n\n    constructor() {\n        super()\n        this.enter = this.enter.bind(this)\n        this.exit = this.exit.bind(this)\n    }\n\n    private _lastSize = ['100%', '100%']\n    private _lastFsElement: any = null\n\n    private _fsChangeHandler = (_: Event) => {\n        if (this.isFullScreen()) {\n            /* Run code when going to fs mode */\n            this.dispatchEvent({type: 'enter'})\n\n        } else {\n            /* Run code when going back from fs mode */\n            const elem = this._lastFsElement || this._viewer?.canvas\n            if (elem) {\n                elem.style.width = this._lastSize[0]\n                elem.style.height = this._lastSize[1]\n            }\n\n            document.removeEventListener('webkitfullscreenchange', this._fsChangeHandler, false)\n            document.removeEventListener('mozfullscreenchange', this._fsChangeHandler, false)\n            document.removeEventListener('fullscreenchange', this._fsChangeHandler, false)\n            document.removeEventListener('MSFullscreenChange', this._fsChangeHandler, false)\n\n            this.dispatchEvent({type: 'exit'})\n        }\n    }\n\n    @uiButton('Enter FullScreen', {sendArgs: false})\n    async enter(element?: HTMLElement): Promise<void> {\n        if (this.isFullScreen()) return\n\n        const elem = element || this._viewer?.canvas as any\n\n        if (!elem) return\n\n        this._lastFsElement = elem\n\n        if (document.addEventListener) {\n            document.addEventListener('webkitfullscreenchange', this._fsChangeHandler, false)\n            document.addEventListener('mozfullscreenchange', this._fsChangeHandler, false)\n            document.addEventListener('fullscreenchange', this._fsChangeHandler, false)\n            document.addEventListener('MSFullscreenChange', this._fsChangeHandler, false)\n        }\n\n        this._lastSize = [elem.style.width, elem.style.height]\n        elem.style.width = '100%'\n        elem.style.height = '100%'\n\n        if (elem.requestFullscreen) {\n            return elem.requestFullscreen()\n        } else if (elem.mozRequestFullScreen) { /* Firefox */\n            return elem.mozRequestFullScreen()\n        } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari & Opera */\n            return elem.webkitRequestFullscreen()\n        } else if (elem.msRequestFullscreen) { /* IE/Edge */\n            return elem.msRequestFullscreen()\n        }\n    }\n    @uiButton('Exit FullScreen', {sendArgs: false})\n    async exit(): Promise<void> {\n        if (document.exitFullscreen) {\n            return document.exitFullscreen()\n        } else if ((document as any).mozCancelFullScreen) { /* Firefox */\n            return (document as any).mozCancelFullScreen()\n        } else if ((document as any).webkitExitFullscreen) { /* Chrome, Safari and Opera */\n            return (document as any).webkitExitFullscreen()\n        } else if ((document as any).msExitFullscreen) { /* IE/Edge */\n            return (document as any).msExitFullscreen()\n        }\n    }\n    @uiButton('Toggle FullScreen', {sendArgs: false})\n    async toggle(element?: HTMLElement): Promise<void> {\n        if (this.isFullScreen()) {\n            return this.exit()\n        } else {\n            return this.enter(element)\n        }\n    }\n\n    isFullScreen() {\n        return (document as any).webkitIsFullScreen ||\n            (document as any).mozFullScreen ||\n            (document as any).msFullscreenElement !== undefined\n    }\n}\n","import {createDiv, createStyles, escapeHtml, onChange, serialize, timeout} from 'ts-browser-helpers'\nimport styles from './LoadingScreenPlugin.css?inline'\nimport spinner1 from './loaders/spinner1.css?inline'\nimport {uiButton, uiDropdown, uiFolderContainer, uiInput, uiSlider, uiToggle} from 'uiconfig.js'\nimport {AAssetManagerProcessStatePlugin} from '../base/AAssetManagerProcessStatePlugin'\nimport {ThreeViewer} from '../../viewer'\n\n/**\n * Loading Screen Plugin\n *\n * Shows a configurable loading screen overlay over the canvas.\n *\n * @category Plugins\n */\n@uiFolderContainer('Loading Screen')\nexport class LoadingScreenPlugin extends AAssetManagerProcessStatePlugin {\n    public static readonly PluginType = 'LoadingScreenPlugin'\n\n    styles = styles\n\n    spinners = [{\n        styles: spinner1,\n        html: '<span class=\"loader\"></span>',\n    }]\n    refresh() {\n        if (!this._viewer) return\n        this._updateMainDiv(this._isPreviewing ? this._previewState : this._viewer.assetManager.processState, false)\n    }\n\n    @uiDropdown('Loader', ['Spinner 1'].map((v, i) => ({value: i, label: v})))\n    @serialize() loader = 0\n\n    @uiInput('Loading text header')\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() loadingTextHeader = 'Loading Files'\n    @uiInput('Error text header')\n    @serialize() errorTextHeader = 'Error Loading Files'\n\n    @uiToggle('Show file names')\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() showFileNames = true\n\n    @uiToggle('Show process states')\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() showProcessStates = true\n\n    @uiToggle('Show progress')\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() showProgress = true\n\n    @uiToggle('Hide on only errors')\n    @serialize() hideOnOnlyErrors = true\n    @uiToggle('Hide on files load')\n    @serialize() hideOnFilesLoad = true\n    @uiToggle('Hide on scene object load')\n    @serialize() hideOnSceneObjectLoad = false\n    /**\n     * Minimize when scene has objects\n     * Note: also checks for scene.environment and doesnt minimize when environment is null or undefined\n     * @default true\n     */\n    @uiToggle('Minimize on scene object load')\n    @serialize() minimizeOnSceneObjectLoad = true\n\n    @uiToggle('Show when files start loading')\n    @serialize() showOnFilesLoading = true\n    @uiToggle('Show when scene empty')\n    @serialize() showOnSceneEmpty = true\n\n    @uiInput('Hide delay (ms)')\n    @serialize() hideDelay = 500\n\n    @uiSlider('Background Opacity', [0, 1])\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() backgroundOpacity = 0.5\n\n    @uiSlider('Background Blur', [0, 100])\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() backgroundBlur = 24\n\n    @uiInput('Background Color')\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() background = '#ffffff'\n\n    @uiInput('Text Color')\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() textColor = '#222222'\n\n    /**\n     * Default logo image shown during loading\n     * @default 'https://threepipe.org/logo.svg'\n     */\n    static LS_DEFAULT_LOGO = 'https://threepipe.org/logo.svg'\n\n    @uiInput('Logo Image')\n    @onChange(LoadingScreenPlugin.prototype.refresh)\n    @serialize() logoImage = LoadingScreenPlugin.LS_DEFAULT_LOGO\n\n    private _isPreviewing = false\n    private _previewState = new Map([['file.glb', {state: 'downloading', progress: 50}], ['environment.hdr', {state: 'adding'}]])\n\n    @uiButton('Toggle preview')\n    togglePreview() {\n        this.maximize()\n        this._isPreviewing = !this._isPreviewing\n        this.refresh()\n        if (this._isPreviewing)\n            this.show()\n        else\n            this.hideWithDelay()\n    }\n\n    loadingElement = createDiv({classList: ['loadingScreenLoadingElement'], addToBody: false})\n    filesElement = createDiv({classList: ['loadingScreenFilesElement'], addToBody: false})\n    logoElement = createDiv({classList: ['loadingScreenLogoElement'], addToBody: false})\n\n    constructor(container?: HTMLElement) {\n        super('LoadingScreen', container)\n        // const popupClose = createDiv({\n        //     id: 'assetManagerLoadingScreenClose',\n        //     addToBody: false,\n        //     innerHTML: '&#10005',\n        // })\n        // popupClose.addEventListener('click', () => {\n        //     this._mainDiv.style.display = 'none'\n        // })\n        // this._mainDiv.appendChild(popupClose)\n\n        this._mainDiv.prepend(this.loadingElement)\n        this._mainDiv.prepend(this.logoElement)\n        this._mainDiv.appendChild(this.filesElement)\n    }\n\n    private _isHidden = false\n\n    get visible() {\n        return !this._isHidden\n    }\n\n    async hide() {\n        this._isHidden = true\n        this._mainDiv.style.opacity = '0'\n        await timeout(502)\n        if (this._isHidden) {\n            this._mainDiv.style.display = 'none'\n            this._showMainDiv()\n        }\n    }\n    async hideWithDelay() {\n        this._isHidden = true\n        await timeout(this.hideDelay)\n        if (!this._isHidden) return\n        return this.hide()\n    }\n    show() {\n        if (!this._isHidden) return\n        this._isHidden = false\n        this._showMainDiv()\n        this._mainDiv.style.display = 'flex'\n    }\n\n    protected _showMainDiv() {\n        // this._mainDiv.style.opacity = this.opacity.toString()\n        this._mainDiv.style.opacity = '1'\n    }\n    @uiButton('Minimize')\n    minimize() {\n        this._mainDiv.classList.add('minimizedLoadingScreen')\n        if (!this.showFileNames) this.loadingElement.style.display = 'block'\n    }\n    @uiButton('Maximize')\n    maximize() {\n        this._mainDiv.classList.remove('minimizedLoadingScreen')\n        this.loadingElement.style.display = ''\n    }\n\n    private _temp = document.createElement('template')\n    private _setHTML(elem: HTMLElement, html:string) {\n        this._temp.innerHTML = html\n        // Compare the parsed content instead of raw strings, as browsers might change html after setting.\n        if (this._temp.innerHTML.trim() !== elem.innerHTML.trim()) elem.innerHTML = html\n    }\n\n    protected _updateMainDiv(processState: Map<string, {state: string, progress?: number|undefined}>, updateVisibility = true) {\n        if (!this._viewer) return\n        if (!this._contentDiv) return\n        if (!this.enabled) {\n            this._mainDiv.style.display = 'none'\n            return\n        }\n        if (this.showFileNames) {\n            let text = ''\n            processState.forEach((v, k) => {\n                text += (this.showProcessStates ? `<span class=\"loadingScreenProcessState\">${escapeHtml(v.state)}</span>: ` : '') +\n                    escapeHtml((k || '').split('/').pop() || '') +\n                    (this.showProgress && v.progress ? ' - ' + (v.progress.toFixed(0) + '%') : '') +\n                    '<br>'\n            })\n            this._setHTML(this.filesElement, text)\n        } else {\n            this._setHTML(this.filesElement, '')\n        }\n        const errors = [...processState.values()].filter(v => v.state === 'error')\n        if (errors.length > 0 && errors.length === processState.size && !this.hideOnOnlyErrors) {\n            this._setHTML(this._contentDiv, escapeHtml(this.errorTextHeader))\n        } else {\n            this._setHTML(this._contentDiv, escapeHtml(this.loadingTextHeader))\n        }\n        this._setHTML(this.loadingElement, this.spinners[this.loader].html)\n        this._mainDiv.style.setProperty('--b-opacity', this.backgroundOpacity.toString())\n        this._mainDiv.style.setProperty('--b-background', this.background)\n        this._mainDiv.style.setProperty('--b-blur', this.backgroundBlur + 'px')\n        // ;(this._mainDiv.style as any).backdropFilter = `blur(${this.backgroundBlur}px)`\n        this._mainDiv.style.color = this.textColor\n        this._setHTML(this.logoElement, this.logoImage ? `<img class=\"loadingScreenLogoImage\" src=${JSON.stringify(this.logoImage)}/>` : '')\n        if (updateVisibility) {\n            this._updateVisibility(processState, errors.length)\n        }\n    }\n\n    protected _updateVisibility(processState: Map<string, {state: string, progress?: number|undefined}>, errors: number) {\n        if (!this._viewer) return false\n        if (this.hideOnFilesLoad && (processState.size === 0 ||\n            errors === processState.size && this.hideOnOnlyErrors) && !this._isHidden) {\n            this.hideDelay ? this.hideWithDelay() : this.hide()\n            return true\n        } else if (processState.size > 0 && this.showOnFilesLoading && this._isHidden) {\n            const sceneObjects = this._viewer.scene.modelRoot.children\n            if (sceneObjects.length > 0 && this.minimizeOnSceneObjectLoad && this._viewer.scene.environment) this.minimize()\n            else this.maximize()\n            this.show()\n            return true\n        }\n        return false\n    }\n\n    // disables showOnSceneEmpty\n    isEditor = false\n\n    private _sceneUpdate = (e: any) => {\n        if (!this._viewer) return\n        if (!e.hierarchyChanged) return\n        const sceneObjects = this._viewer.scene.modelRoot.children\n        if (sceneObjects.length === 0 && this.showOnSceneEmpty && !this.isEditor) {\n            this.show()\n        }\n        if (sceneObjects.length > 0) {\n            // case - objects loaded, clear current scene, load loaded objects\n            // load - process state 0, hide with delay. clear scene shows loading screen, loading current object doesnt change process state...\n            const processState = this._viewer.assetManager.processState\n            const errors = [...processState.values()].filter(v => v.state === 'error')\n            if (!this._updateVisibility(processState, errors.length)) {\n                if (this.hideOnSceneObjectLoad)\n                    this.hideWithDelay()\n                else if (this.minimizeOnSceneObjectLoad && this._viewer.scene.environment)\n                    timeout(this.hideDelay + 300).then(() => this.minimize())\n            }\n        } else if (this.minimizeOnSceneObjectLoad)\n            this.maximize()\n    }\n\n    stylesheet?: HTMLStyleElement\n    stylesheetLoader?: HTMLStyleElement[]\n    onAdded(viewer: ThreeViewer) {\n        this.stylesheet = createStyles(this.styles, viewer.container)\n        this.stylesheetLoader = this.spinners.map(s => createStyles(s.styles, viewer.container))\n\n        viewer.scene.addEventListener('sceneUpdate', this._sceneUpdate)\n        super.onAdded(viewer)\n    }\n    onRemove(viewer: ThreeViewer) {\n        viewer.scene.removeEventListener('sceneUpdate', this._sceneUpdate)\n        this.stylesheet?.remove()\n        this.stylesheet = undefined\n        this.stylesheetLoader?.forEach(s => s.remove())\n        this.stylesheetLoader = undefined\n        return super.onRemove(viewer)\n    }\n}\n\n","import {Sphere} from 'three'\nimport {Box3B} from '../math/Box3B'\nimport {Group2, IMaterial, IObject3D, IWidget, RootScene} from '../../core'\n\nexport class SelectionWidget extends Group2 implements IWidget {\n    isWidget = true as const\n    assetType = 'widget' as const\n\n    private _object: IObject3D | null = null\n    boundingScaleMultiplier = 1.\n\n    lineMaterial?: IMaterial\n\n    protected _updater() {\n        const selected: IObject3D | null | undefined = this._object\n        if (selected) {\n            const bbox = new Box3B().expandByObject(selected, false)\n            bbox.getCenter(this.position)\n            let scale = bbox.getBoundingSphere(new Sphere()).radius\n            if (scale <= 0) { // It could be a light or camera with no geometry\n                selected.getWorldPosition(this.position)\n                scale = 0.1\n            }\n            this.scale.setScalar(scale * this.boundingScaleMultiplier).clampScalar(0.01, 1e8)\n            this.setVisible(true)\n        } else {\n            this.setVisible(false)\n        }\n\n    }\n\n    constructor() {\n        super()\n\n        this.position.set(0, 0, 0)\n\n        this.visible = false\n        this.renderOrder = 100 // Don't draw too early, thus obscuring other transparent objects\n\n        this.userData.bboxVisible = false\n\n        this._updater = this._updater.bind(this)\n        this.detach = this.detach.bind(this)\n\n        this.addEventListener('dispose', this.detach)\n    }\n\n    setVisible(v: boolean) {\n        if (v !== this.visible) {\n            this.visible = v\n            this.setDirty?.({sceneUpdate: false})\n        }\n    }\n\n    attach(object: IObject3D): this {\n        this.detach()\n        let inScene = false\n        object.traverseAncestors(c=>(c as RootScene).isRootScene && (inScene = true))\n        if (!inScene) {\n            // console.warn('SelectionWidget: attached object must be in the scene')\n            return this\n        }\n        if (!object) return this\n        this._object = object\n        // todo object update doesnt work on child when parent is updated, better is to subscribe to objectUpdate of the scene and see if the attached object is in the child of the updated object, also throttle update to once per frame\n        this._object.addEventListener('objectUpdate', this._updater)\n        this._object.addEventListener('geometryUpdate', this._updater)\n        this._updater()\n        return this\n    }\n\n    detach(): this {\n        if (!this._object) return this\n        this._object?.removeEventListener('objectUpdate', this._updater)\n        this._object?.removeEventListener('geometryUpdate', this._updater)\n        this._object = null\n        this._updater()\n        return this\n    }\n\n    get object(): IObject3D | null {\n        return this._object\n    }\n}\n\n","import {Object3D, PerspectiveCamera} from 'three'\nimport {generateUiFolder, IUiConfigContainer, uiToggle} from 'uiconfig.js'\nimport {Group2, iObjectCommons, IWidget} from '../../core'\nimport {onChange2} from 'ts-browser-helpers'\n\n/**\n * Abstract base class for helper widgets that visualize scene objects.\n * Provides event-driven lifecycle (attach/detach/update) and UI integration.\n * See https://threepipe.org/notes/widgets-and-helpers for the full widget system documentation.\n */\nexport abstract class AHelperWidget extends Group2 implements IWidget {\n    isWidget = true as const\n    assetType = 'widget' as const\n\n    object: (Object3D & IUiConfigContainer) | undefined\n\n    @uiToggle()\n    @onChange2(AHelperWidget.prototype.update)\n        visible = true\n\n    protected constructor(object: Object3D & IUiConfigContainer, attach = true) {\n        super()\n        this.object = object\n        this.object.updateMatrixWorld()\n        if ((this.object as PerspectiveCamera).updateProjectionMatrix)\n            (this.object as PerspectiveCamera).updateProjectionMatrix()\n\n        this.matrix = object.matrixWorld\n        this.matrixAutoUpdate = false\n\n        // this.userData.bboxVisible = false // todo autoNearFar?\n\n        this.detach = this.detach.bind(this)\n        this._objectUpdate = this._objectUpdate.bind(this)\n        this._objectBeforeRender = this._objectBeforeRender.bind(this)\n        attach && this.attach(object)\n        this.traverse(o => {\n            o.userData.__keepShadowDef = true\n            o.castShadow = false\n            o.receiveShadow = false\n        })\n        this.renderOrder = 100\n\n    }\n\n    update(setDirty = true) {\n        setDirty && iObjectCommons.setDirty.call(this)\n    }\n\n    private _objectUpdated = false\n    protected _objectUpdate() {\n        this._objectUpdated = true\n    }\n    // todo in threejs onbeforerender is not called on objects, lights etc, only meshes and scene, see ALightHelperWidget and skeleton helper\n    protected _objectBeforeRender() {\n        if (!this.visible) return\n        if (!this._objectUpdated) return\n        this._objectUpdated = false\n        if (this.object) this.update()\n    }\n\n    attach(object: Object3D): this {\n        if (this.object) this.detach()\n        this.object = object\n        if (this.object) {\n            this.update()\n            this.object.addEventListener('beforeRender', this._objectBeforeRender)\n            this.object.addEventListener('objectUpdate', this._objectUpdate)\n            this.object.addEventListener('geometryUpdate', this._objectUpdate)\n            this.uiConfig && this.object.uiConfig?.children?.push(this.uiConfig)\n            this.visible = true\n        }\n        return this\n    }\n\n    detach(): this {\n        if (!this.object) return this\n        this.object.removeEventListener('beforeRender', this._objectBeforeRender)\n        this.object.removeEventListener('objectUpdate', this._objectUpdate)\n        this.object.removeEventListener('geometryUpdate', this._objectUpdate)\n        if (this.uiConfig) {\n            const i = this.object.uiConfig?.children?.indexOf(this.uiConfig)\n            if (i !== undefined && i >= 0)\n                this.object.uiConfig?.children?.splice(i, 1)\n        }\n        this.object = undefined\n        this.visible = false\n        return this\n    }\n\n    uiConfig = generateUiFolder('Widget', this, {tags: 'widget'})\n\n    dispose() {\n        this.detach()\n    }\n}\n\n","import {Camera, Object3D} from 'three'\nimport {IUiConfigContainer} from 'uiconfig.js'\nimport {AHelperWidget} from './AHelperWidget'\n\nexport abstract class ACameraHelperWidget extends AHelperWidget {\n    camera: (Camera & IUiConfigContainer) | undefined\n    protected constructor(object: Camera & IUiConfigContainer) {\n        super(object)\n        this.camera = object\n        this.traverse(o => {\n            o.userData.__keepShadowDef = true\n            o.castShadow = false\n            o.receiveShadow = false\n        })\n    }\n\n    preRender() { // req because its a camera\n        if (!this.visible) return\n        this._objectBeforeRender()\n    }\n\n    attach(object: Object3D): this {\n        super.attach(object)\n        // listening to cameraUpdate is not needed here\n        return this\n    }\n\n    detach(): this {\n        return super.detach()\n    }\n\n}\n","import {Light} from 'three'\nimport {IUiConfigContainer} from 'uiconfig.js'\nimport {AHelperWidget} from './AHelperWidget'\n\nexport abstract class ALightHelperWidget extends AHelperWidget {\n\n    light: (Light & IUiConfigContainer)|undefined\n    protected constructor(object: Light & IUiConfigContainer) {\n        super(object)\n        this.light = object\n        this.traverse(o => {\n            o.userData.__keepShadowDef = true\n            o.castShadow = false\n            o.receiveShadow = false\n        })\n    }\n\n    preRender() { // req because its a light\n        if (!this.visible) return\n        this._objectBeforeRender()\n    }\n}\n","import {Bone, Color, ColorRepresentation, Matrix4, Object3D, Vector3} from 'three'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {LineSegmentsGeometry} from 'three/examples/jsm/lines/LineSegmentsGeometry.js'\nimport {onChange2} from 'ts-browser-helpers'\nimport {AHelperWidget} from './AHelperWidget'\nimport {IUiConfigContainer, uiColor, uiSlider, uiToggle} from 'uiconfig.js'\nimport {LineMaterial2} from '../../core'\n\nexport class BoneHelper extends AHelperWidget {\n    lineSegments: LineSegments2\n    declare object: (Bone & IUiConfigContainer) | undefined\n\n    private _vector = new Vector3()\n    private _boneMatrix = new Matrix4()\n    private _matrixWorldInv = new Matrix4()\n\n    @onChange2(BoneHelper.prototype.update)\n        hMaterial: LineMaterial2\n\n    @onChange2(BoneHelper.prototype.update)\n    @uiSlider(undefined, [0.1, 20], 0.01)\n        lineWidth = 5\n\n    @onChange2(BoneHelper.prototype.update)\n    @uiColor()\n        color1: Color = new Color(0, 0, 1)\n\n    @onChange2(BoneHelper.prototype.update)\n    @uiColor()\n        color2: Color = new Color(0, 1, 0)\n\n    @uiToggle()\n    @onChange2(BoneHelper.prototype.update)\n        autoUpdate = true // todo this shoudn't be needed, always update on before render\n\n    constructor(bone: Bone, color1?: ColorRepresentation, color2?: ColorRepresentation) {\n        super(bone)\n\n        if (color1) this.color1.set(color1)\n        if (color2) this.color2.set(color2)\n\n        // Create geometry and hMaterial\n        const geometry = new LineSegmentsGeometry()\n\n        this.hMaterial = new LineMaterial2({\n            vertexColors: true,\n            linewidth: this.lineWidth,\n            worldUnits: false,\n            dashed: false,\n            alphaToCoverage: true,\n            toneMapped: false,\n            transparent: true,\n            depthTest: true,\n            depthWrite: false,\n        })\n        this.hMaterial.userData.renderToGBuffer = false\n        this.hMaterial.userData.renderToDepth = false\n\n        this.lineSegments = new LineSegments2(geometry, this.hMaterial)\n        this.lineSegments.frustumCulled = false\n        this.add(this.lineSegments)\n\n        this.matrix = bone.matrixWorld\n        this.matrixAutoUpdate = false\n\n        this.update()\n    }\n\n    updateMatrixWorld(force?: boolean) {\n        if (this.object) this.autoUpdate && this.update(false)\n        super.updateMatrixWorld(force)\n    }\n\n    update(setDirty = true) {\n        if (!this.lineSegments || !this.object) return\n\n        const bone = this.object as Bone\n\n        // Update hMaterial properties\n        this.hMaterial.linewidth = this.lineWidth\n\n        const vertices: number[] = []\n        const colors: number[] = []\n\n        this._matrixWorldInv.copy(bone.matrixWorld).invert()\n\n        // Only render line if bone has a parent bone\n        if (bone.parent && (bone.parent as any).isBone) {\n            // Parent position\n            this._boneMatrix.multiplyMatrices(this._matrixWorldInv, bone.parent.matrixWorld)\n            this._vector.setFromMatrixPosition(this._boneMatrix)\n            vertices.push(this._vector.x, this._vector.y, this._vector.z)\n            colors.push(this.color1.r, this.color1.g, this.color1.b)\n\n            // Current bone position\n            this._boneMatrix.multiplyMatrices(this._matrixWorldInv, bone.matrixWorld)\n            this._vector.setFromMatrixPosition(this._boneMatrix)\n            vertices.push(this._vector.x, this._vector.y, this._vector.z)\n            colors.push(this.color2.r, this.color2.g, this.color2.b)\n        }\n\n        const geometry = this.lineSegments.geometry\n        if (vertices.length > 0) {\n            geometry.setPositions(vertices)\n            geometry.setColors(colors)\n        } else {\n            // Clear geometry properly when no line to show\n            geometry.setPositions([0, 0, 0, 0, 0, 0])\n            geometry.setColors([0, 0, 0, 0, 0, 0])\n        }\n\n        super.update(setDirty)\n    }\n\n    dispose() {\n        this.lineSegments.geometry.dispose()\n        this.lineSegments.material.dispose()\n        super.dispose()\n    }\n\n    static Check(object: Object3D): boolean {\n        return (object as any).isBone\n    }\n\n    static Create(bone: Bone): BoneHelper {\n        return new BoneHelper(bone)\n    }\n}\n","import {LineMaterial2} from '../../core/material/LineMaterial2'\nimport {Vector2} from 'three'\nimport {LineSegmentsGeometry} from 'three/examples/jsm/lines/LineSegmentsGeometry.js'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {Box3B} from '../math/Box3B'\nimport {SelectionWidget} from './SelectionWidget'\n\nexport class BoxSelectionWidget extends SelectionWidget {\n    constructor() {\n        super()\n        const matLine = new LineMaterial2({\n            color: '#ff2222' as any, transparent: true, opacity: 0.9,\n            linewidth: 5, // in pixels\n            resolution: new Vector2(1024, 1024), // to be set by renderer, eventually\n            worldUnits: false,\n            dashed: false,\n            toneMapped: false,\n            depthTest: true,\n            depthWrite: false,\n\n            allowOverride: false,\n        })\n        matLine.userData.renderToGBuffer = false\n        matLine.userData.renderToDepth = false\n        this.lineMaterial = matLine\n\n        const ls = new LineSegmentsGeometry()\n        ls.setPositions([1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1].map(v => v - 0.5))\n\n        const wireframe = new LineSegments2(ls, matLine as any)\n        wireframe.computeLineDistances()\n        wireframe.scale.set(1, 1, 1)\n        wireframe.visible = true\n        this.add(wireframe)\n    }\n\n    protected _updater() {\n        super._updater()\n        const selected = this.object\n        if (selected) {\n            const bbox = new Box3B().expandByObject(selected, false)\n            const scale = bbox.getSize(this.scale)\n            if (scale.lengthSq() <= 0) { // It could be a light or camera with no geometry\n                selected.getWorldPosition(this.position)\n                scale.set(2, 2, 2)\n            }\n            scale.multiplyScalar(this.boundingScaleMultiplier).clampScalar(0.01, 1e8)\n            this.setVisible(true)\n        }\n    }\n}\n","import {\n    Camera,\n    Color,\n    InterleavedBufferAttribute,\n    Object3D,\n    OrthographicCamera,\n    PerspectiveCamera,\n    Vector3,\n} from 'three'\nimport {ACameraHelperWidget} from './ACameraHelperWidget'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {LineSegmentsGeometry} from 'three/examples/jsm/lines/LineSegmentsGeometry.js'\nimport {LineMaterial2} from '../../core'\nimport {uiToggle} from 'uiconfig.js'\nimport {onChange2} from 'ts-browser-helpers'\n\n/**\n * Fork of CameraHelper from three.js\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\nexport class CameraHelper2 extends ACameraHelperWidget {\n    protected _vector = new Vector3()\n    protected _camera = new Camera()\n\n    line: LineSegments2\n    pointMap: Record<string, number[]>\n\n    // Store original colors for reapplication\n    private _colorFrustum = new Color(0xffaa00)\n    private _colorCone = new Color(0xff0000)\n    private _colorUp = new Color(0x00aaff)\n    private _colorTarget = new Color(0xffffff)\n    private _colorCross = new Color(0x333333)\n\n    @uiToggle()\n    @onChange2(CameraHelper2.prototype.update)\n        showFar = false\n\n    constructor(camera: PerspectiveCamera|OrthographicCamera) {\n        super(camera)\n\n        const geometry = new LineSegmentsGeometry()\n        const material = new LineMaterial2({\n            color: 0xffffff,\n            linewidth: 3, // in world units with size attenuation, pixels otherwise\n            vertexColors: true,\n            worldUnits: false,\n\n            dashed: false,\n            alphaToCoverage: true,\n\n            toneMapped: false,\n            transparent: true,\n            depthTest: true,\n            depthWrite: false,\n\n            allowOverride: false,\n        })\n        material.userData.renderToGBuffer = false\n        material.userData.renderToDepth = false\n\n        const {vertices, colors, pointMap} = generateVertices()\n\n        geometry.setPositions(vertices)\n        geometry.setColors(colors)\n\n        this.line = new LineSegments2(geometry, material)\n        this.line.frustumCulled = false\n        this.add(this.line)\n\n        this.pointMap = pointMap\n\n        this.update()\n\n        // colors\n\n        this.setColors(this._colorFrustum, this._colorCone, this._colorUp, this._colorTarget, this._colorCross)\n\n    }\n\n    setColors(frustum: Color, cone: Color, up: Color, target: Color, cross: Color) {\n\n        const geometry = this.line.geometry\n\n        const colorAttribute = geometry.getAttribute('instanceColorStart')\n        const colorAttribute2 = geometry.getAttribute('instanceColorEnd')\n\n        let i = 0\n        function setXYZ(color: Color) {\n\n            colorAttribute.setXYZ(i, color.r, color.g, color.b)\n            colorAttribute2.setXYZ(i, color.r, color.g, color.b)\n            i++\n\n        }\n\n        // up\n\n        setXYZ(up) // u1, u2\n        setXYZ(up) // u2, u3\n        setXYZ(up) // u3, u1\n\n        // cross\n\n        setXYZ(cross) // cn1, cn2\n        setXYZ(cross) // cn3, cn4\n\n        setXYZ(cross) // cf1, cf2\n        setXYZ(cross) // cf3, cf4\n\n        // near\n\n        setXYZ(frustum) // n1, n2\n        setXYZ(frustum) // n2, n4\n        setXYZ(frustum) // n4, n3\n        setXYZ(frustum) // n3, n1\n\n        // cone\n\n        setXYZ(cone) // p, n1\n        setXYZ(cone) // p, n2\n        setXYZ(cone) // p, n3\n        setXYZ(cone) // p, n4\n\n        // far\n\n        setXYZ(frustum) // f1, f2\n        setXYZ(frustum) // f2, f4\n        setXYZ(frustum) // f4, f3\n        setXYZ(frustum) // f3, f1\n\n        // sides\n\n        setXYZ(frustum) // n1, f1\n        setXYZ(frustum) // n2, f2\n        setXYZ(frustum) // n3, f3\n        setXYZ(frustum) // n4, f4\n\n        // target\n\n        setXYZ(target) // c, t\n        setXYZ(cross) // p, c\n\n\n        colorAttribute.needsUpdate = true\n        colorAttribute2.needsUpdate = true\n\n    }\n\n    update() {\n        if (!this.camera || !this.line) return\n\n        const geometry = this.line.geometry\n        const pointMap = this.pointMap\n\n        const w = 1, h = 1\n\n        // we need just camera projection matrix inverse\n        // world matrix must be identity\n\n        // eslint-disable-next-line @typescript-eslint/naming-convention\n        const {_camera, _vector} = this\n\n        ;(this.camera as PerspectiveCamera).updateProjectionMatrix()\n        _camera.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse)\n\n        // center / target\n\n        setPoint('c', pointMap, geometry, _camera, 0, 0, -1, _vector)\n        setPoint('t', pointMap, geometry, _camera, 0, 0, 1, _vector)\n\n        // near\n\n        setPoint('n1', pointMap, geometry, _camera, -w, -h, -1, _vector)\n        setPoint('n2', pointMap, geometry, _camera, w, -h, -1, _vector)\n        setPoint('n3', pointMap, geometry, _camera, -w, h, -1, _vector)\n        setPoint('n4', pointMap, geometry, _camera, w, h, -1, _vector)\n\n        // far\n\n        setPoint('f1', pointMap, geometry, _camera, -w, -h, 1, _vector)\n        setPoint('f2', pointMap, geometry, _camera, w, -h, 1, _vector)\n        setPoint('f3', pointMap, geometry, _camera, -w, h, 1, _vector)\n        setPoint('f4', pointMap, geometry, _camera, w, h, 1, _vector)\n\n        // up\n\n        setPoint('u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, -1, _vector)\n        setPoint('u2', pointMap, geometry, _camera, -w * 0.7, h * 1.1, -1, _vector)\n        setPoint('u3', pointMap, geometry, _camera, 0, h * 2, -1, _vector)\n\n        // cross\n\n        setPoint('cf1', pointMap, geometry, _camera, -w, 0, 1, _vector)\n        setPoint('cf2', pointMap, geometry, _camera, w, 0, 1, _vector)\n        setPoint('cf3', pointMap, geometry, _camera, 0, -h, 1, _vector)\n        setPoint('cf4', pointMap, geometry, _camera, 0, h, 1, _vector)\n\n        setPoint('cn1', pointMap, geometry, _camera, -w, 0, -1, _vector)\n        setPoint('cn2', pointMap, geometry, _camera, w, 0, -1, _vector)\n        setPoint('cn3', pointMap, geometry, _camera, 0, -h, -1, _vector)\n        setPoint('cn4', pointMap, geometry, _camera, 0, h, -1, _vector)\n\n        geometry.getAttribute('instanceStart').needsUpdate = true\n        geometry.getAttribute('instanceEnd').needsUpdate = true\n\n        geometry.computeBoundingBox()\n        geometry.computeBoundingSphere()\n\n        // Update colors to reflect showFar state\n        this.setColors(this._colorFrustum, this._colorCone, this._colorUp, this._colorTarget, this._colorCross)\n\n        this.line.geometry.instanceCount = this.showFar ? Infinity : 15\n\n        super.update()\n    }\n\n    dispose() {\n\n        this.line.geometry.dispose()\n        this.line.material.dispose()\n\n        super.dispose()\n    }\n\n    static Check(camera: Object3D) {\n        return (camera as any).isCamera\n    }\n    static Create(camera: Object3D) {\n        return new CameraHelper2(camera as any)\n    }\n\n}\n\n\nfunction setPoint(point: string, pointMap: Record<string, number[]>, geometry: LineSegmentsGeometry, camera: Camera, x: number, y: number, z: number, _vector: Vector3) {\n\n    _vector.set(x, y, z).unproject(camera)\n\n    const points = pointMap[ point ]\n\n    if (points !== undefined) {\n\n        const position1 = geometry.getAttribute('instanceStart') as InterleavedBufferAttribute\n        const position2 = geometry.getAttribute('instanceEnd') as InterleavedBufferAttribute\n\n        for (let i = 0, l = points.length; i < l; i++) {\n\n            const j = Math.floor(points[ i ] / 2.)\n            ;(points[ i ] % 2 === 0 ? position1 : position2).setXYZ(j, _vector.x, _vector.y, _vector.z)\n            // (i % 2 === 0 ? position1 : position2).setXYZ(points[ i ], _vector.x, _vector.y, _vector.z)\n\n        }\n\n    }\n\n}\n\nfunction generateVertices() {\n    const vertices: number[] = []\n    const colors: number[] = []\n\n    const pointMap: any = {}\n\n    // up - 0\n\n    addLine('u1', 'u2')\n    addLine('u2', 'u3')\n    addLine('u3', 'u1')\n\n    // cross - 3\n\n    addLine('cn1', 'cn2')\n    addLine('cn3', 'cn4')\n\n    addLine('cf1', 'cf2')\n    addLine('cf3', 'cf4')\n\n    // frustum at the end\n\n    // near - 7\n\n    addLine('n1', 'n2')\n    addLine('n2', 'n4')\n    addLine('n4', 'n3')\n    addLine('n3', 'n1')\n\n    // cone - 11\n\n    addLine('p', 'n1')\n    addLine('p', 'n2')\n    addLine('p', 'n3')\n    addLine('p', 'n4')\n\n    // far - 15\n\n    addLine('f1', 'f2')\n    addLine('f2', 'f4')\n    addLine('f4', 'f3')\n    addLine('f3', 'f1')\n\n    // sides - 19\n\n    addLine('n1', 'f1')\n    addLine('n2', 'f2')\n    addLine('n3', 'f3')\n    addLine('n4', 'f4')\n\n    // target - 21\n\n    addLine('c', 't')\n    addLine('p', 'c')\n\n    function addLine(a: string, b: string) {\n\n        addPoint(a)\n        addPoint(b)\n\n    }\n\n    function addPoint(id: string) {\n\n        vertices.push(0, 0, 0)\n        colors.push(0, 0, 0)\n\n        if (pointMap[id] === undefined) {\n\n            pointMap[id] = []\n\n        }\n\n        pointMap[id].push(vertices.length / 3 - 1)\n\n    }\n\n    return {vertices, colors, pointMap}\n}\n","import {ColorRepresentation, DirectionalLight, Object3D, Vector3} from 'three'\nimport {Line2} from 'three/examples/jsm/lines/Line2.js'\nimport {LineGeometry} from 'three/examples/jsm/lines/LineGeometry.js'\nimport {onChange} from 'ts-browser-helpers'\nimport {ALightHelperWidget} from './ALightHelperWidget'\nimport {IUiConfigContainer, uiSlider} from 'uiconfig.js'\nimport {LineMaterial2} from '../../core'\n\nexport class DirectionalLightHelper2 extends ALightHelperWidget {\n    color: ColorRepresentation|undefined\n    lightPlane: Line2\n    targetLine: Line2\n    declare light: (DirectionalLight&IUiConfigContainer)|undefined\n\n    @onChange(DirectionalLightHelper2.prototype.update)\n        hMaterial: LineMaterial2\n    @onChange(DirectionalLightHelper2.prototype.update)\n    @uiSlider(undefined, [0.1, 20], 0.01)\n        lineWidth = 5\n    @onChange(DirectionalLightHelper2.prototype.update)\n    @uiSlider(undefined, [0.01, 10], 0.01)\n        size = 0.5\n\n    constructor(light: DirectionalLight, size?: number, color?: ColorRepresentation) {\n        super(light)\n\n        this.color = color\n\n        if (size !== undefined) this.size = size\n\n        let geometry = new LineGeometry()\n\n        this.hMaterial = new LineMaterial2({\n            color: 0xff0000,\n            linewidth: 3, // in world units with size attenuation, pixels otherwise\n            vertexColors: false,\n            worldUnits: false,\n\n            dashed: false,\n            alphaToCoverage: true,\n\n            toneMapped: false,\n            transparent: true,\n            depthTest: true,\n            depthWrite: false,\n\n            allowOverride: false,\n        })\n        this.hMaterial.userData.renderToGBuffer = false\n        this.hMaterial.userData.renderToDepth = false\n\n        this.lightPlane = new Line2(geometry, this.hMaterial)\n        this.add(this.lightPlane)\n\n        geometry = new LineGeometry()\n        geometry.setPositions([0, 0, 0, 0, 0, 1])\n\n        this.targetLine = new Line2(geometry, this.hMaterial)\n        this.add(this.targetLine)\n\n        this.update()\n\n        this.traverse(o=>{\n            o.userData.__keepShadowDef = true\n            o.castShadow = false\n            o.receiveShadow = false\n        })\n    }\n\n    dispose() {\n\n        this.lightPlane.geometry.dispose()\n        this.lightPlane.material.dispose()\n        this.targetLine.geometry.dispose()\n        this.targetLine.material.dispose()\n\n        super.dispose()\n    }\n\n    private _v1 = new Vector3()\n    private _v2 = new Vector3()\n    private _v3 = new Vector3()\n\n    update() {\n\n        if (!this.light || !this.lightPlane) return\n        this._v1.setFromMatrixPosition(this.light.matrixWorld)\n        this._v2.setFromMatrixPosition(this.light.target.matrixWorld)\n        this._v3.subVectors(this._v2, this._v1)\n\n        this.lightPlane.geometry.setPositions([\n            -this.size, this.size, 0,\n            this.size, this.size, 0,\n            this.size, -this.size, 0,\n            -this.size, -this.size, 0,\n            -this.size, this.size, 0,\n        ])\n        this.lightPlane.lookAt(this._v2)\n        this.lightPlane.material = this.hMaterial\n        this.targetLine.material = this.hMaterial\n        this.hMaterial.color.set(this.color ?? this.light.color)\n        this.hMaterial.linewidth = this.lineWidth\n\n        this.targetLine.lookAt(this._v2)\n        this.targetLine.scale.z = this.light.intensity / 3.\n\n        super.update()\n    }\n\n    static Check(light: Object3D) {\n        return (light as DirectionalLight).isDirectionalLight\n    }\n    static Create(light: Object3D) {\n        return new DirectionalLightHelper2(light as DirectionalLight)\n    }\n\n}\n\n","import {\n    BoxGeometry,\n    CatmullRomCurve3,\n    CubicBezierCurve,\n    Curve,\n    CurvePath,\n    Line,\n    LineLoop,\n    LineSegments,\n    Mesh,\n    MeshBasicMaterial,\n    Object3D,\n    Vector2,\n    Vector3,\n} from 'three'\nimport {AHelperWidget} from './AHelperWidget'\nimport {Line2} from 'three/examples/jsm/lines/Line2.js'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {\n    IGeometry,\n    iGeometryCommons,\n    IObject3D,\n    IObjectSetDirtyOptions,\n    LineSegmentsGeometry2,\n    MeshLine,\n    MeshLineSegments,\n} from '../../core'\nimport {onChange} from 'ts-browser-helpers'\nimport {uiColor, uiSlider} from 'uiconfig.js'\n// import type {LineGeometryGeneratorParams} from '../../../plugins/geometry-generator/src'\n\n// todo move this to geometry generator or some other plugin\nexport type LineType1 = (Line | LineLoop | LineSegments)\nexport type LineType2 = Line2 | LineSegments2 | MeshLine | MeshLineSegments\nexport type LineType = LineType1 | LineType2\n\n/**\n * Visualizes line/curve geometry with small cube handles at vertices or control points.\n * When the line has `geometry.userData.generationParams.curve`, creates interactive\n * draggable handles for editing curve control points.\n * See https://threepipe.org/notes/widgets-and-helpers for the full widget system documentation.\n */\nexport class LineHelper extends AHelperWidget {\n    line: LineType\n    private _vertexHandles: Mesh[] = []\n    private _cubeGeometry: BoxGeometry\n    private _cubeMaterial: MeshBasicMaterial\n    private _cubeMaterial2: MeshBasicMaterial\n\n    @onChange(LineHelper.prototype.update)\n    @uiSlider(undefined, [0.001, 0.2], 0.001)\n        handleSize = 0.05\n\n    @onChange(LineHelper.prototype.update)\n    @uiSlider(undefined, [0.001, 0.5], 0.001)\n        editableHandleSize = 0.1\n\n    @onChange(LineHelper.prototype.update)\n    @uiColor()\n        handleColor = 0x0093FD\n\n    @onChange(LineHelper.prototype.update)\n    @uiColor()\n        editableHandleColor = 0xEF0065\n\n    autoUpgradeChildren = false // used elsewhere\n\n    constructor(line: LineType) {\n        super(line)\n        this.line = line\n\n        // todo use instanced or batched mesh probably.\n        // Create reusable geometry and material for vertex cubes\n        this._cubeGeometry = new BoxGeometry(1, 1, 1, 2, 2, 2)\n        iGeometryCommons.upgradeGeometry.call(this._cubeGeometry)\n        this._cubeMaterial = new MeshBasicMaterial({\n            color: this.handleColor,\n            transparent: true,\n            opacity: 0.95,\n            allowOverride: false,\n        })\n        this._cubeMaterial.userData.renderToGBuffer = false\n        this._cubeMaterial.userData.renderToDepth = false\n        this._cubeMaterial2 = this._cubeMaterial.clone()\n        this._cubeMaterial2.color.set(this.editableHandleColor)\n        // this._cubeMaterial.depthWrite = false\n        // this._cubeMaterial.depthTest = false\n\n        this.update()\n    }\n\n    update() {\n        super.update()\n        if (!this.line || !this.line.geometry) return\n\n        const geometry = this.line.geometry as IGeometry\n        const positionAttribute = geometry.getAttribute('position')\n\n        const positions = (geometry as LineSegmentsGeometry2).getPositions ? (geometry as LineSegmentsGeometry2).getPositions() : positionAttribute?.array as Float32Array\n        const vertexCount = positions ? positions.length / 3 : 0\n\n        if (!positions || !vertexCount) return\n\n        const generationParams = this.line.geometry.userData?.generationParams /* as LineGeometryGeneratorParams*/\n        const curve = generationParams?.curve as Curve<Vector2|Vector3>\n        if (curve) {\n            const points = getPointsForCurve(curve)\n\n            const existingCubes = this._vertexHandles\n            this._vertexHandles = []\n            for (let i = points.length; i < existingCubes.length; i++) {\n                this.remove(existingCubes[i])\n            }\n            for (let i = 0; i < points.length; i++) {\n                const point1 = points[i]\n                const cube = existingCubes[i] ?? new Mesh(this._cubeGeometry, this._cubeMaterial2)\n                cube.renderOrder = 100\n                const parr = point1[0]\n                if (!isFinite(parr[0])) parr[0] = 0\n                if (!isFinite(parr[1])) parr[1] = 0\n                if (!isFinite(parr[2])) parr[2] = 0\n                cube.position.fromArray(parr)\n                cube.scale.setScalar(this.editableHandleSize)\n                cube.frustumCulled = false\n\n                // Ensure cubes don't cast/receive shadows\n                cube.castShadow = false\n                cube.receiveShadow = false\n                cube.userData.__keepShadowDef = true\n\n                if (!cube.parent) this.add(cube)\n                this._vertexHandles.push(cube)\n\n                cube.userData.isWidgetHandle = true\n                cube.userData.transformControls = {\n                    mode: 'translate',\n                    space: 'local',\n                    showX: true,\n                    showY: true,\n                    showZ: true,\n                    lockProps: ['mode'],\n                }\n\n                ;(cube as any).__handle = point1\n\n                // when the cube is moved, update the curve point\n                ;(cube as any as IObject3D).setDirty = (e: IObjectSetDirtyOptions)=>{\n                    // from transform controls\n                    if (e.change !== 'transform') return\n                    const handleData = (cube as any).__handle\n                    const point = handleData[0] as [number, number, number]\n                    const key = handleData[1] as string\n                    const position = cube.position\n                    const diff = Math.abs(point[0] - position.x) + Math.abs(point[1] - position.y) + Math.abs(point[2] - position.z)\n                    if (diff <= 1e-4) return\n                    point[0] = position.x\n                    point[1] = position.y\n                    point[2] = position.z\n\n                    let curve1 = curve\n                    let key1 = key\n                    if (key1.startsWith('curves.')) {\n                        const ee = key1.indexOf('.', 7)\n                        const curveIndex = parseInt(key1.slice(7, ee) || '0')\n                        key1 = key1.slice(ee + 1)\n                        if (curveIndex >= 0 && curveIndex < (curve as CurvePath<any>).curves.length) {\n                            curve1 = (curve as CurvePath<any>).curves[curveIndex]\n                        }\n                    }\n                    if (key1.startsWith('points.')) {\n                        const index = parseInt(key1.slice(7) || '0', 10)\n                        ;(curve1 as CatmullRomCurve3).points?.[index]?.set(point[0], point[1], point[2])\n                    } else {\n                        (curve1 as any)[key1]?.set(point[0], point[1], point[2])\n                    }\n                    geometry.setDirty && geometry.setDirty({regenerate: true})\n                }\n            }\n            if (points.length) return\n        }\n\n        // Cube for each vertex\n        this._clearVertexCubes()\n        const existingCubes = this._vertexHandles\n        this._vertexHandles = []\n        for (let i = vertexCount; i < existingCubes.length; i++) {\n            this.remove(existingCubes[i])\n        }\n\n        for (let i = 0; i < vertexCount; i++) {\n            const x = positions[i * 3]\n            const y = positions[i * 3 + 1]\n            const z = positions[i * 3 + 2]\n\n            const cube = existingCubes[i] ?? new Mesh(this._cubeGeometry, this._cubeMaterial)\n            cube.position.set(isFinite(x) ? x : 0, isFinite(y) ? y : 0, isFinite(z) ? z : 0)\n            cube.scale.setScalar(this.handleSize)\n            cube.frustumCulled = false\n\n            // Ensure cubes don't cast/receive shadows\n            cube.castShadow = false\n            cube.receiveShadow = false\n            cube.userData.__keepShadowDef = true\n\n            if (!cube.parent) this.add(cube)\n            this._vertexHandles.push(cube)\n        }\n\n    }\n\n    private _clearVertexCubes() {\n        // Remove existing cubes from the scene\n        for (const cube of this._vertexHandles) {\n            this.remove(cube)\n        }\n        this._vertexHandles = []\n    }\n\n    dispose() {\n        this._clearVertexCubes()\n        this._cubeGeometry.dispose()\n        this._cubeMaterial.dispose()\n        super.dispose()\n    }\n\n    static Check(obj: Object3D) {\n        return (obj as Line).isLine || (obj as LineSegments2).isLineSegments2\n    }\n\n    static Create(obj: Object3D) {\n        return new LineHelper(obj as any)\n    }\n}\n\nfunction getPointsForCurve(curve: Curve<Vector2 | Vector3>) {\n    const points = [] as Array<[number[], string]>\n    // toArray since it can be a Vector2 or Vector3\n    if ((curve as any).v0?.toArray)\n        points.push([(curve as CubicBezierCurve).v0.toArray(), 'v0'])\n    if ((curve as any).v1?.toArray)\n        points.push([(curve as CubicBezierCurve).v1.toArray(), 'v1'])\n    if ((curve as any).v2?.toArray)\n        points.push([(curve as CubicBezierCurve).v2.toArray(), 'v2'])\n    if ((curve as any).v3?.toArray)\n        points.push([(curve as CubicBezierCurve).v3.toArray(), 'v3'])\n    if ((curve as any).points !== undefined)\n        (curve as CatmullRomCurve3).points.forEach((p, i) => {\n            points.push([p.toArray(), 'points.' + i])\n        })\n    if ((curve as any).curves !== undefined)\n        (curve as CurvePath<any>).curves.forEach((c, i) => {\n            const points1 = getPointsForCurve(c)\n            points1.forEach(p => {\n                p[1] = 'curves.' + i + '.' + p[1]\n            })\n            points.push(...points1)\n        })\n\n    return points\n}\n","import {ColorRepresentation, Object3D, PointLight, SphereGeometry} from 'three'\nimport {WireframeGeometry2} from 'three/examples/jsm/lines/WireframeGeometry2.js'\nimport {Wireframe} from 'three/examples/jsm/lines/Wireframe.js'\nimport {onChange} from 'ts-browser-helpers'\nimport {ALightHelperWidget} from './ALightHelperWidget'\nimport {IUiConfigContainer, uiSlider} from 'uiconfig.js'\nimport {LineMaterial2} from '../../core'\n\nexport class PointLightHelper2 extends ALightHelperWidget {\n    color: ColorRepresentation | undefined\n    lightSphere: Wireframe\n    declare light: (PointLight & IUiConfigContainer) | undefined\n    @onChange(PointLightHelper2.prototype.update)\n        hMaterial: LineMaterial2\n    @onChange(PointLightHelper2.prototype.update)\n    @uiSlider(undefined, [0.1, 20], 0.01)\n        lineWidth = 5\n    @onChange(PointLightHelper2.prototype.update)\n    @uiSlider(undefined, [0.01, 10], 0.01)\n        size = 0.5\n\n    constructor(light: PointLight, size?: number, color?: ColorRepresentation) {\n        super(light)\n\n        this.color = color\n\n        if (size !== undefined) this.size = size\n\n        const geometry = new WireframeGeometry2(new SphereGeometry(0.5, 4, 2))\n\n        this.hMaterial = new LineMaterial2({\n            color: 0xff0000,\n            linewidth: 3, // in world units with size attenuation, pixels otherwise\n            vertexColors: false,\n            worldUnits: false,\n\n            dashed: false,\n            alphaToCoverage: true,\n\n            toneMapped: false,\n            transparent: true,\n            depthTest: true,\n            depthWrite: false,\n\n            allowOverride: false,\n        })\n        this.hMaterial.userData.renderToGBuffer = false\n        this.hMaterial.userData.renderToDepth = false\n\n        this.lightSphere = new Wireframe(geometry, this.hMaterial)\n        this.lightSphere.computeLineDistances()\n        this.add(this.lightSphere)\n\n        this.update()\n\n        this.traverse(o => {\n            o.userData.__keepShadowDef = true\n            o.castShadow = false\n            o.receiveShadow = false\n        })\n    }\n\n    dispose() {\n\n        this.lightSphere.geometry.dispose()\n        ;(this.lightSphere.material as any).dispose()\n\n        super.dispose()\n    }\n\n    update() {\n\n        if (!this.light || !this.lightSphere) return\n\n        this.hMaterial.color.set(this.color ?? this.light.color)\n        this.hMaterial.linewidth = this.lineWidth\n        this.lightSphere.scale.setScalar(this.size)\n\n        super.update()\n    }\n\n    static Check(light: Object3D) {\n        return (light as PointLight).isPointLight\n    }\n\n    static Create(light: Object3D) {\n        return new PointLightHelper2(light as PointLight)\n    }\n\n\n}\n","import {Bone, Color, ColorRepresentation, Matrix4, Object3D, Vector3} from 'three'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {LineSegmentsGeometry} from 'three/examples/jsm/lines/LineSegmentsGeometry.js'\nimport {onChange2} from 'ts-browser-helpers'\nimport {AHelperWidget} from './AHelperWidget'\nimport {IUiConfigContainer, uiColor, uiSlider, uiToggle} from 'uiconfig.js'\nimport {LineMaterial2} from '../../core'\n\nexport class SkeletonHelper2 extends AHelperWidget {\n    lineSegments: LineSegments2\n    bones: Bone[]\n    declare object: (Object3D & IUiConfigContainer) | undefined\n\n    private _vector = new Vector3()\n    private _boneMatrix = new Matrix4()\n    private _matrixWorldInv = new Matrix4()\n\n    @onChange2(SkeletonHelper2.prototype.update)\n        hMaterial: LineMaterial2\n\n    @onChange2(SkeletonHelper2.prototype.update)\n    @uiSlider(undefined, [0.1, 20], 0.01)\n        lineWidth = 5\n\n    @onChange2(SkeletonHelper2.prototype.update)\n    @uiColor()\n        color1: Color = new Color(0, 0, 1)\n\n    @onChange2(SkeletonHelper2.prototype.update)\n    @uiColor()\n        color2: Color = new Color(0, 1, 0)\n\n    @uiToggle()\n    @onChange2(SkeletonHelper2.prototype.update)\n        autoUpdate = true\n\n    constructor(object: Object3D, color1?: ColorRepresentation, color2?: ColorRepresentation) {\n        super(object)\n\n        if (color1) this.color1.set(color1)\n        if (color2) this.color2.set(color2)\n\n        this.bones = getBoneList(object)\n\n        // Create geometry and hMaterial\n        const geometry = new LineSegmentsGeometry()\n\n        this.hMaterial = new LineMaterial2({\n            vertexColors: true,\n            linewidth: this.lineWidth,\n            // resolution: new Vector2(1024, 1024), // Required for Line2 rendering\n            worldUnits: false,\n            dashed: false,\n            alphaToCoverage: true,\n            toneMapped: false,\n            transparent: true,\n            depthTest: true,\n            depthWrite: false,\n\n            allowOverride: false,\n        })\n        this.hMaterial.userData.renderToGBuffer = false\n        this.hMaterial.userData.renderToDepth = false\n\n        this.lineSegments = new LineSegments2(geometry, this.hMaterial)\n        this.lineSegments.frustumCulled = false\n        this.add(this.lineSegments)\n\n        this.matrix = object.matrixWorld\n        this.matrixAutoUpdate = false\n\n        this.update()\n\n    }\n\n    updateMatrixWorld(force?: boolean) {\n        if (this.object && this.visible) this.autoUpdate && this.update(false)\n        super.updateMatrixWorld(force)\n    }\n\n    update(setDirty = true) {\n        if (!this.lineSegments || !this.object) return\n\n        // Update hMaterial properties\n        this.hMaterial.linewidth = this.lineWidth\n\n        // Update colors in geometry\n        const geometry = this.lineSegments.geometry\n\n        const vertices: number[] = []\n        const colors: number[] = []\n\n        for (const bone of this.bones) {\n            if (bone.parent && (bone.parent as Bone).isBone) {\n                vertices.push(0, 0, 0)\n                vertices.push(0, 0, 0)\n                colors.push(this.color1.r, this.color1.g, this.color1.b)\n                colors.push(this.color2.r, this.color2.g, this.color2.b)\n            }\n        }\n\n        this._matrixWorldInv.copy(this.object.matrixWorld).invert()\n\n        let j = 0\n        for (const bone of this.bones) {\n            if (bone.parent && (bone.parent as any).isBone) {\n                // Update parent position\n                this._boneMatrix.multiplyMatrices(this._matrixWorldInv, bone.parent.matrixWorld)\n                this._vector.setFromMatrixPosition(this._boneMatrix)\n                // position.setXYZ(j, this._vector.x, this._vector.y, this._vector.z)\n                vertices[3 * j] = this._vector.x\n                vertices[3 * j + 1] = this._vector.y\n                vertices[3 * j + 2] = this._vector.z\n\n                // Update bone position\n                this._boneMatrix.multiplyMatrices(this._matrixWorldInv, bone.matrixWorld)\n                this._vector.setFromMatrixPosition(this._boneMatrix)\n                // position.setXYZ(j + 1, this._vector.x, this._vector.y, this._vector.z)\n                vertices[3 * j + 3] = this._vector.x\n                vertices[3 * j + 4] = this._vector.y\n                vertices[3 * j + 5] = this._vector.z\n\n                j += 2\n            }\n        }\n\n        if (vertices.length > 0) {\n            geometry.setPositions(vertices)\n            geometry.setColors(colors)\n        } else {\n            // Fallback: create a simple test line if no bones found\n            geometry.setPositions([0, 0, 0, 1, 0, 0])\n            geometry.setColors([1, 0, 0, 0, 1, 0])\n        }\n\n        super.update(setDirty)\n    }\n\n    dispose() {\n        this.lineSegments.geometry.dispose()\n        this.lineSegments.material.dispose()\n        super.dispose()\n    }\n\n    static Check(object: Object3D): boolean {\n        let parentHas = false\n        object.traverseAncestors(o=>{\n            if ((o as any)._hasSkeletonHelper) {\n                parentHas = true\n            }\n        })\n        if (parentHas) return false\n        return getBoneList(object).length > 0\n    }\n\n    static Create(object: Object3D): SkeletonHelper2 {\n        const helper = new SkeletonHelper2(object)\n        ;(object as any)._hasSkeletonHelper = true\n        return helper\n    }\n}\n\n/**\n * Recursively collect all bones from an object hierarchy\n */\nfunction getBoneList(object: Object3D): Bone[] {\n    const boneList: Bone[] = []\n\n    if ((object as any).isBone === true) {\n        boneList.push(object as Bone)\n    }\n\n    for (const child of object.children) {\n        boneList.push(...getBoneList(child))\n    }\n\n    return boneList\n}\n","import {ColorRepresentation, Object3D, SpotLight, Vector3} from 'three'\nimport {LineSegments2} from 'three/examples/jsm/lines/LineSegments2.js'\nimport {LineSegmentsGeometry} from 'three/examples/jsm/lines/LineSegmentsGeometry.js'\nimport {onChange} from 'ts-browser-helpers'\nimport {ALightHelperWidget} from './ALightHelperWidget'\nimport {IUiConfigContainer, uiSlider} from 'uiconfig.js'\nimport {LineMaterial2} from '../../core'\n\nexport class SpotLightHelper2 extends ALightHelperWidget {\n    color: ColorRepresentation | undefined\n    cone: LineSegments2\n    declare light: (SpotLight & IUiConfigContainer) | undefined\n    @onChange(SpotLightHelper2.prototype.update)\n        hMaterial: LineMaterial2\n    @onChange(SpotLightHelper2.prototype.update)\n    @uiSlider(undefined, [0.1, 20], 0.01)\n        lineWidth = 5\n\n    constructor(light: SpotLight, size?: number, color?: ColorRepresentation) {\n        super(light)\n\n        this.color = color\n\n        if (size === undefined) size = 0.5\n\n        const geometry = new LineSegmentsGeometry()\n        const positions = [\n            0, 0, 0, \t0, 0, 1,\n            0, 0, 0, \t1, 0, 1,\n            0, 0, 0,\t-1, 0, 1,\n            0, 0, 0, \t0, 1, 1,\n            0, 0, 0, \t0, -1, 1,\n        ]\n\n        for (let i = 0, j = 1, l = 32; i < l; i++, j++) {\n\n            const p1 = i / l * Math.PI * 2\n            const p2 = j / l * Math.PI * 2\n\n            positions.push(\n                Math.cos(p1), Math.sin(p1), 1,\n                Math.cos(p2), Math.sin(p2), 1\n            )\n\n        }\n        geometry.setPositions(positions)\n\n        this.hMaterial = new LineMaterial2({\n            color: 0xff0000,\n            linewidth: 3, // in world units with size attenuation, pixels otherwise\n            vertexColors: false,\n            worldUnits: false,\n\n            dashed: false,\n            alphaToCoverage: true,\n\n            toneMapped: false,\n            transparent: true,\n            depthTest: true,\n            depthWrite: false,\n\n            allowOverride: false,\n        })\n        this.hMaterial.userData.renderToGBuffer = false\n        this.hMaterial.userData.renderToDepth = false\n\n        this.cone = new LineSegments2(geometry, this.hMaterial)\n        this.add(this.cone)\n\n        this.update()\n\n        this.traverse(o => {\n            o.userData.__keepShadowDef = true\n            o.castShadow = false\n            o.receiveShadow = false\n        })\n    }\n\n    dispose() {\n\n        this.cone.geometry.dispose()\n        this.cone.material.dispose()\n\n        super.dispose()\n    }\n\n    private _v1 = new Vector3()\n\n    update() {\n\n        if (!this.light || !this.cone) return\n\n        this.light.updateWorldMatrix(true, false)\n        this.light.target.updateWorldMatrix(true, false)\n\n        const coneLength = this.light.distance ? this.light.distance : 1000\n        const coneWidth = coneLength * Math.tan(this.light.angle)\n\n        this.cone.scale.set(coneWidth, coneWidth, coneLength)\n\n        this._v1.setFromMatrixPosition(this.light.target.matrixWorld)\n\n        this.cone.lookAt(this._v1)\n\n        this.hMaterial.color.set(this.color ?? this.light.color)\n        this.hMaterial.linewidth = this.lineWidth\n\n        super.update()\n    }\n\n    static Check(light: Object3D) {\n        return (light as SpotLight).isSpotLight\n    }\n\n    static Create(light: Object3D) {\n        return new SpotLightHelper2(light as SpotLight)\n    }\n\n}\n","import {EventListener2, Object3D} from 'three'\nimport {Class, onChange, safeSetProperty, serialize} from 'ts-browser-helpers'\nimport {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {bindToValue, ObjectPicker} from '../../three'\nimport {\n    IGeometry,\n    IMaterial,\n    IObject3D,\n    IScene,\n    ISceneEventMap,\n    ITexture,\n    IWidget,\n    LineMaterial2,\n    PhysicalMaterial,\n    UnlitLineMaterial,\n    UnlitMaterial,\n} from '../../core'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {FrameFadePlugin} from '../pipeline/FrameFadePlugin'\nimport {type UndoManagerPlugin} from './UndoManagerPlugin'\nimport {ObjectPickerEventMap, SelectionObject} from '../../three/utils/ObjectPicker'\nimport {CameraViewPlugin} from '../animation/CameraViewPlugin'\nimport {DropzonePlugin, DropzonePluginEventMap} from './DropzonePlugin'\nimport {AssetImporter} from '../../assetmanager'\nimport {BoxSelectionWidget, SelectionWidget} from '../../three/widgets'\n\nexport interface PickingPluginEventMap extends AViewerPluginEventMap, ObjectPickerEventMap{\n}\n\nfunction getRootIfWidget(selected: IObject3D) {\n    while (selected.parent && selected.assetType !== 'widget') {\n        if (selected.userData.allowPicking) break // this is diff from userSelectable, its for widgets\n        selected = selected.parent\n    }\n    return selected\n}\n\nexport class PickingPlugin extends AViewerPluginSync<PickingPluginEventMap> {\n    @serialize()\n    @onChange(PickingPlugin.prototype.setDirty)\n        enabled = true\n\n    get picker(): ObjectPicker|undefined {\n        return this._picker\n    }\n    static readonly PluginType = 'Picking'\n    static readonly OldPluginType = 'PickingPlugin' // todo: swap\n    private _picker?: ObjectPicker\n    private _widget?: SelectionWidget\n    private _extraWidgets: SelectionWidget[] = []\n    private _selectionWidgetClass?: Class<SelectionWidget>\n    private _hoverWidget?: SelectionWidget\n    private _pickUi: boolean\n\n    dependencies = [CameraViewPlugin]\n\n    get hoverEnabled() {\n        return this._picker?.hoverEnabled ?? false\n    }\n    set hoverEnabled(v: boolean) {\n        if (!this._picker) return\n        this._picker.hoverEnabled = v\n        this.uiConfig && this.uiConfig.uiRefresh?.()\n    }\n\n    @bindToValue({obj: '_picker', key: 'selectionMode'})\n        selectionMode: 'object' | 'material' | 'geometry' | 'texture' = 'object'\n\n    @serialize()\n        autoFocus\n\n    // @serialize()  // todo\n    autoFocusHover = false\n\n    // @serialize()  // todo\n    autoApplyMaterialOnDrop = true\n\n    /**\n     * Note: this is for runtime use only, not serialized\n     */\n    @onChange(PickingPlugin.prototype._widgetEnabledChange)\n        widgetEnabled = true\n\n    @bindToValue({obj: '_picker', key: 'multiSelectEnabled'})\n        multiSelectEnabled = true\n\n    protected _widgetEnabledChange() {\n        if (!this._widget) return\n        if (this.widgetEnabled && (this._picker?.selectedObject as IObject3D)?.isObject3D)\n            this._widget.attach(this._picker!.selectedObject as IObject3D)\n        else\n            this._widget.detach()\n        this._updateExtraWidgets()\n        this.uiConfig?.uiRefresh?.(true)\n    }\n\n    private _updateExtraWidgets() {\n        if (!this._viewer || !this._selectionWidgetClass) return\n        const allSelected = this._picker?.selectedObjects as IObject3D[] || []\n        // Extra objects = all selected except the primary (index 0, handled by _widget)\n        const extras = allSelected.filter((o, i) => i > 0 && o?.isObject3D)\n\n        // Detach unused extra widgets\n        for (let i = extras.length; i < this._extraWidgets.length; i++) {\n            this._extraWidgets[i].detach()\n        }\n\n        // Create new widgets if needed, attach to objects\n        for (let i = 0; i < extras.length; i++) {\n            if (!this._extraWidgets[i]) {\n                const w = new this._selectionWidgetClass()\n                if (w.lineMaterial) {\n                    w.lineMaterial.color!.set('#ff8844')\n                    w.lineMaterial.opacity = 0.7\n                }\n                this._extraWidgets.push(w)\n                this._viewer.scene.addObject(w, {addToRoot: true})\n            }\n            if (this.widgetEnabled) this._extraWidgets[i].attach(extras[i])\n            else this._extraWidgets[i].detach()\n        }\n    }\n\n    setDirty() {\n        if (!this._viewer) return\n        if (this.isDisabled() && this.getSelectedObject()) this.setSelectedObject(undefined)\n        this._viewer.setDirty()\n    }\n    constructor(selection: Class<SelectionWidget>|undefined = BoxSelectionWidget, pickUi = true, autoFocus = false) {\n        super()\n        this._selectionWidgetClass = selection\n        if (selection) {\n            this._widget = new selection()\n            this._hoverWidget = new selection()\n            if (this._hoverWidget.lineMaterial) {\n                this._hoverWidget.lineMaterial.linewidth! /= 2\n                this._hoverWidget.lineMaterial.color!.set('#aa2222')\n            }\n        }\n        this._pickUi = pickUi\n        this.autoFocus = autoFocus\n        this.dispatchEvent = this.dispatchEvent.bind(this)\n\n    }\n\n    getSelectedObject<T extends SelectionObject = SelectionObject>(): T|undefined {\n        return this._picker?.selectedObject as T || undefined\n    }\n\n    getSelectedObjects<T extends SelectionObject = SelectionObject>(): T[] {\n        return (this._picker?.selectedObjects || []) as T[]\n    }\n\n    toggleSelectedObject(object: SelectionObject) {\n        if (!this._picker || this.isDisabled() || !object || !this.multiSelectEnabled) return\n        const current = [...this._picker.selectedObjects] as any[]\n        const idx = current.indexOf(object)\n        if (idx >= 0) {\n            current.splice(idx, 1)\n        } else {\n            current.unshift(object) // last clicked = primary (index 0)\n        }\n        this._picker.setSelected(current.length ? current.length === 1 ? current[0] : current : null, true)\n    }\n\n    selectAll() {\n        if (!this._picker || !this._viewer || this.isDisabled() || !this.multiSelectEnabled) return\n        const objects: IObject3D[] = []\n        this._viewer.scene.modelRoot.traverse((o: any) => {\n            if (o.isObject3D && o.visible && o.assetType === 'model' && o.userData.userSelectable !== false && o.material) {\n                objects.push(o)\n            }\n        })\n        if (objects.length) {\n            this._picker.setSelected(objects.length === 1 ? objects[0] : objects as any, true)\n        }\n    }\n\n    clearSelection() {\n        if (!this._picker) return\n        this._picker.setSelected(null, true)\n    }\n\n    private _onKeyDown = (event: KeyboardEvent) => {\n        if (this.isDisabled()) return\n        if ((event.target as any)?.tagName === 'TEXTAREA' || (event.target as any)?.tagName === 'INPUT') return\n        if ((event.ctrlKey || event.metaKey) && event.code === 'KeyA') {\n            event.preventDefault()\n            this.selectAll()\n        } else if (event.code === 'Escape') {\n            this.clearSelection()\n        }\n    }\n\n    setSelectedObject(object: SelectionObject|undefined, focusCamera = false, trackUndo = true) { // todo: also listen to 'dispose' event on selected object (ObjectPicker only listens to '__unregister' for scene removal)\n        const disabled = this.isDisabled()\n        if (disabled && object) return\n        if (!this._picker) return\n        const t = this.autoFocus\n        this.autoFocus = false\n        this._picker.setSelected(object || null, trackUndo)\n        this.autoFocus = t\n        if (!disabled && object && this.selectionMode === 'object' && (t || focusCamera)) this.focusObject(object as IObject3D)\n    }\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n        this.setDirty()\n        this._picker = new ObjectPicker(viewer.scene.modelRoot, viewer.canvas, viewer.scene.mainCamera, (obj)=>{\n            const hasMat = obj.material\n            if (!hasMat && !obj.userData.userSelectable) return false\n            let o: IObject3D|null = obj\n            o = getRootIfWidget(o)\n            let ret = false\n            while (o) {\n                if (!o.visible) return false\n                if (o.assetType === 'model' || o.assetType === 'light') ret = true\n                // else if (o.assetType === 'widget' && o !== obj) return false // only select widget if itself is selected (not its children)\n                if (o.userData.userSelectable === false) return false\n                if (o.userData.bboxVisible === false) return false\n                // todo colorwrite?\n                o = o.parent\n            }\n            return ret\n        })\n\n        this._picker.extraObjects.push(...viewer.scene.children.filter(r=>r.userData.isWidgetRoot))\n        this._viewer?.scene.addEventListener('addSceneObject', this._addSceneObject)\n        this._viewer?.scene.addEventListener('sceneUpdate', this._sceneUpdate)\n\n        if (this._widget) viewer.scene.addObject(this._widget, {addToRoot: true})\n        if (this._hoverWidget) viewer.scene.addObject(this._hoverWidget, {addToRoot: true})\n\n        this._picker.addEventListener('selectedObjectChanged', this._selectedObjectChanged)\n        this._picker.addEventListener('hoverObjectChanged', this._hoverObjectChanged)\n        this._picker.addEventListener('hitObject', this._onObjectHit)\n        this._picker.addEventListener('selectionModeChanged', this._selectionModeChanged)\n        this._picker.addEventListener('multiSelectChanged', this._multiSelectChanged)\n\n        window.addEventListener('keydown', this._onKeyDown)\n\n        viewer.scene.addEventListener('select', this._onObjectSelectEvent)\n        viewer.scene.addEventListener('materialChanged', this._objCompChange)\n        viewer.scene.addEventListener('geometryChanged', this._objCompChange)\n        viewer.scene.addEventListener('texturesChanged', this._objCompChange)\n        viewer.scene.addEventListener('mainCameraChange', this._mainCameraChange)\n\n        viewer.forPlugin<DropzonePlugin>('DropzonePlugin', (dz)=>{\n            dz.addEventListener('drop', this._onDrop)\n        }, (dz)=>{\n            dz.removeEventListener('drop', this._onDrop)\n        })\n\n        viewer.forPlugin<UndoManagerPlugin>('UndoManagerPlugin', (um)=>{\n            if (!this._picker) return\n            this._picker.undoManager = um.undoManager\n        }, ()=>{\n            if (!this._picker) return\n            this._picker.undoManager = undefined\n        }, this)\n\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        window.removeEventListener('keydown', this._onKeyDown)\n        viewer.scene.removeEventListener('select', this._onObjectSelectEvent)\n        viewer.scene.removeEventListener('materialChanged', this._objCompChange)\n        viewer.scene.removeEventListener('geometryChanged', this._objCompChange)\n        viewer.scene.removeEventListener('texturesChanged', this._objCompChange)\n        viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)\n        viewer.scene.removeEventListener('addSceneObject', this._addSceneObject)\n        viewer.scene.removeEventListener('sceneUpdate', this._sceneUpdate)\n\n        this._widget?.removeFromParent()\n        this._hoverWidget?.removeFromParent()\n        for (const w of this._extraWidgets) w.removeFromParent()\n        this._extraWidgets = []\n\n        if (this._picker) {\n            this._picker.removeEventListener('selectedObjectChanged', this._selectedObjectChanged)\n            this._picker.removeEventListener('hoverObjectChanged', this._hoverObjectChanged)\n            this._picker.removeEventListener('hitObject', this._onObjectHit)\n            this._picker.removeEventListener('selectionModeChanged', this._selectionModeChanged)\n            this._picker.removeEventListener('multiSelectChanged', this._multiSelectChanged)\n            this._picker.dispose()\n            this._picker.undoManager = undefined // because setting above\n            this._picker = undefined\n        }\n        super.onRemove(viewer)\n    }\n\n    dispose() {\n        super.dispose()\n        this._widget?.dispose?.()\n        this._hoverWidget?.dispose?.()\n        for (const w of this._extraWidgets) w.dispose?.()\n        this._extraWidgets = []\n    }\n\n    private _mainCameraChange = ()=>{\n        if (!this._picker || !this._viewer) return\n        this._picker.camera = this._viewer.scene.mainCamera\n    }\n\n    private _addSceneObject: EventListener2<'addSceneObject', ISceneEventMap, IScene> = (e)=>{\n        // to be able to pick widgets. see onObjectHit\n        if (e.object?.userData?.isWidgetRoot && e.object.parent === this._viewer?.scene) {\n            this._picker?.extraObjects.push(e.object)\n        }\n    }\n\n    private _sceneUpdate = (e: any)=>{\n        // Clean up extraObjects when widget roots are removed from scene\n        if (e?.change === 'removedFromParent' && e.object?.userData?.isWidgetRoot && this._picker) {\n            const idx = this._picker.extraObjects.indexOf(e.object)\n            if (idx >= 0) this._picker.extraObjects.splice(idx, 1)\n        }\n    }\n\n    private _objCompChange: EventListener2<'geometryChanged'|'materialChanged'|'texturesChanged', ISceneEventMap, IScene> = (e)=>{\n        if (e.object && e.object === this.getSelectedObject()) {\n            this.refreshUiChildren(e.object)\n        }\n    }\n\n    private _onObjectSelectEvent: EventListener2<'select', ISceneEventMap, IScene> = (e)=>{\n        if (e.source === PickingPlugin.PluginType) return\n        if (e.object === undefined && e.value === undefined) console.error('PickingPlugin - Error handling object/material `select` event `e.object` or `e.value` must be set for picking, `value` can be null to unselect')\n        else this.setSelectedObject(e.object || e.value, this.autoFocus || e.focusCamera, e.trackUndo ?? true)\n    }\n\n    private _selectedObjectChanged: EventListener2<'selectedObjectChanged', ObjectPickerEventMap, ObjectPicker> = (e: any) => {\n        if (!this._viewer) return\n        this.dispatchEvent(e)\n\n        const selected = this._picker?.selectedObject || undefined // or use e.object. doing this so that listeners can change the selected object in dispatch above\n\n        const frameFade = this._viewer.getPlugin(FrameFadePlugin)\n        if (frameFade) {\n            if (selected) frameFade.disable(this)\n            else frameFade.enable(this)\n        }\n\n        // for widgets etc, this can be removed when they are rendered in a separate pass\n        if (selected) {\n            this._viewer.scene.disableAutoNearFar('PickingPlugin')\n        } else {\n            this._viewer.scene.enableAutoNearFar('PickingPlugin')\n        }\n\n        this.refreshUiChildren(selected)\n\n        const widget = this._widget\n        if (widget && this.widgetEnabled) {\n            if ((selected as IObject3D)?.isObject3D) widget.attach((selected as IObject3D))\n            else widget.detach()\n        }\n\n        // Multi-selection: attach extra widgets to additional selected objects\n        this._updateExtraWidgets()\n\n        this._viewer.setDirty()\n\n        if (this.autoFocus && this.selectionMode === 'object') {\n            this.focusObject(selected as IObject3D | undefined)\n        }\n\n    }\n\n    private _hoverObjectChanged = (e: any) => {\n        if (!this._viewer) return\n        this.dispatchEvent(e)\n        const selected = this._picker?.hoverObject || undefined\n\n        const widget = this._hoverWidget\n        if (widget && this.widgetEnabled) {\n            if ((selected as IObject3D)?.isObject3D) widget.attach((selected as IObject3D))\n            else widget.detach()\n        }\n\n        this._viewer?.setDirty()\n\n        if (this.autoFocusHover && this.selectionMode === 'object') {\n            this.focusObject(selected as IObject3D | undefined)\n        }\n\n    }\n\n    private _onObjectHit = (e: PickingPluginEventMap['hitObject']&{type: 'hitObject'})=>{\n        if (!this._viewer) return\n        if (this.isDisabled()) {\n            e.intersects.selectedObject = null\n            return\n        }\n        let selected = e.intersects.selectedObject\n        // if a widget is picked, select the object its bound to instead\n        if (selected) {\n            const obj = selected\n            selected = getRootIfWidget(selected)\n            if (selected.assetType === 'widget' && (selected as IObject3D&IWidget).object) {\n                e.intersects.selectedObject = (selected as IObject3D&IWidget).object\n                e.intersects.selectedWidget = (selected as IObject3D&IWidget)\n                e.intersects.selectedHandle = obj.userData.isWidgetHandle ? obj : undefined\n            }\n        }\n        this.dispatchEvent(e)\n    }\n\n    private _selectionModeChanged = (e: any)=>{\n        if (!this._viewer) return\n        this.dispatchEvent(e)\n        if (this.isDisabled()) return\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    }\n\n    private _multiSelectChanged = (e: any)=>{\n        if (!this._viewer) return\n        this.dispatchEvent(e)\n        // When disabling, reduce to primary object only\n        if (!this.multiSelectEnabled && this._picker && this._picker.selectedObjects.length > 1) {\n            const primary = this._picker.selectedObject\n            this._picker.setSelected(primary, false)\n        }\n    }\n\n    public async focusObject(selected?: Object3D|null): Promise<void> {\n        this._viewer?.fitToView(selected ?? undefined, 1.25, 1000, 'easeOut')\n    }\n\n    // todo this should be done with undo support, see UndoManagerPlugin.recordAction\n    private _onDrop = async(e: DropzonePluginEventMap['drop'])=>{\n        if (!this._viewer || !this.autoApplyMaterialOnDrop) return\n        const obj = e.assets\n        const assetMat = obj?.find(m=>(m as IMaterial).isMaterial) as IMaterial\n        const selected = this.getSelectedObject()\n        if (selected\n            && (selected as IObject3D)?.isObject3D\n            && assetMat\n            && await this._viewer.dialog.confirm('Applying material: Apply material to the selected object?')\n        ) {\n            let oldMat = (selected as IObject3D).material\n            if (Array.isArray(oldMat)) {\n                console.warn('Dropping on material array not yet fully supported.')\n                oldMat = oldMat[0]\n            }\n            let meshes = Array.from(oldMat?.appliedMeshes ?? [])\n            const c = meshes.length > 1 ? !await this._viewer.dialog.confirm('Applying material: Apply to all objects using this material?') : meshes.length < 1\n            if (c) meshes = [selected as IObject3D]\n            for (const mesh of meshes) {\n                if (mesh) mesh.material = assetMat\n            }\n        }\n    }\n\n    private _pickPromptUi: UiObjectConfig = {\n        type: 'button',\n        label: 'Select an object to see its properties',\n        readOnly: true,\n        hidden: () => this.getSelectedObject() !== undefined,\n    }\n    private _uiConfigChildren: UiObjectConfig[] = [\n        {\n            label: 'Enabled',\n            type: 'checkbox',\n            property: [this, 'enabled'],\n        },\n        {\n            label: 'Hover Enabled',\n            type: 'checkbox',\n            property: [this, 'hoverEnabled'],\n            onChange: ()=>this.uiConfig.uiRefresh?.(true), // for autoFocusHover\n        },\n        // {\n        //     label: 'Selection Mode',\n        //     type: 'dropdown',\n        //     children: ['object', 'material'].map(v=>({label: v, value: v})),\n        //     onChange: ()=>this.uiConfig.uiRefresh?.(true),\n        // },\n        {\n            label: 'Auto Focus',\n            type: 'checkbox',\n            property: [this, 'autoFocus'],\n            onChange: ()=>{\n                const o = this.getSelectedObject()\n                if (this.autoFocus && o) this.setSelectedObject(o, true)\n            },\n        },\n        {\n            label: 'Auto Focus on Hover',\n            type: 'checkbox',\n            hidden: ()=>!this.hoverEnabled,\n            property: [this, 'autoFocusHover'],\n        },\n        {\n            label: 'Widget Enabled',\n            type: 'checkbox',\n            property: [this, 'widgetEnabled'],\n        },\n        {\n            label: 'Multi-Select',\n            type: 'checkbox',\n            property: [this, 'multiSelectEnabled'],\n        },\n    ]\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Picker',\n        expanded: true,\n        children: [\n            ...this._uiConfigChildren,\n            this._pickPromptUi,\n        ],\n    }\n\n    get widget(): SelectionWidget | undefined {\n        return this._widget\n    }\n\n    // UI utils\n\n    refreshUiChildren(selected: IObject3D | IMaterial | ITexture | IGeometry | undefined) {\n        if (this._pickUi) {\n            const ui = this.uiConfig\n            ui.children = [...this._uiConfigChildren]\n            if (selected) {\n                if ((selected as IObject3D).isObject3D) {\n                    const obj = (selected as IObject3D)\n                    ui.children.push(...this.objectSelectionUiConfig(obj))\n                }\n                const c = selected.uiConfig\n                if (c?.type === 'folder') safeSetProperty(c, 'expanded', true, true)\n                if (c) ui.children.push(c)\n\n                const object = (selected as IObject3D)?.isObject3D ? (selected as IObject3D) : undefined\n                const materials1 = (selected as IMaterial)?.isMaterial ? selected as IMaterial : object?.material\n                const materials = materials1 ? Array.isArray(materials1) ? materials1 : [materials1] : []\n                const geometry = (selected as IGeometry)?.isBufferGeometry ? selected as IGeometry : object?.geometry\n\n                if (geometry?.uiConfig && geometry !== selected) {\n                    const c1 = geometry.uiConfig\n                    if (c1.type === 'folder') safeSetProperty(c1, 'expanded', true, true)\n                    ui.children.push(c1)\n                }\n                materials.forEach(m => {\n                    if (m?.uiConfig && m !== selected) ui.children?.push(m.uiConfig)\n                })\n                if ((selected as IObject3D).isObject3D) {\n                    ui.children.push(...this.objectMaterialManageUiConfig(selected as IObject3D))\n                }\n\n            } else {\n                ui.children.push(this._pickPromptUi)\n            }\n\n            ui.uiRefresh?.()\n        }\n    }\n\n    objectSelectionUiConfig(obj: IObject3D): UiObjectConfig[] {\n        return [\n            {\n                type: 'button',\n                label: 'Focus',\n                value: () => {\n                    if (!obj.isObject3D) return\n                    // const selected = this.getSelectedObject()\n                    if (obj.assetType && obj.parentRoot) // todo also check if acceptChildEvents is set on some parent?\n                        obj.dispatchEvent({\n                            type: 'select',\n                            ui: true,\n                            object: obj,\n                            bubbleToParent: true,\n                            focusCamera: true,\n                        })\n                    else\n                        this.setSelectedObject(obj, true)\n                },\n            },\n            {\n                type: 'button',\n                label: 'Select Parent',\n                hidden: () => !obj.parent,\n                value: () => {\n                    if (!obj.isObject3D) return\n                    const parent = obj.parent\n                    if (parent) {\n                        if (parent.assetType && parent.parentRoot) // todo also check if acceptChildEvents is set on some parent?\n                            parent.dispatchEvent({\n                                type: 'select',\n                                ui: true,\n                                bubbleToParent: true,\n                                object: parent,\n                            })\n                        else\n                            this.setSelectedObject(parent, false)\n                    }\n                },\n            },\n        ]\n    }\n\n    objectMaterialManageUiConfig(obj: IObject3D): UiObjectConfig[] {\n        return [\n            {\n                label: 'Remove Material(s)',\n                type: 'button',\n                hidden: ()=>!this.canRemoveMaterial(obj),\n                value: ()=> this.removeMaterial(obj),\n            },\n            ...this.materialTypes.map(matType=>({\n                label: `New ${matType.name} Material`,\n                type: 'button',\n                hidden: matType.line ?\n                    // ()=>(!obj.isLineSegments2 && !obj.isLine && !obj.isLineSegments) || !(!obj.materials?.length || obj.materials.length === 1 && obj.materials[0].userData?.isPlaceholder) :\n                    ()=>!obj.isLineSegments2 && !obj.isLine && !obj.isLineSegments && !obj.isWireframe || !(!obj.materials?.length || obj.materials.length === 1 && obj.materials[0] === matType.def) :\n                    ()=>!(!obj.materials?.length || obj.materials.length === 1 && obj.materials[0].userData?.isPlaceholder) || !obj.isMesh,\n                value: ()=>{\n                    const mat = obj.material\n                    obj.material = new matType.cls()\n                    return ()=> obj.material = mat\n                },\n            })),\n        ]\n    }\n\n    canRemoveMaterial = (obj: IObject3D)=>{\n        if (!obj.material) return false\n        const materials = Array.isArray(obj.material) ? obj.material : obj.material ? [obj.material] : []\n        // return materials.length && (materials.length !== 1 || !(this.materialTypes.map(m=>m.def) as IMaterial[]).includes(materials[0]))\n        return materials.length && (materials.length !== 1 || !materials[0].userData?.isPlaceholder)\n    }\n\n    removeMaterial = (obj: IObject3D)=>{\n        if (!obj.material) return\n        const matC = obj.material\n        obj.material = this.getPlaceholderMaterial(obj)\n        return ()=> obj.material = matC // returns undo function\n    }\n\n    getPlaceholderMaterial(obj: IObject3D): IMaterial {\n        const def = [this.materialTypes[0].def!]\n        if (!def[0]) throw new Error('No default material found')\n        const mat = obj.isLineSegments2 || obj.isWireframe ? this.materialTypes.find(m => m.cls === LineMaterial2)?.def :\n            obj.isLine || obj.isLineSegments ? this.materialTypes.find(m => m.cls === UnlitLineMaterial)?.def :\n                null\n        return mat ? mat : def[0]\n    }\n\n    // to be able to remove material from object\n    materialTypes = [{\n        cls: UnlitMaterial,\n        def: AssetImporter.DummyMaterial,\n        name: 'Unlit',\n    }, {\n        cls: UnlitLineMaterial,\n        def: AssetImporter.DummyLineBasicMaterial,\n        line: true,\n        name: 'Basic Line',\n    }, {\n        cls: LineMaterial2,\n        def: AssetImporter.DummyLineMaterial,\n        line: true,\n        name: 'Line',\n    }, {\n        cls: PhysicalMaterial,\n        // def: new PhysicalMaterial(),\n        name: 'Physical',\n    }]\n\n}\n\n","import {IObject3D} from '../../core'\nimport {JSUndoManager} from 'ts-browser-helpers'\nimport {Matrix4, Object3D, Quaternion, Vector3} from 'three'\nimport type {ThreeViewer} from '../../viewer'\n\n/**\n * Shared helper for multi-object transform gizmo support.\n * Used by both TransformControlsPlugin and PivotControlsPlugin.\n */\nexport class MultiSelectHelper {\n    multiObjects: IObject3D[] = []\n    private _dummy: Object3D | null = null\n    private _dummyStart = new Matrix4()\n    private _startStates: {position: Vector3, quaternion: Quaternion, scale: Vector3}[] = []\n    private _startWorldMatrices: Matrix4[] = []\n\n    get dummy(): Object3D | null { return this._dummy }\n    get hasMultiSelect(): boolean { return this.multiObjects.length > 1 }\n    get hasStartStates(): boolean { return this._startStates.length > 0 }\n\n    setup(objects: IObject3D[], viewer: ThreeViewer): Object3D {\n        this.multiObjects = objects\n        if (!this._dummy) {\n            this._dummy = new Object3D()\n            this._dummy.userData.isMultiSelectDummy = true\n            viewer.scene.addObject(this._dummy as any, {addToRoot: true})\n        }\n        const median = new Vector3()\n        for (const obj of objects) {\n            obj.updateWorldMatrix(true, false)\n            median.add(new Vector3().setFromMatrixPosition(obj.matrixWorld))\n        }\n        median.divideScalar(objects.length)\n        this._dummy.position.copy(median)\n        this._dummy.quaternion.identity()\n        this._dummy.scale.setScalar(1)\n        this._dummy.updateMatrixWorld(true)\n        return this._dummy\n    }\n\n    clear(viewer: ThreeViewer) {\n        this.multiObjects = []\n        this._startStates = []\n        this._startWorldMatrices = []\n        if (this._dummy) {\n            viewer.scene.remove(this._dummy)\n            this._dummy = null\n        }\n    }\n\n    captureStart() {\n        if (!this._dummy || !this.multiObjects.length) return\n        this._dummy.updateMatrixWorld(true)\n        this._dummyStart.copy(this._dummy.matrixWorld)\n        this._startStates = this.multiObjects.map(o => ({\n            position: o.position.clone(),\n            quaternion: o.quaternion.clone(),\n            scale: o.scale.clone(),\n        }))\n        this._startWorldMatrices = this.multiObjects.map(o => {\n            o.updateWorldMatrix(true, false)\n            return o.matrixWorld.clone()\n        })\n    }\n\n    applyDelta() {\n        if (!this._dummy || !this.multiObjects.length || !this._startWorldMatrices.length) return\n        this._dummy.updateMatrixWorld(true)\n        const dummyStartInv = this._dummyStart.clone().invert()\n        const deltaWorld = this._dummy.matrixWorld.clone().multiply(dummyStartInv)\n\n        for (let i = 0; i < this.multiObjects.length; i++) {\n            const obj = this.multiObjects[i]\n            const newWorld = deltaWorld.clone().multiply(this._startWorldMatrices[i])\n            const parentInv = new Matrix4()\n            if (obj.parent) parentInv.copy(obj.parent.matrixWorld).invert()\n            const newLocal = parentInv.clone().multiply(newWorld)\n            newLocal.decompose(obj.position, obj.quaternion, obj.scale)\n            obj.updateMatrixWorld(true)\n            ;(obj as IObject3D).setDirty?.({change: 'transform', frameFade: false})\n        }\n    }\n\n    /** Reposition the dummy to the median of all selected objects */\n    updateDummyPosition() {\n        if (!this._dummy || !this.multiObjects.length) return\n        const median = new Vector3()\n        for (const obj of this.multiObjects) {\n            obj.updateWorldMatrix(true, false)\n            median.add(new Vector3().setFromMatrixPosition(obj.matrixWorld))\n        }\n        median.divideScalar(this.multiObjects.length)\n        this._dummy.position.copy(median)\n        this._dummy.quaternion.identity()\n        this._dummy.scale.setScalar(1)\n        this._dummy.updateMatrixWorld(true)\n    }\n\n    recordUndo(undoManager: JSUndoManager) {\n        if (!this.multiObjects.length || !this._startStates.length) return\n        const objects = [...this.multiObjects]\n        const startStates = this._startStates.map(s => ({\n            position: s.position.clone(),\n            quaternion: s.quaternion.clone(),\n            scale: s.scale.clone(),\n        }))\n        const endStates = objects.map(obj => ({\n            position: obj.position.clone(),\n            quaternion: obj.quaternion.clone(),\n            scale: obj.scale.clone(),\n        }))\n        let changed = false\n        for (let i = 0; i < objects.length; i++) {\n            if (!startStates[i].position.equals(endStates[i].position) ||\n                !startStates[i].quaternion.equals(endStates[i].quaternion) ||\n                !startStates[i].scale.equals(endStates[i].scale)) {\n                changed = true\n                break\n            }\n        }\n        if (!changed) return\n\n        undoManager.record({\n            undo: () => {\n                for (let i = 0; i < objects.length; i++) {\n                    objects[i].position.copy(startStates[i].position)\n                    objects[i].quaternion.copy(startStates[i].quaternion)\n                    objects[i].scale.copy(startStates[i].scale)\n                    objects[i].updateMatrixWorld(true)\n                    ;(objects[i] as IObject3D).setDirty?.({change: 'transform'})\n                }\n                this.updateDummyPosition()\n            },\n            redo: () => {\n                for (let i = 0; i < objects.length; i++) {\n                    objects[i].position.copy(endStates[i].position)\n                    objects[i].quaternion.copy(endStates[i].quaternion)\n                    objects[i].scale.copy(endStates[i].scale)\n                    objects[i].updateMatrixWorld(true)\n                    ;(objects[i] as IObject3D).setDirty?.({change: 'transform'})\n                }\n                this.updateDummyPosition()\n            },\n        })\n    }\n}\n","import {uiButton, uiConfig, uiDropdown, uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {PickingPlugin} from './PickingPlugin'\nimport {JSUndoManager, onChange} from 'ts-browser-helpers'\nimport {OrbitControls3, TransformControls} from '../../three'\nimport {\n    ICamera,\n    IObject3D,\n    IObject3DUserData,\n    iObjectCommons,\n    IWidget,\n    UnlitLineMaterial,\n    UnlitMaterial,\n} from '../../core'\nimport {Euler, MathUtils, Object3D, Vector3} from 'three'\nimport type {UndoManagerPlugin} from './UndoManagerPlugin'\nimport {MultiSelectHelper} from './MultiSelectHelper'\n\n@uiFolderContainer('Transform Controls')\nexport class TransformControlsPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'TransformControlsPlugin'\n\n    @uiToggle()\n    @onChange(TransformControlsPlugin.prototype.setDirty)\n        enabled = true\n\n    setDirty() { // todo rename to refresh or setEnabledDirty?\n        if (!this._viewer) return\n        const picking = this._viewer.getPlugin(PickingPlugin)!\n        const enabled = !this.isDisabled()\n        if (this.transformControls) {\n            if (!enabled) {\n                this.transformControls.detach()\n                this._multi.clear(this._viewer!)\n            } else {\n                const objects = picking.getSelectedObjects<IObject3D>().filter(o => o?.isObject3D)\n                if (objects.length > 1) {\n                    this.transformControls.attach(this._multi.setup(objects, this._viewer!))\n                } else if (objects.length === 1) {\n                    this._multi.clear(this._viewer!)\n                    this.transformControls.attach(objects[0])\n                } else {\n                    this._multi.clear(this._viewer!)\n                    this.transformControls.detach()\n                }\n            }\n        }\n        this._viewer.setDirty()\n    }\n\n    constructor(enabled = true) {\n        super()\n        TransformControls.ObjectConstructors.MeshBasicMaterial = UnlitMaterial as any\n        TransformControls.ObjectConstructors.LineBasicMaterial = UnlitLineMaterial as any\n        this.enabled = enabled\n    }\n\n    toJSON: any = undefined\n\n    dependencies = [PickingPlugin]\n\n    @uiConfig(undefined, {expanded: true})\n        transformControls: TransformControls2 | undefined\n\n    protected _isInteracting = false\n    protected _viewerListeners = {\n        postFrame: ()=>{\n            if (!this.transformControls || !this._viewer) return\n            // this._viewer.scene.mainCamera.setInteractions(!this._isInteracting, TransformControlsPlugin.PluginType)\n        },\n    }\n\n    private _transformState = {\n        obj: null as Object3D|null,\n        position: new Vector3(),\n        rotation: new Euler(),\n        scale: new Vector3(),\n    }\n    undoManager?: JSUndoManager\n\n    selectionFilterTest: ((obj: IObject3D)=>IObject3D|null)|undefined = undefined\n\n    private _multi = new MultiSelectHelper()\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this.setDirty()\n        this.transformControls = new TransformControls2(viewer.scene.mainCamera, viewer.canvas)\n        this._mainCameraChange = this._mainCameraChange.bind(this)\n        viewer.scene.addEventListener('mainCameraChange', this._mainCameraChange)\n        this.transformControls.addEventListener('dragging-changed', (event) => {\n            if (!this?._viewer) return\n            const controls = this._viewer.scene.mainCamera.controls\n            if (typeof (controls as any)?.stopDamping === 'function' && controls?.enabled) (controls as OrbitControls3).stopDamping()\n            this._viewer.scene.mainCamera.setInteractions(!event.value, TransformControlsPlugin.PluginType)\n            // this._viewer.scene.mainCamera.autoNearFar = !event.value // todo: maintain state\n        })\n        this.transformControls.addEventListener('axis-changed', (event) => {\n            if (!this?._viewer) return\n            this._isInteracting = !!event.value\n            const controls = this._viewer.scene.mainCamera.controls\n            if (typeof (controls as any)?.stopDamping === 'function' && controls?.enabled) (controls as OrbitControls3).stopDamping()\n            this._viewer.setDirty() // rerender for color change\n        })\n        viewer.scene.addObject(this.transformControls, {addToRoot: true})\n        const picking = viewer.getPlugin(PickingPlugin)!\n        picking.addEventListener('selectedObjectChanged', (event) => {\n            if (!this.transformControls) return\n            if (this.isDisabled()) {\n                if (this.transformControls.object) this.transformControls.detach()\n                this._multi.clear(this._viewer!)\n                return\n            }\n            const objects = (event.objects || []).filter((o: any) => o?.isObject3D) as IObject3D[]\n            if (objects.length > 1) {\n                this.transformControls.attach(this._multi.setup(objects, this._viewer!))\n            } else if (event.object) {\n                this._multi.clear(this._viewer!)\n                let obj: IObject3D|null = event.intersects?.selectedHandle ?? event.intersects?.selectedObject ?? event.object\n                if (this.selectionFilterTest) obj = this.selectionFilterTest(obj)\n                if (!obj || !obj.isObject3D) {\n                    this.transformControls.detach()\n                    return\n                }\n                this.transformControls.attach(obj)\n            } else {\n                this._multi.clear(this._viewer!)\n                this.transformControls.detach()\n            }\n        })\n\n        viewer.forPlugin<UndoManagerPlugin>('UndoManagerPlugin', (um)=> {\n            this.undoManager = um.undoManager\n        }, ()=> this.undoManager = undefined, this)\n\n        this.transformControls.addEventListener('mouseDown', ()=> {\n            if (!this.transformControls) return\n            if (this._multi.hasMultiSelect) {\n                this._multi.captureStart()\n                return\n            }\n            const object = this.transformControls.object\n            if (!object) return\n            this._transformState.obj = object\n            this._transformState.position = object.position.clone()\n            this._transformState.rotation = object.rotation.clone()\n            this._transformState.scale = object.scale.clone()\n        })\n\n        this.transformControls.addEventListener('objectChange', ()=> {\n            if (this._multi.hasMultiSelect) this._multi.applyDelta()\n        })\n\n        this.transformControls.addEventListener('mouseUp', ()=> {\n            if (!this.transformControls) return\n            if (this._multi.hasMultiSelect && this._multi.hasStartStates) {\n                if (this.undoManager) this._multi.recordUndo(this.undoManager)\n                return\n            }\n            const object = this.transformControls.object\n            if (!object) return\n\n            if (this._transformState.obj !== object || !this.undoManager) return\n\n            const key = ({\n                'translate': 'position',\n                'rotate': 'rotation',\n                'scale': 'scale',\n            } as const)[this.transformControls.getMode()]\n            if (!key) return\n            if (this._transformState[key].equals(object[key] as any)) return\n\n            const command = {\n                last: this._transformState[key].clone(), current: object[key].clone(),\n                set: (value: any) => {\n                    object[key].copy(value)\n                    object.updateMatrixWorld(true)\n                    this.transformControls?.dispatchEvent({type: 'change'} as any)\n                    this.transformControls?.dispatchEvent({type: 'objectChange'} as any)\n                },\n                undo: () => command.set(command.last),\n                redo: () => command.set(command.current),\n            }\n            this.undoManager.record(command)\n        })\n\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)\n        this._multi.clear(viewer)\n        if (this.transformControls) {\n            this.transformControls.detach()\n            viewer.scene.remove(this.transformControls)\n            this.transformControls.dispose()\n        }\n        this.transformControls = undefined\n        super.onRemove(viewer)\n    }\n\n    private _mainCameraChange = () => {\n        if (!this.transformControls || !this._viewer) return\n        this.transformControls.camera = this._viewer.scene.mainCamera\n    }\n\n    @uiButton('Center All Meshes')\n    centerAllMeshes() {\n        return this._viewer?.scene.centerAllGeometries(true)\n    }\n\n}\n\n@uiFolderContainer('Transform Controls')\nexport class TransformControls2 extends TransformControls implements IWidget, IObject3D {\n    isWidget = true as const\n    assetType = 'widget' as const\n    setDirty = iObjectCommons.setDirty.bind(this)\n    refreshUi = iObjectCommons.refreshUi.bind(this)\n    lockProps: string[] | undefined = undefined // list of properties to lock.\n\n    declare object: IObject3D | undefined\n    private _keyDownListener(event: KeyboardEvent) {\n        if (!this.enabled) return\n        if (!this.object) return\n        if (event.metaKey || event.ctrlKey) return\n        if ((event.target as any)?.tagName === 'TEXTAREA' || (event.target as any)?.tagName === 'INPUT') return\n\n        switch (event.code) {\n\n        case 'KeyQ':\n            this.space = this.space === 'local' ? 'world' : 'local'\n            break\n\n        case 'ShiftLeft':\n            this.translationSnap = 0.5\n            this.rotationSnap = MathUtils.degToRad(15)\n            this.scaleSnap = 0.25\n            break\n\n        case 'KeyW':\n            this.mode = 'translate'\n            break\n\n        case 'KeyE':\n            this.mode = 'rotate'\n            break\n\n        case 'KeyR':\n            this.mode = 'scale'\n            break\n\n        case 'Equal':\n        case 'NumpadAdd':\n        case 'Plus':\n            this.size = this.size + 0.1\n            break\n\n        case 'Minus':\n        case 'NumpadSubtract':\n        case 'Underscore':\n            this.size = Math.max(this.size - 0.1, 0.1)\n            break\n\n        case 'KeyX':\n            this.showX = !this.showX\n            break\n\n        case 'KeyY':\n            this.showY = !this.showY\n            break\n\n        case 'KeyZ':\n            this.showZ = !this.showZ\n            break\n\n        case 'Space':\n            this.enabled = !this.enabled\n            break\n\n        default:\n            return\n        }\n\n        this.setDirty({refreshScene: true, frameFade: true})\n\n    }\n\n    private _keyUpListener(event: KeyboardEvent) {\n        if (!this.enabled) return\n\n        // reset events\n        switch (event.code) {\n        case 'ShiftLeft':\n            this.translationSnap = null\n            this.rotationSnap = null\n            this.scaleSnap = null\n            break\n\n        default:\n            break\n        }\n\n        if (!this.object) return\n\n        // non-reset events\n        switch (event.code) {\n        default:\n            break\n        }\n\n    }\n\n    constructor(camera: ICamera, canvas: HTMLCanvasElement) {\n        super(camera, canvas)\n\n        this.visible = false\n        this.userData.bboxVisible = false\n\n        this.size = 1.25\n\n        this.addEventListener('objectChange', () => {\n            this?.object?.setDirty && this.object.setDirty({frameFade: false, change: 'transform'})\n            // todo: do this.setDirty?\n        })\n        this.addEventListener('change', () => {\n            this.setDirty({frameFade: false})\n        })\n\n        this._keyUpListener = this._keyUpListener.bind(this)\n        this._keyDownListener = this._keyDownListener.bind(this)\n        window.addEventListener('keydown', this._keyDownListener)\n        window.addEventListener('keyup', this._keyUpListener)\n\n        this.traverse(c=>{\n            c.castShadow = false\n            c.receiveShadow = false\n            c.userData.__keepShadowDef = true\n        })\n    }\n\n    protected _savedSettings = {} as any\n    attach(object: Object3D): this {\n        // check if object is ancestor of this\n        let isAns = false\n        this.traverseAncestors(o=>isAns = isAns || o === object)\n        if (isAns) return this\n\n        if (this._savedSettings.lockProps) this.lockProps = this._savedSettings.lockProps\n        Object.assign(this, this._savedSettings)\n        this._savedSettings = {}\n\n        // see LineHelper for example\n        if (object.userData.transformControls) {\n            const props: ((keyof typeof this) & (keyof (Required<IObject3DUserData>['transformControls'])))[] =\n                ['translationSnap', 'rotationSnap', 'scaleSnap', 'space', 'mode', 'showX', 'showY', 'showZ', 'lockProps']\n            for (const prop of props) {\n                if (object.userData.transformControls[prop] !== undefined) {\n                    this._savedSettings[prop] = this[prop]\n                    this[prop] = object.userData.transformControls[prop]\n                }\n            }\n        }\n        return super.attach(object)\n    }\n    detach(): this {\n        if (this._savedSettings.lockProps) this.lockProps = this._savedSettings.lockProps\n        Object.assign(this, this._savedSettings)\n        this._savedSettings = {}\n        return super.detach()\n    }\n\n    dispose() {\n        window.removeEventListener('keydown', this._keyDownListener)\n        window.removeEventListener('keyup', this._keyUpListener)\n        super.dispose()\n    }\n\n\n    // region properties\n\n    declare enabled: boolean\n\n    // axis: 'X' | 'Y' | 'Z' | 'E' | 'XY' | 'YZ' | 'XZ' | 'XYZ' | 'XYZE' | null\n\n    // onChange not required for before since they fire 'change' event on changed. see TransformControls.js\n\n    @uiDropdown('Mode', ['translate', 'rotate', 'scale'].map(label=>({label})))\n    declare mode: 'translate' | 'rotate' | 'scale'\n\n    declare translationSnap: number | null\n    declare rotationSnap: number | null\n    declare scaleSnap: number | null\n\n    @uiDropdown('Space', ['world', 'local'].map(label=>({label})))\n    declare space: 'world' | 'local'\n    @uiSlider('Size', [0.1, 10], 0.01)\n    declare size: number\n    @uiToggle('Show X')\n    declare showX: boolean\n    @uiToggle('Show Y')\n    declare showY: boolean\n    @uiToggle('Show Z')\n    declare showZ: boolean\n\n    // dragging: boolean\n\n    // endregion\n\n\n    /**\n     * Get the threejs object\n     * @deprecated\n     */\n    get modelObject(): this {\n        return this as any\n    }\n\n    // todo: https://helpx.adobe.com/after-effects/using/3d-transform-gizmo.html\n\n    // region inherited type fixes\n\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n\n    // endregion\n}\n","import {uiConfig, uiDropdown, uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {PickingPlugin} from './PickingPlugin'\nimport {JSUndoManager, onChange} from 'ts-browser-helpers'\nimport {OrbitControls3} from '../../three'\nimport {PivotControls} from '../../three/controls/PivotControls'\nimport {\n    ICamera,\n    IObject3D,\n    iObjectCommons,\n    IWidget,\n    UnlitLineMaterial,\n    UnlitMaterial,\n} from '../../core'\nimport {Euler, Object3D, Vector3} from 'three'\nimport {MultiSelectHelper} from './MultiSelectHelper'\nimport type {UndoManagerPlugin} from './UndoManagerPlugin'\n\n/**\n * PivotControlsPlugin adds drei-style pivot controls to the viewer.\n * Unlike TransformControls which shows one mode at a time, PivotControls\n * displays all handles simultaneously: translation arrows, plane sliders,\n * rotation arcs, and scaling spheres.\n *\n * Integrates with PickingPlugin for object selection and UndoManagerPlugin\n * for undo/redo support.\n *\n * @category Plugins - Interaction\n */\n@uiFolderContainer('Pivot Controls')\nexport class PivotControlsPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'PivotControlsPlugin'\n\n    @uiToggle()\n    @onChange(PivotControlsPlugin.prototype.setDirty)\n        enabled = true\n\n    setDirty() {\n        if (!this._viewer) return\n        const picking = this._viewer.getPlugin(PickingPlugin)!\n        const enabled = !this.isDisabled()\n        if (this.pivotControls) {\n            if (!enabled) {\n                this.pivotControls.detach()\n                this._multi.clear(this._viewer!)\n            } else {\n                const objects = picking.getSelectedObjects<IObject3D>().filter(o => o?.isObject3D)\n                if (objects.length > 1) {\n                    this.pivotControls.attach(this._multi.setup(objects, this._viewer!))\n                } else if (objects.length === 1) {\n                    this._multi.clear(this._viewer!)\n                    this.pivotControls.attach(objects[0])\n                } else {\n                    this._multi.clear(this._viewer!)\n                    this.pivotControls.detach()\n                }\n            }\n        }\n        this._viewer.setDirty()\n    }\n\n    constructor(enabled = true) {\n        super()\n        PivotControls.ObjectConstructors.MeshBasicMaterial = UnlitMaterial as any\n        PivotControls.ObjectConstructors.LineBasicMaterial = UnlitLineMaterial as any\n        this.enabled = enabled\n    }\n\n    toJSON: any = undefined\n\n    dependencies = [PickingPlugin]\n\n    @uiConfig(undefined, {expanded: true})\n        pivotControls: PivotControls2 | undefined\n\n    protected _isInteracting = false\n    protected _viewerListeners = {\n        preFrame: () => {\n            if (!this.pivotControls || !this._viewer) return\n            this.pivotControls.updateGizmoScale()\n        },\n    }\n\n    private _transformState = {\n        obj: null as Object3D | null,\n        position: new Vector3(),\n        rotation: new Euler(),\n        scale: new Vector3(),\n    }\n    undoManager?: JSUndoManager\n\n    private _multi = new MultiSelectHelper()\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this.setDirty()\n        this.pivotControls = new PivotControls2(viewer.scene.mainCamera, viewer.canvas)\n        this._mainCameraChange = this._mainCameraChange.bind(this)\n        viewer.scene.addEventListener('mainCameraChange', this._mainCameraChange)\n\n        this.pivotControls.addEventListener('dragging-changed', (event) => {\n            if (!this?._viewer) return\n            const controls = this._viewer.scene.mainCamera.controls\n            if (typeof (controls as any)?.stopDamping === 'function' && controls?.enabled) (controls as OrbitControls3).stopDamping()\n            this._viewer.scene.mainCamera.setInteractions(!event.value, PivotControlsPlugin.PluginType)\n        })\n\n        this.pivotControls.addEventListener('change', () => {\n            if (!this?._viewer) return\n            this._viewer.setDirty()\n        })\n\n        viewer.scene.addObject(this.pivotControls as any, {addToRoot: true})\n\n        const picking = viewer.getPlugin(PickingPlugin)!\n        picking.addEventListener('selectedObjectChanged', (event) => {\n            if (!this.pivotControls) return\n            if (this.isDisabled()) {\n                if (this.pivotControls.object) this.pivotControls.detach()\n                this._multi.clear(this._viewer!)\n                return\n            }\n            const objects = (event.objects || []).filter((o: any) => o?.isObject3D) as IObject3D[]\n            if (objects.length > 1) {\n                this.pivotControls.attach(this._multi.setup(objects, this._viewer!))\n            } else if (event.object) {\n                this._multi.clear(this._viewer!)\n                const obj: IObject3D | null = event.intersects?.selectedHandle ?? event.intersects?.selectedObject ?? event.object\n                if (!obj || !obj.isObject3D) {\n                    this.pivotControls.detach()\n                    return\n                }\n                this.pivotControls.attach(obj)\n            } else {\n                this._multi.clear(this._viewer!)\n                this.pivotControls.detach()\n            }\n        })\n\n        viewer.forPlugin<UndoManagerPlugin>('UndoManagerPlugin', (um) => {\n            this.undoManager = um.undoManager\n        }, () => this.undoManager = undefined, this)\n\n        this.pivotControls.addEventListener('mouseDown', () => {\n            if (!this.pivotControls) return\n            if (this._multi.hasMultiSelect) {\n                this._multi.captureStart()\n                return\n            }\n            const object = this.pivotControls.object\n            if (!object) return\n            this._transformState.obj = object\n            this._transformState.position = object.position.clone()\n            this._transformState.rotation = object.rotation.clone()\n            this._transformState.scale = object.scale.clone()\n        })\n\n        this.pivotControls.addEventListener('objectChange', () => {\n            if (this._multi.hasMultiSelect) this._multi.applyDelta()\n        })\n\n        this.pivotControls.addEventListener('mouseUp', (event) => {\n            if (!this.pivotControls) return\n            if (this._multi.hasMultiSelect && this._multi.hasStartStates) {\n                if (this.undoManager) this._multi.recordUndo(this.undoManager)\n                return\n            }\n            const object = this.pivotControls.object\n            if (!object) return\n            if (this._transformState.obj !== object || !this.undoManager) return\n\n            const mode = event.mode\n            const key = ({\n                translate: 'position',\n                rotate: 'rotation',\n                scale: 'scale',\n            } as const)[mode as 'translate' | 'rotate' | 'scale']\n            if (!key) return\n            if (this._transformState[key].equals(object[key] as any)) return\n\n            const command = {\n                last: this._transformState[key].clone(),\n                current: object[key].clone(),\n                set: (value: any) => {\n                    object[key].copy(value)\n                    object.updateMatrixWorld(true)\n                    this.pivotControls?.dispatchEvent({type: 'change'})\n                    this.pivotControls?.dispatchEvent({type: 'objectChange'})\n                },\n                undo: () => command.set(command.last),\n                redo: () => command.set(command.current),\n            }\n            this.undoManager.record(command)\n        })\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)\n        this._multi.clear(viewer)\n        if (this.pivotControls) {\n            this.pivotControls.detach()\n            viewer.scene.remove(this.pivotControls as any)\n            this.pivotControls.dispose()\n        }\n        this.pivotControls = undefined\n        super.onRemove(viewer)\n    }\n\n    private _mainCameraChange = () => {\n        if (!this.pivotControls || !this._viewer) return\n        this.pivotControls.camera = this._viewer.scene.mainCamera\n    }\n}\n\n/**\n * Extended PivotControls implementing threepipe's IWidget interface.\n */\n@uiFolderContainer('Pivot Controls')\nexport class PivotControls2 extends PivotControls implements IWidget, IObject3D {\n    isWidget = true as const\n    assetType = 'widget' as const\n    setDirty = iObjectCommons.setDirty.bind(this)\n    refreshUi = iObjectCommons.refreshUi.bind(this)\n\n    declare object: IObject3D | undefined\n\n    constructor(camera: ICamera, canvas: HTMLCanvasElement) {\n        super(camera, canvas)\n        this.visible = false\n        this.userData.bboxVisible = false\n\n        this.addEventListener('objectChange', () => {\n            this?.object?.setDirty && this.object.setDirty({frameFade: false, change: 'transform'})\n        })\n        this.addEventListener('change', () => {\n            this.setDirty({frameFade: false})\n        })\n\n        this.traverse(c => {\n            c.castShadow = false\n            c.receiveShadow = false\n            c.userData.__keepShadowDef = true\n        })\n    }\n\n    // region UI properties\n\n    @uiDropdown('Space', ['world', 'local'].map(label => ({label})))\n    @onChange(PivotControls2.prototype._onVisibilityChange)\n    declare space: 'world' | 'local'\n\n    @uiSlider('Gizmo Scale', [0.1, 10], 0.01)\n    @onChange(PivotControls2.prototype._onVisibilityChange)\n    declare gizmoScale: number\n\n    @uiToggle('Fixed Size')\n    @onChange(PivotControls2.prototype._onVisibilityChange)\n    declare fixed: boolean\n\n    @uiToggle('Depth Test')\n    @onChange(PivotControls2.prototype._onRebuild)\n    declare depthTest: boolean\n\n    @uiToggle('Annotations')\n    declare annotations: boolean\n\n    @uiSlider('Translation Snap', [0.01, 5], 0.01)\n    declare translationSnap: number | null\n\n    @uiSlider('Rotation Snap (deg)', [1, 90], 1)\n    declare rotationSnap: number | null\n\n    @uiSlider('Scale Snap', [0.01, 1], 0.01)\n    declare scaleSnap: number | null\n\n    @uiToggle('Uniform Scale (Alt)')\n    declare uniformScaleEnabled: boolean\n\n    @uiToggle('Disable Axes')\n    @onChange(PivotControls2.prototype._onVisibilityChange)\n    declare disableAxes: boolean\n\n    @uiToggle('Disable Sliders')\n    @onChange(PivotControls2.prototype._onVisibilityChange)\n    declare disableSliders: boolean\n\n    @uiToggle('Disable Rotations')\n    @onChange(PivotControls2.prototype._onVisibilityChange)\n    declare disableRotations: boolean\n\n    @uiToggle('Disable Scaling')\n    @onChange(PivotControls2.prototype._onVisibilityChange)\n    declare disableScaling: boolean\n\n    // endregion\n\n    private _onVisibilityChange(): void {\n        this.updateHandleVisibility()\n        if (this.setDirty) this.setDirty({frameFade: false})\n    }\n\n    private _onRebuild(): void {\n        if (!this.domElement) return\n        this.rebuild()\n        if (this.setDirty) this.setDirty({frameFade: false})\n    }\n\n    /**\n     * @deprecated use object directly\n     */\n    get modelObject(): this {\n        return this as any\n    }\n\n    // region inherited type fixes\n    declare traverse: (callback: (object: IObject3D) => void) => void\n    declare traverseVisible: (callback: (object: IObject3D) => void) => void\n    declare traverseAncestors: (callback: (object: IObject3D) => void) => void\n    declare getObjectById: (id: number) => IObject3D | undefined\n    declare getObjectByName: (name: string) => IObject3D | undefined\n    declare getObjectByProperty: (name: string, value: string) => IObject3D | undefined\n    declare parent: IObject3D | null\n    declare children: IObject3D[]\n    // endregion\n}\n","import {uiButton, uiColor, uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {PickingPlugin} from './PickingPlugin'\nimport {JSUndoManager, onChange} from 'ts-browser-helpers'\nimport {OrbitControls3, TransformControls} from '../../three'\nimport {Group2, IObject3D, IWidget, UnlitLineMaterial, UnlitMaterial} from '../../core'\nimport {Mesh, MeshBasicMaterial, Object3D, SphereGeometry, Vector3} from 'three'\nimport type {UndoManagerPlugin} from './UndoManagerPlugin'\nimport type {TransformControlsPlugin} from './TransformControlsPlugin'\nimport type {PivotControlsPlugin} from './PivotControlsPlugin'\nimport {Box3B} from '../../three/math/Box3B'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _pos = new Vector3()\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst _camPos = new Vector3()\n\n/**\n * PivotEditPlugin provides interactive pivot point (origin) editing for objects.\n * Toggle \"Edit Pivot\" mode to show a translate-only gizmo at the object's pivot.\n * Dragging moves only the pivot while the object mesh stays visually in place.\n *\n * Works alongside both TransformControlsPlugin and PivotControlsPlugin.\n *\n * @category Plugins - Interaction\n */\n@uiFolderContainer('Pivot Edit')\nexport class PivotEditPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'PivotEditPlugin'\n\n    dependencies = [PickingPlugin]\n\n    @uiToggle()\n    @onChange(PivotEditPlugin.prototype._onEnabledChange)\n        enabled = true\n\n    @uiToggle('Edit Pivot')\n    @onChange(PivotEditPlugin.prototype._onEditPivotChange)\n        editPivot = false\n\n    @uiToggle('Show Pivot Marker')\n    @onChange(PivotEditPlugin.prototype._onDirty)\n        showPivotMarker = true\n\n    @uiSlider('Marker Scale', [0.1, 5], 0.1)\n    @onChange(PivotEditPlugin.prototype._onDirty)\n        markerScale = 0.5\n\n    @uiColor('Marker Color')\n    @onChange(PivotEditPlugin.prototype._onMarkerColorChange)\n        markerColor = 0xffff00\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n\n    toJSON: any = undefined\n\n    private _pivotGizmo: TransformControls | null = null\n    private _markerRoot: Group2 | null = null // assetType='model' root for raycasting\n    private _markerWidget: (Group2 & IWidget) | null = null // assetType='widget' wrapper for handle resolution\n    private _pivotMarker: Mesh<SphereGeometry, MeshBasicMaterial> | null = null\n    private _selectedObject: IObject3D | null = null\n    undoManager?: JSUndoManager\n\n    protected _viewerListeners = {\n        preFrame: () => this._updateMarker(),\n    }\n\n    private _onKeyDown: ((e: KeyboardEvent) => void) | null = null\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n\n        const picking = viewer.getPlugin(PickingPlugin)!\n\n        // Intercept pivot marker clicks before selection happens.\n        // hitObject fires before setSelected, so setting selectedObject to the\n        // current selection prevents any selection change — no other plugin sees the click.\n        picking.addEventListener('hitObject', (event) => {\n            if (event.intersects?.selectedHandle?.userData.isPivotMarker) {\n                // Mark consumed so the picker skips selection changes for this click\n                event.intersects.consumed = true\n                this.editPivot = !this.editPivot\n                this._onEditPivotChange()\n            }\n        })\n\n        picking.addEventListener('selectedObjectChanged', (event) => {\n            const newObject = event.object as IObject3D | null\n            const objectChanged = newObject !== this._selectedObject\n            this._selectedObject = newObject\n            if (this._markerWidget) this._markerWidget.object = this._selectedObject\n            // Exit edit mode on object change or deselection\n            if (this.editPivot && objectChanged) {\n                this.editPivot = false\n                this._onEditPivotChange()\n            }\n            this._updateMarker()\n        })\n\n        viewer.forPlugin<UndoManagerPlugin>('UndoManagerPlugin', (um) => {\n            this.undoManager = um.undoManager\n        }, () => this.undoManager = undefined, this)\n\n        this._onKeyDown = (event: KeyboardEvent) => {\n            if (this.isDisabled()) return\n            if (event.metaKey || event.ctrlKey) return\n            if ((event.target as any)?.tagName === 'TEXTAREA' || (event.target as any)?.tagName === 'INPUT') return\n            if (event.code === 'KeyP') {\n                this.editPivot = !this.editPivot\n                this._onEditPivotChange()\n            } else if (event.code === 'Escape' && this.editPivot) {\n                this.editPivot = false\n                this._onEditPivotChange()\n            }\n        }\n        window.addEventListener('keydown', this._onKeyDown)\n\n        // Create pivot marker as a widget handle, pickable via PickingPlugin.\n        // Structure: _markerRoot (Group2, assetType='model', isWidgetRoot)\n        //            └── _markerWidget (Group, assetType='widget', object=selectedObject)\n        //                └── _pivotMarker (Mesh, isWidgetHandle, isPivotMarker)\n        const mat = new MeshBasicMaterial({\n            color: this.markerColor, depthTest: false, depthWrite: false,\n            toneMapped: false, transparent: true, opacity: 0.9,\n        })\n        this._pivotMarker = new Mesh(new SphereGeometry(1, 8, 8), mat)\n        this._pivotMarker.renderOrder = 1000\n        this._pivotMarker.userData.isWidgetHandle = true\n        this._pivotMarker.userData.isPivotMarker = true\n\n        const markerWidget = new Group2() as Group2 & IWidget\n        markerWidget.isWidget = true as const\n        markerWidget.assetType = 'widget' as const\n        markerWidget.object = this._selectedObject\n        markerWidget.attach = (obj: any) => { markerWidget.object = obj; return markerWidget }\n        markerWidget.detach = () => { markerWidget.object = undefined; return markerWidget }\n        this._markerWidget = markerWidget\n        this._markerWidget.add(this._pivotMarker)\n\n        this._markerRoot = new Group2()\n        this._markerRoot.userData.isWidgetRoot = true\n        this._markerRoot.add(this._markerWidget)\n        this._markerRoot.visible = false\n\n        this._markerRoot.traverse(c => {\n            c.castShadow = false\n            c.receiveShadow = false\n            c.userData.__keepShadowDef = true\n        })\n        viewer.scene.addObject(this._markerRoot, {addToRoot: true})\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        if (this._onKeyDown) {\n            window.removeEventListener('keydown', this._onKeyDown)\n            this._onKeyDown = null\n        }\n        this._destroyGizmo(viewer)\n        if (this._markerRoot) {\n            viewer.scene.remove(this._markerRoot)\n            if (this._pivotMarker) {\n                this._pivotMarker.geometry.dispose()\n                this._pivotMarker.material.dispose()\n            }\n            this._markerRoot = null\n            this._markerWidget = null\n            this._pivotMarker = null\n        }\n        super.onRemove(viewer)\n    }\n\n    // ========================================================================\n    // Presets\n    // ========================================================================\n\n    @uiButton('Pivot to Center')\n    pivotToCenter(): void {\n        if (!this._selectedObject?.pivotToBoundsCenter) return\n        this._recordUndo(this._selectedObject.pivotToBoundsCenter(true))\n        this._refreshAfterPivotChange()\n    }\n\n    @uiButton('Pivot to Bottom')\n    pivotToBottom(): void {\n        if (!this._selectedObject?.pivotToPoint) return\n        const bb = new Box3B().expandByObject(this._selectedObject, true, true)\n        const center = bb.getCenter(new Vector3())\n        this._applyPivot(new Vector3(center.x, bb.min.y, center.z))\n    }\n\n    @uiButton('Pivot to Origin')\n    pivotToOrigin(): void {\n        this._applyPivot(new Vector3(0, 0, 0))\n    }\n\n    pivotToPoint(point: Vector3): void {\n        this._applyPivot(point)\n    }\n\n    private _applyPivot(target: Vector3): void {\n        if (!this._selectedObject?.pivotToPoint) return\n        const undoFn = (this._selectedObject.pivotToPoint(target, true) as unknown) as () => void\n        this._recordUndo(undoFn)\n        this._refreshAfterPivotChange()\n    }\n\n    // ========================================================================\n    // Marker\n    // ========================================================================\n\n    private _updateMarker(): void {\n        if (!this._markerRoot || !this._pivotMarker || !this._viewer) return\n        if (this.isDisabled() || !this.showPivotMarker || !this._selectedObject) {\n            this._markerRoot.visible = false\n            return\n        }\n        this._selectedObject.updateWorldMatrix(true, false)\n        _pos.setFromMatrixPosition(this._selectedObject.matrixWorld)\n        this._markerRoot.position.copy(_pos)\n        this._markerRoot.visible = true\n\n        // Constant screen-size (same formula as TransformControls)\n        const camera = this._viewer.scene.mainCamera as any\n        let factor: number\n        if (camera.isOrthographicCamera) {\n            factor = (camera.top - camera.bottom) / camera.zoom\n        } else {\n            _camPos.setFromMatrixPosition(camera.matrixWorld)\n            factor = _pos.distanceTo(_camPos) *\n                Math.min(1.9 * Math.tan(Math.PI * camera.fov / 360) / camera.zoom, 7)\n        }\n        this._pivotMarker.scale.setScalar(factor * this.markerScale * 0.05)\n    }\n\n    // ========================================================================\n    // Gizmo\n    // ========================================================================\n\n    private _onEditPivotChange(): void {\n        if (!this._viewer) return\n        if (this.editPivot) this._attachGizmo()\n        else this._detachGizmo()\n        this._viewer.setDirty()\n    }\n\n    private _attachGizmo(): void {\n        if (!this._viewer || !this._selectedObject) return\n        this._setTransformControlsEnabled(false)\n\n        if (!this._pivotGizmo) {\n            TransformControls.ObjectConstructors.MeshBasicMaterial = UnlitMaterial as any\n            TransformControls.ObjectConstructors.LineBasicMaterial = UnlitLineMaterial as any\n            this._pivotGizmo = new TransformControls(this._viewer.scene.mainCamera, this._viewer.canvas)\n            this._pivotGizmo.setMode('translate')\n            this._pivotGizmo.userData.bboxVisible = false\n            this._pivotGizmo.visible = false\n            this._pivotGizmo.traverse(c => {\n                c.castShadow = false\n                c.receiveShadow = false\n                c.userData.__keepShadowDef = true\n            })\n\n            this._pivotGizmo.addEventListener('mouseUp', () => {\n                if (!this._selectedObject?.pivotToPoint || !this._pivotGizmo?.object) return\n                const newPos = new Vector3().setFromMatrixPosition(this._pivotGizmo.object.matrixWorld)\n                const undoFn = (this._selectedObject.pivotToPoint(newPos, true) as unknown) as () => void\n                this._recordUndo(undoFn)\n                // Update dummy position to the new pivot (pivotToPoint moved the object's origin)\n                this._refreshAfterPivotChange()\n            })\n\n            this._pivotGizmo.addEventListener('change', () => {\n                if (this._viewer) this._viewer.setDirty()\n            })\n\n            this._pivotGizmo.addEventListener('dragging-changed', (event: any) => {\n                if (!this._viewer) return\n                const controls = this._viewer.scene.mainCamera.controls\n                if (typeof (controls as any)?.stopDamping === 'function' && controls?.enabled) (controls as OrbitControls3).stopDamping()\n                this._viewer.scene.mainCamera.setInteractions(!event.value, PivotEditPlugin.PluginType)\n            })\n\n            this._viewer.scene.addObject(this._pivotGizmo as any, {addToRoot: true})\n        }\n\n        this._selectedObject.updateWorldMatrix(true, false)\n        const pivotPos = new Vector3().setFromMatrixPosition(this._selectedObject.matrixWorld)\n\n        if (!this._pivotGizmo.object) {\n            const dummy = new Object3D()\n            dummy.position.copy(pivotPos)\n            this._viewer.scene.addObject(dummy as any, {addToRoot: true})\n            this._pivotGizmo.attach(dummy)\n        } else {\n            this._pivotGizmo.object.position.copy(pivotPos)\n            this._pivotGizmo.object.updateMatrixWorld(true)\n        }\n    }\n\n    private _detachGizmo(): void {\n        if (this._pivotGizmo) {\n            const dummy = this._pivotGizmo.object\n            this._pivotGizmo.detach()\n            if (dummy && this._viewer) this._viewer.scene.remove(dummy)\n        }\n        this._setTransformControlsEnabled(true)\n    }\n\n    private _destroyGizmo(viewer: ThreeViewer): void {\n        if (!this._pivotGizmo) return\n        this._detachGizmo()\n        viewer.scene.remove(this._pivotGizmo as any)\n        this._pivotGizmo.dispose()\n        this._pivotGizmo = null\n    }\n\n    private _setTransformControlsEnabled(enabled: boolean): void {\n        if (!this._viewer) return\n        const tcp = this._viewer.getPlugin<TransformControlsPlugin>('TransformControlsPlugin')\n        if (tcp) {\n            if (enabled) tcp.setDirty()\n            else tcp.transformControls?.detach()\n        }\n        const pcp = this._viewer.getPlugin<PivotControlsPlugin>('PivotControlsPlugin')\n        if (pcp) {\n            if (enabled) pcp.setDirty()\n            else pcp.pivotControls?.detach()\n        }\n    }\n\n    private _onEnabledChange(): void {\n        if (this.isDisabled() && this.editPivot) {\n            this.editPivot = false\n            this._onEditPivotChange()\n        }\n        this._updateMarker()\n        if (this._viewer) this._viewer.setDirty()\n    }\n\n    private _refreshAfterPivotChange(): void {\n        if (!this._viewer) return\n        if (this.editPivot && this._selectedObject && this._pivotGizmo?.object) {\n            this._selectedObject.updateWorldMatrix(true, false)\n            this._pivotGizmo.object.position.setFromMatrixPosition(this._selectedObject.matrixWorld)\n            this._pivotGizmo.object.updateMatrixWorld(true)\n        }\n        this._updateMarker()\n        this._viewer.setDirty()\n    }\n\n    private _onDirty(): void {\n        if (this._viewer) this._viewer.setDirty()\n    }\n\n    private _onMarkerColorChange(): void {\n        if (this._pivotMarker) this._pivotMarker.material.color.set(this.markerColor)\n        if (this._viewer) this._viewer.setDirty()\n    }\n\n    // ========================================================================\n    // Undo\n    // ========================================================================\n\n    private _recordUndo(undoFn: () => void): void {\n        if (!this.undoManager || !this._selectedObject) return\n        const obj = this._selectedObject\n        obj.updateWorldMatrix(true, false)\n        const newPivotPos = new Vector3().setFromMatrixPosition(obj.matrixWorld)\n\n        this.undoManager.record({\n            undo: () => {\n                undoFn()\n                this._refreshAfterPivotChange()\n            },\n            redo: () => {\n                if (obj.pivotToPoint) {\n                    obj.pivotToPoint(newPivotPos, true)\n                    this._refreshAfterPivotChange()\n                }\n            },\n        })\n    }\n}\n","import {AViewerPluginSync, type IViewerEvent, ThreeViewer} from '../../viewer'\nimport {DomPlacement, GizmoOrientation, ViewHelper2} from '../../three'\nimport {uiFolderContainer, uiToggle} from 'uiconfig.js'\nimport {onChange} from 'ts-browser-helpers'\n\n@uiFolderContainer('Editor View Widget')\nexport class EditorViewWidgetPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'EditorViewWidgetPlugin'\n\n    @uiToggle()\n    @onChange(EditorViewWidgetPlugin.prototype.setDirty)\n        enabled = true\n\n    setDirty() {\n        if (!this._viewer || !this.widget) return\n        this.widget.domContainer.style.display = !this.isDisabled() ? 'block' : 'none'\n    }\n\n    constructor(public readonly placement: DomPlacement = 'top-left', public readonly size = 128) {\n        super()\n        this.setDirty = this.setDirty.bind(this)\n        this._mainCameraChange = this._mainCameraChange.bind(this)\n        this._mainCameraUpdate = this._mainCameraUpdate.bind(this)\n    }\n\n    widget?: ViewHelper2\n\n    onAdded(v: ThreeViewer) {\n        super.onAdded(v)\n        this.widget = new ViewHelper2(v.scene.mainCamera as any, v.canvas, this.placement, this.size)\n        this.widget.target = v.scene.mainCamera.target\n        this.widget.addEventListener('animating-changed', (e)=>{\n            const val = e.detail.value\n            v.scene.mainCamera.setInteractions(!val, EditorViewWidgetPlugin.PluginType)\n        })\n        this.widget.addEventListener('update', ()=>this._needsRender = true) // when mouse hover and leave.\n        v.scene.addEventListener('mainCameraChange', this._mainCameraChange)\n        v.scene.addEventListener('mainCameraUpdate', this._mainCameraUpdate)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        this.widget?.dispose()\n        this.widget = undefined\n        viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)\n        viewer.scene.removeEventListener('mainCameraUpdate', this._mainCameraUpdate)\n        super.onRemove(viewer)\n    }\n\n    protected _mainCameraChange() {\n        if (!this._viewer || !this.widget) return\n        this.widget.camera = this._viewer.scene.mainCamera as any\n    }\n    protected _mainCameraUpdate() {\n        if (!this._viewer || !this.widget) return\n        this.widget.target = this._viewer.scene.mainCamera.target\n    }\n\n    // this is required separately so that when we hover on the gizmo we dont need to set dirty for the whole viewer\n    protected _needsRender = false\n    protected _viewerListeners = {\n        postRender: (_: IViewerEvent)=>{\n            if (!this._viewer || !this.widget || this.isDisabled()) return\n            this._needsRender = true\n        },\n        postFrame: (_: IViewerEvent)=>{\n            if (!this._viewer || !this.widget || this.isDisabled() || !this._needsRender) return\n            this.widget.update()\n            this.widget.render()\n            if (this.widget.animating) this._viewer.scene.mainCamera.setDirty()\n            this._needsRender = false\n        },\n    }\n\n    setOrientation(orientation: GizmoOrientation) {\n        if (!this.widget) return\n        this.widget.setOrientation(orientation)\n    }\n\n}\n\n\n","import {ACameraControlsPlugin} from '../base/ACameraControlsPlugin'\nimport {TControlsCtor} from '../../core'\nimport {DeviceOrientationControls2} from '../../three'\n\nexport class DeviceOrientationControlsPlugin extends ACameraControlsPlugin {\n    public static readonly PluginType = 'DeviceOrientationControlsPlugin'\n    readonly controlsKey = 'deviceOrientation'\n\n    protected _controlsCtor: TControlsCtor = (object, _domElement)=> new DeviceOrientationControls2(object)\n}\n","import {ACameraControlsPlugin} from '../base/ACameraControlsPlugin'\nimport {TControlsCtor} from '../../core'\nimport {PointerLockControls2} from '../../three'\n\nexport class PointerLockControlsPlugin extends ACameraControlsPlugin {\n    public static readonly PluginType = 'PointerLockControlsPlugin'\n    readonly controlsKey = 'pointerLock'\n\n    protected _controlsCtor: TControlsCtor = (object, domElement) => new PointerLockControls2(object, !domElement?.ownerDocument ? (domElement || document).documentElement : domElement)\n}\n","import {ACameraControlsPlugin} from '../base/ACameraControlsPlugin'\nimport {TControlsCtor} from '../../core'\nimport {FirstPersonControls2} from '../../three'\n\nexport class ThreeFirstPersonControlsPlugin extends ACameraControlsPlugin {\n    public static readonly PluginType = 'ThreeFirstPersonControlsPlugin'\n    readonly controlsKey = 'threeFirstPerson'\n\n    protected _controlsCtor: TControlsCtor = (object, domElement) => new FirstPersonControls2(object, domElement || document.documentElement)\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {\n    ActionUndoCommand,\n    AnyFunction,\n    getUrlQueryParam,\n    JSUndoManager,\n    onChange,\n    PrimitiveVal,\n    recordUndoCommand,\n    SetValueUndoCommand,\n    setValueUndoCommand,\n    SetValueUndoCommandProps,\n} from 'ts-browser-helpers'\n\n/**\n * UndoManagerPlugin is a plugin for ThreeViewer that provides undo/redo functionality.\n * It uses the JSUndoManager(from ts-browser-helpers) library to maintain a common undo/redo history across the viewer and other plugins.\n */\n// @uiPanelContainer('Undo Manager')\nexport class UndoManagerPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'UndoManagerPlugin'\n\n    // @uiToggle()\n    @onChange(UndoManagerPlugin.prototype._refresh)\n        enabled = true\n\n    undoManager?: JSUndoManager\n\n    @onChange(UndoManagerPlugin.prototype._refresh)\n        limit = 1000\n\n    constructor(enabled = true, limit = 1000) {\n        super()\n        this.enabled = enabled\n        this.limit = limit\n    }\n\n    undo() {\n        this.undoManager?.undo()\n    }\n\n    redo() {\n        this.undoManager?.redo()\n    }\n\n    protected _refresh() {\n        if (!this.undoManager) return\n        this.undoManager.enabled = this.enabled\n        this.undoManager.limit = this.limit\n        this.undoManager.options.debug = this._viewer?.debug || this.undoManager.options.debug\n        if (this.undoManager) Object.assign(this.undoManager.presets, this.undoPresets)\n    }\n\n    toJSON: any = undefined\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this.undoManager = new JSUndoManager({bindHotKeys: true, limit: this.limit, debug: viewer.debug || getUrlQueryParam('debugUndo') !== null, hotKeyRoot: document as any})\n        this._refresh()\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        this.undoManager?.dispose()\n        this.undoManager = undefined\n        super.onRemove(viewer)\n    }\n\n    undoEditingWaitTime = 2000 // todo sync time with any ui plugins\n    recordUndo(com: SetValueUndoCommand|ActionUndoCommand) {\n        return recordUndoCommand(this.undoManager, com, this.undoCommandTypes.setValue, this.undoEditingWaitTime)\n    }\n\n    /**\n     * Performs an action with undo/redo support.\n     * @param targ - the target object to call the action on\n     * @param action - a function that returns - 1. an undo function, 2. an object with undo and redo functions (and optional action)\n     * @param args - the arguments to pass to the action function\n     * @param uid - unique identifier for the command, not really used in actions\n     * @param onUndoRedo - optional callback function to be called on undo/redo of the command. Not called on first action execution, only on undo/redo.\n     */\n    async performAction<T extends AnyFunction>(targ: any|undefined, action: T, args: Parameters<T>, uid: any, onUndoRedo?: (c: ActionUndoCommand)=>void) {\n        const ac = ()=> targ === undefined ? action(...args) : action.call(targ, ...args) // if a function is returned, it is treated as undo function\n        let res = await ac()\n        const undo = typeof res === 'function' ? res : res?.undo?.bind(res)\n        const resAction = typeof res !== 'function' ? res?.action?.bind(res) : null\n        const redo = typeof res === 'function' ? ac : res?.redo?.bind(res) ?? resAction\n        if (typeof resAction === 'function') {\n            res = await resAction() // execute the action now. adding await just in case\n        }\n        if (typeof undo === 'function') {\n            this.recordUndo({\n                type: 'UiConfigMethods_action',\n                uid: uid,\n                target: targ,\n                undo: undo,\n                redo: redo,\n                args,\n                onUndoRedo,\n            })\n        }\n    }\n\n    /**\n     * Sets a value in the target object with undo/redo support.\n     * @param binding - a tuple of target object and key to set the value on\n     * @param value - the value to set\n     * @param props - properties for the undo command, including last, and lastValue(optional)\n     * @param uid - unique identifier for the command, used to merge commands\n     * @param forceOnChange\n     * @param trackUndo - whether to track the undo command or not, defaults to true\n     * @param onUndoRedo - optional callback function to be called on undo/redo of the command\n     * @returns true if the value was set and the command was recorded, false if the command was not recorded (e.g. if it was not undoable or forceOnChange was false)\n     */\n    setValue<T extends PrimitiveVal, T1 = any>(binding: [T1, keyof T1], value: T, props: SetValueUndoCommandProps<T>, uid?: any, forceOnChange?: boolean, trackUndo = true, onUndoRedo?: (c: SetValueUndoCommand)=>void) {\n        const ev = setValueUndoCommand(this.undoManager, binding, value, props, uid, this.undoCommandTypes.setValue, trackUndo, this.undoEditingWaitTime, true, onUndoRedo)\n        if (!ev.undoable && !forceOnChange) return false\n        // this.dispatchOnChangeSync({...props, ...ev}) // todo\n        return true\n    }\n\n    setValues(bindings: [any, keyof any][], defs: any[], v: any[], props: SetValueUndoCommandProps<any>, uid?: any, forceOnChange?: boolean, trackUndo = true, onUndoRedo?: (c: SetValueUndoCommand)=>void) {\n        // array proxy for bindings, this is required because undo modifies arrays in place, and it's better as we only update the bindings that are actually changed.\n        const proxy = createBindingsProxy(bindings, defs)\n        return this.setValue([proxy, 'value'], v, props, uid, forceOnChange, trackUndo, onUndoRedo)\n    }\n\n\n    readonly undoCommandTypes = {\n        setValue: 'ThreeViewerUM_set' as const,\n        action: 'ThreeViewerUM_action' as const,\n    } as const\n\n    undoPresets = {\n        [this.undoCommandTypes.setValue]: (c: SetValueUndoCommand)=>{\n            const ref = ()=>{\n                c.onUndoRedo && c.onUndoRedo(c)\n                // c.uid.uiRefresh?.(false)\n            }\n            return {\n                undo: ()=>{\n                    console.log('undo', c.lastVal)\n                    if (!c.binding) return\n                    this.setValue(c.binding, c.lastVal, c.props, c.uid, undefined, false)\n                    // .then(ref)\n                    ref()\n                },\n                redo: ()=>{\n                    // console.log('redo', c.val)\n                    if (!c.binding) return\n                    this.setValue(c.binding, c.val, c.props, c.uid, undefined, false)\n                    // .then(ref)\n                    ref()\n                },\n            }\n        },\n        [this.undoCommandTypes.action]: (c: ActionUndoCommand)=>{\n            const ref = ()=>{\n                c.onUndoRedo && c.onUndoRedo(c)\n            }\n            return {\n                undo: async()=>{\n                    await c.undo.call(c.target, ...c.args)\n                    ref()\n                },\n                redo: async()=>{\n                    await c.redo.call(c.target, ...c.args)\n                    ref()\n                },\n            }\n        },\n    }\n\n}\n\n/**\n * Creates a proxy for an array of bindings, allowing to access and set values in the target objects by editing the value.\n * Useful for updating multiple properties in a single undo/redo command when dragging.\n * @param bindings\n * @param defs\n */\nexport function createBindingsProxy(bindings: [any, keyof any][], defs: any[]) {\n    return {\n        p: new Proxy([] as any[], {\n            get(_target, p, ...rest): any {\n                if (p === 'length') {\n                    return bindings.length\n                }\n                const index = Number(p)\n                if (isNaN(index) || index < 0 || index >= bindings.length) {\n                    return Reflect.get(Array.prototype, p, ...rest) || Reflect.get(_target, p, ...rest)\n                }\n                const [target, key] = bindings[index]\n                return target?.[key] ?? defs[index]\n            },\n            set(_target, p, newValue: any, ...rest): boolean {\n                const index = Number(p)\n                if (isNaN(index) || index < 0 || index >= bindings.length) {\n                    return Reflect.set(_target, p, newValue, ...rest)\n                }\n                const [target, key] = bindings[index]\n                if (target) {\n                    target[key] = newValue\n                    return true\n                }\n                return false\n            },\n            // for every etc.\n            has(_target, p, ...rest) {\n                const index = Number(p)\n                if (isNaN(index) || index < 0 || index >= bindings.length) {\n                    return Reflect.has(Array.prototype, p, ...rest) || Reflect.has(_target, p, ...rest)\n                }\n                return true\n            },\n        }),\n        get value() {\n            return this.p\n        },\n        set value(va: any[]) {\n            if (bindings.length !== va.length) {\n                console.error(`UndoManager - setValues: bindings length (${bindings.length}) does not match value length (${va.length})`)\n            }\n            for (let i = 0; i < Math.min(va.length, bindings.length); i++) {\n                this.p[i] = va[i]\n            }\n        },\n    }\n}\n","import {onChange} from 'ts-browser-helpers'\nimport {Importer, Rhino3dmLoader2} from '../../assetmanager'\nimport {BaseImporterPlugin} from '../base/BaseImporterPlugin'\nimport {IUiConfigContainer, uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {ThreeViewer} from '../../viewer'\n\n/**\n * Adds support for loading Rhino `.3dm`, `model/vnd.3dm`, `model/3dm` files and data uris.\n * @category Plugins\n */\n@uiFolderContainer('Rhino 3dm Loader')\nexport class Rhino3dmLoadPlugin extends BaseImporterPlugin implements IUiConfigContainer {\n    public static readonly PluginType = 'Rhino3dmLoadPlugin'\n    protected _importer = new Importer(Rhino3dmLoader2, ['3dm'], ['model/vnd.3dm', 'model/3dm'], true)\n    declare uiConfig: UiObjectConfig\n\n    /**\n     * Import materials from the file based on material source and color source. If false, a default material will be used\n     * Same as {@link Rhino3dmLoader2.ImportMaterials}\n     */\n    @onChange(Rhino3dmLoadPlugin.prototype._refresh) @uiToggle()\n        importMaterials = true\n    /**\n     * Force layer materials even if material/color source is not from layer. Only works if {@link importMaterials} is true\n     * Same as {@link Rhino3dmLoader2.ForceLayerMaterials}\n     */\n    @onChange(Rhino3dmLoadPlugin.prototype._refresh) @uiToggle()\n        forceLayerMaterials = false\n    /**\n     * Replace meshes with instanced meshes if they have the same parent, geometry and material\n     * Same as {@link Rhino3dmLoader2.ReplaceWithInstancedMesh}\n     */\n    @onChange(Rhino3dmLoadPlugin.prototype._refresh) @uiToggle()\n        replaceWithInstancedMesh = false\n    /**\n     * Hide all lines, line segments and points in the file\n     * Same as {@link Rhino3dmLoader2.HideLineMesh}\n     */\n    @onChange(Rhino3dmLoadPlugin.prototype._refresh) @uiToggle()\n        hideLineMesh = false\n    /**\n     * Hide all points in the file\n     */\n    @onChange(Rhino3dmLoadPlugin.prototype._refresh)\n    @uiToggle()\n        hidePointMesh = true\n\n    /**\n     * Remove strings from userData\n     */\n    @onChange(Rhino3dmLoadPlugin.prototype._refresh)\n    @uiToggle()\n        loadUserDataStrings = true\n\n    protected _refresh() {\n        Rhino3dmLoader2.ImportMaterials = this.importMaterials\n        Rhino3dmLoader2.ForceLayerMaterials = this.forceLayerMaterials\n        Rhino3dmLoader2.ReplaceWithInstancedMesh = this.replaceWithInstancedMesh\n        Rhino3dmLoader2.HideLineMesh = this.hideLineMesh\n        Rhino3dmLoader2.HidePointMesh = this.hidePointMesh\n        Rhino3dmLoader2.LoadUserDataStrings = this.loadUserDataStrings\n        Rhino3dmLoader2.LoadUserDataWarnings = false\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        if (!window.WebAssembly) throw new Error('Rhino3dmLoadPlugin requires WebAssembly support')\n        super.onAdded(viewer)\n        this._refresh()\n    }\n\n}\n","import {Importer} from '../../assetmanager'\nimport {USDZLoader} from 'three/examples/jsm/loaders/USDZLoader.js'\nimport {Group, Mesh} from 'three'\nimport {Zippable, zipSync} from 'three/examples/jsm/libs/fflate.module.js'\nimport {BaseImporterPlugin} from '../base/BaseImporterPlugin'\n\n/**\n * Adds support for loading `.usdz`, `model/vnd.usd+zip` and `.usda`, `model/vnd.usda` files and data uris\n * @category Plugins\n */\nexport class USDZLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'USDZLoadPlugin'\n    protected _importer = new Importer(class extends USDZLoader {\n\n        currentUrl = ''\n\n        async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Mesh> {\n            this.currentUrl = url\n            const res = await super.loadAsync(url, onProgress)\n            // console.log(res)\n            this.currentUrl = ''\n            if (!res.children.length) throw new Error('No mesh found in USDZ file, note that usdc files are not supported.')\n            // todo see three-usdz-loader\n            return res\n        }\n\n        parse(buffer: ArrayBuffer|string): Group {\n            // todo make changes in three.js to allow passing unzipped buffer directly for usda\n            if (this.currentUrl.endsWith('.usda') && typeof buffer !== 'string') {\n                const filename = this.currentUrl.split('/').pop()\n                if (filename) {\n                    const zip: Zippable = {}\n                    zip[filename] = new Uint8Array(buffer)\n                    buffer = zipSync(zip).buffer as ArrayBuffer\n                }\n            }\n            return super.parse(buffer)\n        }\n    }, ['usdz', 'usda'], ['model/vnd.usd+zip', 'model/vnd.usdz+zip', 'model/vnd.usda'], false)\n\n}\n","import {ILoader, Importer} from '../../assetmanager'\nimport {PLYLoader} from 'three/examples/jsm/loaders/PLYLoader.js'\nimport {AnyOptions} from 'ts-browser-helpers'\nimport {BufferGeometry, Color, Mesh} from 'three'\nimport {PhysicalMaterial} from '../../core'\nimport {BaseImporterPlugin} from '../base/BaseImporterPlugin'\n\n/**\n * Adds support for loading `.ply`, `text/plain+ply` files and data uris\n * @category Plugins\n */\nexport class PLYLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'PLYLoadPlugin'\n    protected _importer = new Importer(class extends PLYLoader implements ILoader {\n        transform(res: BufferGeometry, _: AnyOptions): Mesh|undefined {\n            if (!res.attributes?.normal) res.computeVertexNormals()\n            // todo set mesh name from options/path\n            return res ? new Mesh(res, new PhysicalMaterial({\n                color: new Color(1, 1, 1),\n                vertexColors: res.hasAttribute('color'),\n            })) : undefined\n        }\n    }, ['ply'], ['text/plain+ply'], false)\n}\n","import {ILoader, Importer} from '../../assetmanager'\nimport {STLLoader} from 'three/examples/jsm/loaders/STLLoader.js'\nimport {BufferGeometry, Color, Mesh} from 'three'\nimport {AnyOptions} from 'ts-browser-helpers'\nimport {PhysicalMaterial} from '../../core'\nimport {BaseImporterPlugin} from '../base/BaseImporterPlugin'\n\n/**\n * Adds support for loading `.stl`, `model/stl` files and data uris.\n * @category Plugins\n */\nexport class STLLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'STLLoadPlugin'\n    protected _importer = new Importer(class extends STLLoader implements ILoader {\n        transform(res: BufferGeometry, _: AnyOptions): Mesh|undefined {\n            if (!res.attributes?.normal) res.computeVertexNormals()\n            // todo set mesh name from options/path\n            return res ? new Mesh(res, new PhysicalMaterial({\n                color: new Color(1, 1, 1),\n                vertexColors: res.hasAttribute('color'),\n            })) : undefined\n        }\n    }, ['stl'], ['model/stl', 'model/x.stl-binary', 'model/x.stl-ascii'], false)\n\n}\n","import {Importer} from '../../assetmanager'\nimport {KTXLoader} from 'three/examples/jsm/loaders/KTXLoader.js'\nimport {BaseImporterPlugin} from '../base/BaseImporterPlugin'\n\n/**\n * Adds support for loading `.ktx`, `image/ktx` files and data uris.\n * @category Plugins\n */\nexport class KTXLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'KTXLoadPlugin'\n    protected _importer = new Importer(KTXLoader, ['ktx'], ['image/ktx'], false)\n\n}\n","import {ThreeViewer} from '../../viewer'\nimport {GLTFWriter2, ILoader, Importer, ImportResultExtras} from '../../assetmanager'\nimport {KTX2Loader} from 'three/examples/jsm/loaders/KTX2Loader.js'\nimport {CompressedTexture} from 'three'\nimport {serializeTextureInExtras} from '../../utils'\nimport {ITexture, upgradeTexture} from '../../core'\nimport {BaseImporterPlugin} from '../base/BaseImporterPlugin'\n\n/**\n * Adds support for loading Compressed Textures of format `.ktx2`, `image/ktx2` files and data uris.\n * @category Plugins\n */\nexport class KTX2LoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'KTX2LoadPlugin'\n    protected _importer = new Importer(KTX2Loader2, ['ktx2'], ['image/ktx2'], false)\n\n    public static TRANSCODER_LIBRARY_PATH = 'https://cdn.jsdelivr.net/gh/BinomialLLC/basis_universal@1.16.4/webgl/transcoder/build/'\n\n    /**\n     * Flag to save the source buffer data in the texture object, it can be used later when downloading/serializing\n     * the texture like when downloading glb with embedded textures.\n     */\n    public static SAVE_SOURCE_BLOBS = false\n\n    onAdded(viewer: ThreeViewer) {\n        this._importer.onCtor = (l: KTX2Loader2) => l\n            .setTranscoderPath(KTX2LoadPlugin.TRANSCODER_LIBRARY_PATH)\n            .detectSupport(viewer.renderManager.renderer)\n        super.onAdded(viewer)\n        viewer.assetManager.exporter.getExporter('gltf', 'glb')?.extensions?.push(glTFTextureBasisUExtensionExport)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        const exporter = viewer.assetManager.exporter.getExporter('gltf', 'glb')\n        const index = exporter?.extensions?.indexOf(glTFTextureBasisUExtensionExport)\n        if (index !== undefined && index !== -1) exporter?.extensions?.splice(index, 1)\n        super.onRemove(viewer)\n    }\n\n\n}\n\nexport class KTX2Loader2 extends KTX2Loader implements ILoader {\n\n    private _initTexture(t: CompressedTexture & ITexture) {\n        upgradeTexture.call(t)\n        t.userData.mimeType = 'image/ktx2'\n        t.toJSON = (meta?: any)=>{\n            return serializeTextureInExtras(t, meta, t.name, 'image/ktx2')\n        }\n        const cloneFn = t.clone\n        t.clone = ()=>{\n            const res = cloneFn.call(t)\n            if (res.source !== t.source) // in case something changes\n                res.source._sourceImgBuffer = t.source._sourceImgBuffer\n            return this._initTexture(res)\n        }\n        return t\n    }\n    async createTexture(buffer: ArrayBuffer, config: any): Promise<CompressedTexture> {\n        const buffer2 = KTX2LoadPlugin.SAVE_SOURCE_BLOBS ? new Uint8Array(buffer.slice(0)) : undefined // clones the buffer\n        const texture = (await super.createTexture(buffer, config)) as CompressedTexture & ITexture\n        // todo check if rootPath is set?\n        if (KTX2LoadPlugin.SAVE_SOURCE_BLOBS && buffer2) {\n            texture.source._sourceImgBuffer = buffer2 // keep the same buffer when cloned and all, used in serializeTextureInExtras\n            texture.source._canSerialize = true\n        }\n        this._initTexture(texture)\n        return texture\n    }\n\n}\n\n\nexport const KHR_TEXTURE_BASISU = 'KHR_texture_basisu'\n\nconst glTFTextureBasisUExtensionExport = (w: GLTFWriter2)=> ({\n    writeTexture: (texture: ITexture&ImportResultExtras, textureDef: any) => {\n        // if (!w.options.embedImages) return // option is removed.\n        if (texture.userData.mimeType !== 'image/ktx2') return\n        if (textureDef.source !== undefined && textureDef.source !== null) {\n            console.warn('ktx2 export: source already set')\n            return\n        }\n        const sourceBuffer = texture.source._sourceImgBuffer || texture.__sourceBuffer // todo do this for all images that have a __sourceBuffer (in GLTFExporter.processImage or GLTFWriter2.processTexture)\n        if (!sourceBuffer) {\n            console.warn('ktx2 export: no source buffer for ktx2')\n            return\n        }\n\n        textureDef.extensions = textureDef.extensions || {}\n\n        const extensionDef: any = {}\n\n        const blob = new Blob([sourceBuffer], {type: 'image/ktx2'})\n        extensionDef.source = w.processImageBlob(blob, texture)\n\n        textureDef.extensions[ KHR_TEXTURE_BASISU ] = extensionDef\n        w.extensionsUsed[ KHR_TEXTURE_BASISU ] = true\n    },\n})\n\n","import {IViewerPluginSync} from '../../viewer'\nimport {SimpleEventDispatcher} from 'ts-browser-helpers'\n\n/**\n * Loads the MeshOpt Decoder module from [meshoptimizer](https://github.com/zeux/meshoptimizer) library at runtime from a customisable cdn url.\n * The loaded module is set in window.MeshoptDecoder and then used by {@link GLTFLoader2} to decode files using [EXT_meshopt_compression](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_meshopt_compression/README.md) extension\n *\n * The plugin name includes GLTF, but its not really GLTF specific, it can be used to decode any meshopt compressed files.\n */\nexport class GLTFMeshOptDecodePlugin extends SimpleEventDispatcher<'initialized'> implements IViewerPluginSync {\n    declare ['constructor']: typeof GLTFMeshOptDecodePlugin\n    public static readonly PluginType = 'GLTFMeshOptDecodePlugin'\n    enabled = true\n    toJSON: any = undefined\n\n    constructor(initialize = true, public readonly rootNode = document.head) {\n        super()\n        // todo: check if compatible?\n        if (initialize) this.initialize()\n    }\n\n    get initialized() {\n        return !!window.MeshoptDecoder\n    }\n\n    /**\n     * Path to the meshopt decoder library, default uses unpkg cdn\n     */\n    static DECODER_URL = 'https://unpkg.com/meshoptimizer@0.20.0/meshopt_decoder.module.js'\n    // static DECODER_URL = 'https://cdn.jsdelivr.net/gh/zeux/meshoptimizer@master/js/meshopt_decoder.module.js'\n\n    protected _script?: HTMLScriptElement\n\n    protected _initializing?: Promise<void> = undefined\n\n    async initialize() {\n        if (this.initialized) return\n        if (this._initializing) return await this._initializing\n        const s = document.createElement('script')\n        s.type = 'module'\n        const ev = Math.random().toString(36).substring(7)\n        s.innerHTML = `\nimport { MeshoptDecoder } from ${JSON.stringify(GLTFMeshOptDecodePlugin.DECODER_URL)};\nwindow.MeshoptDecoder = MeshoptDecoder; // setting it before ready as GLTFLoader supports it.\nMeshoptDecoder.ready.then(() => {\nwindow.dispatchEvent(new CustomEvent('${ev}'))\n});\n`\n        this._initializing = new Promise<void>((res) => {\n            window.addEventListener(ev, ()=>res(), {once: true})\n            this.rootNode.appendChild(s)\n            this._script = s\n        })\n        await this._initializing\n        this.dispatchEvent({type: 'initialized'})\n    }\n\n    dispose() {\n        if (this._script) {\n            this._script.remove()\n            delete window.MeshoptDecoder\n        }\n        this._script = undefined\n    }\n\n    onAdded(): void { return }\n    onRemove(): void { return }\n}\n\ndeclare global{\n    interface Window{\n        MeshoptDecoder?: any\n    }\n}\n","import {serialize} from 'ts-browser-helpers'\nimport {BlobExt, ExportFileOptions} from '../../assetmanager'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {PickingPlugin} from '../interaction/PickingPlugin'\n\n// export enum EncoderMethod {\n//     EDGEBREAKER = 1,\n//     SEQUENTIAL = 0\n// }\n\nexport interface ExportAssetOptions extends ExportFileOptions {\n    convertMeshToIndexed?: boolean // convert mesh to indexed geometry\n    name?: string\n    compress?: boolean,\n}\n\n// todo deprecate the plugin and add functionality to AssetManager maybe\n/**\n * Asset Exporter Plugin\n * Provides options and methods to export the scene, object GLB or Viewer Config.\n * All the functionality is available in the viewer directly, this provides only a ui-config and maintains state of the options.\n */\nexport class AssetExporterPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'AssetExporterPlugin'\n    enabled = true\n\n    constructor() {\n        super()\n        this.exportScene = this.exportScene.bind(this)\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        // todo Convert all non-indexed geometries to indexed geometries, because DRACO compression requires indexed geometry.\n        // this.exporter.processors.add('model', {\n        //     forAssetType: 'model',\n        //     processAsync: async(obj: IObject3D, options) => {\n        //         if (options.convertMeshToIndexed)\n        //             obj?.traverse((o: IObject3D)=>{\n        //                 if (!o.geometry) return\n        //                 if (o.geometry.attributes.index) return\n        //                 o.geometry = toIndexedGeometry(o.geometry)\n        //             })\n        //         return obj\n        //     },\n        // })\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        return super.onRemove(viewer)\n    }\n\n    // readonly because bound to ui\n    @serialize() readonly exportOptions: ExportAssetOptions = {\n        name: 'scene',\n        viewerConfig: true,\n        encodeUint16Rgbe: false,\n        convertMeshToIndexed: false,\n        embedUrlImagePreviews: false,\n        embedUrlImages: false,\n        encrypt: false,\n        encryptKey: '',\n        ignoreInvalidMorphTargetTracks: true,\n        ignoreEmptyTextures: true,\n    }\n\n    async exportScene(options?: ExportAssetOptions): Promise<BlobExt | undefined> {\n        return this._viewer?.assetManager.exporter?.exportObject(this._viewer?.scene.modelRoot, options || {...this.exportOptions})\n    }\n\n    async downloadSceneGlb() {\n        const blob = await this.exportScene(this.exportOptions)\n        if (blob) await this._viewer?.exportBlob(blob, this.exportOptions.name + '.' + blob.ext)\n    }\n\n    async exportSelected(options?: ExportAssetOptions, download = true) {\n        const selected = this._viewer?.getPlugin<PickingPlugin>('PickingPlugin')?.getSelectedObject() as any\n        if (!selected) {\n            this._viewer?.dialog.alert('Export Selected: Nothing selected')\n            return\n        }\n        const name = selected.name || 'selected'\n        const blob = await this._viewer!.assetManager.exporter.exportObject(selected, options ?? this.exportOptions)\n        if (blob && download) await this._viewer?.exportBlob(blob, name + '.' + blob.ext)\n        return blob\n    }\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Asset Export',\n        expanded: true,\n        children: [\n            {\n                type: 'input',\n                property: [this.exportOptions, 'name'],\n            },\n            {\n                type: 'folder',\n                label: 'GLB Export',\n                expanded: true,\n                children: [\n                    {\n                        type: 'checkbox',\n                        label: 'Viewer Config (All Settings)',\n                        property: [this.exportOptions, 'viewerConfig'],\n                        onChange: ()=>this.uiConfig.uiRefresh?.(true),\n                    },\n                    {\n                        type: 'checkbox',\n                        label: 'Embed Image Previews',\n                        property: [this.exportOptions, 'embedUrlImagePreviews'],\n                    },\n                    {\n                        type: 'checkbox',\n                        label: 'Encrypt',\n                        property: [this.exportOptions, 'encrypt'],\n                        onChange: ()=>this.uiConfig.uiRefresh?.(true),\n                    },\n                    {\n                        type: 'input',\n                        label: 'Encrypt Password',\n                        hidden: ()=>!this.exportOptions.encrypt,\n                        property: [this.exportOptions, 'encryptKey'],\n                    },\n                    {\n                        type: 'checkbox',\n                        label: 'Compress hdr env maps',\n                        hidden: ()=>!this.exportOptions.viewerConfig,\n                        property: [this.exportOptions, 'encodeUint16Rgbe'],\n                    },\n                    // { // todo\n                    //     type: 'checkbox',\n                    //     label: 'Convert to indexed',\n                    //     property: [this.exportOptions, 'convertMeshToIndexed'],\n                    // },\n                    {\n                        type: 'checkbox',\n                        label: 'Ignore invalid animations',\n                        property: [this.exportOptions, 'ignoreInvalidMorphTargetTracks'],\n                    },\n                    {\n                        type: 'checkbox',\n                        label: 'Ignore invalid textures',\n                        property: [this.exportOptions, 'ignoreInvalidTextures'],\n                    },\n                    {\n                        type: 'button',\n                        label: 'Export GLB',\n                        property: [this, 'downloadSceneGlb'],\n                    },\n                ],\n            },\n            {\n                type: 'button',\n                label: 'Export Config',\n                value: async()=>{\n                    const blob = new Blob([JSON.stringify(this._viewer?.exportConfig(false), null, 2)], {type: 'application/json'})\n                    if (blob) await this._viewer?.exportBlob(blob, this.exportOptions.name + '.' + ThreeViewer.ConfigTypeSlug)\n                },\n            },\n            {\n                type: 'button',\n                label: 'Export Selected',\n                hidden: ()=>!this._viewer?.getPlugin<PickingPlugin>('PickingPlugin'),\n                value: async()=>this.exportSelected(this.exportOptions, true),\n            },\n        ],\n    }\n}\n","import {serialize, timeout} from 'ts-browser-helpers'\nimport {AViewerPluginSync} from '../../viewer'\nimport {uiButton, uiConfig, uiFolderContainer, uiInput} from 'uiconfig.js'\nimport {CanvasSnapshot, CanvasSnapshotOptions} from '../../utils/canvas-snapshot'\nimport {ProgressivePlugin} from '../pipeline/ProgressivePlugin'\nimport {Zippable, zipSync} from 'three/examples/jsm/libs/fflate.module.js'\n\nexport interface CanvasSnapshotPluginOptions extends CanvasSnapshotOptions{\n    /**\n     * If true, will wait for progressive rendering(requires {@link ProgressivePlugin}) to finish before taking snapshot\n     * @default true\n     */\n    waitForProgressive?: boolean\n    /**\n     * Number of progressive frames to wait for before taking snapshot\n     @default 64 or {@link ProgressivePlugin.maxFrameCount}, whichever is higher\n     */\n    progressiveFrames?: number\n    /**\n     * Time in ms to wait before taking the snapshot.\n     * This timeout is applied before `waitForProgressive` if both are specified.\n     */\n    timeout?: number,\n    /**\n     * Number of tile rows to split the image into\n     * @default 1\n     */\n    tileRows?: number\n    /**\n     * Number of tile columns to split the image into\n     */\n    tileColumns?: number\n}\n\n@uiFolderContainer('Image Export (Canvas Snapshot)')\nexport class CanvasSnapshotPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'CanvasSnapshotPlugin'\n    enabled = true\n\n    constructor() {\n        super()\n        this.downloadSnapshot = this.downloadSnapshot.bind(this)\n    }\n\n    /**\n     * Returns a File object with screenshot of the viewer canvas\n     * @param filename default is {@link CanvasSnapshotPlugin.filename}\n     * @param options waitForProgressive: wait for progressive rendering to finish, default: true\n     */\n    async getFile(filename?: string, options: CanvasSnapshotPluginOptions = {waitForProgressive: true}): Promise<File|undefined> {\n        return await this._getFile(filename || this.filename, {...options, getDataUrl: false}) as File\n    }\n\n    /**\n     * Returns a data url of the screenshot of the viewer canvas\n     * @param options waitForProgressive: wait for progressive rendering to finish, default: true\n     */\n    async getDataUrl(options: CanvasSnapshotPluginOptions = {}): Promise<string> {\n        return await this._getFile('', {...options, getDataUrl: true}) as string ?? ''\n    }\n\n    private async _getFile(filename: string, options: CanvasSnapshotPluginOptions = {}): Promise<File|string|string[]|undefined> {\n        await this._viewer?.doOnce('postFrame')\n        const viewer = this._viewer\n        const canvas = this._viewer?.canvas\n        if (!viewer || !canvas) return undefined\n        viewer.scene.mainCamera.setInteractions(false, CanvasSnapshotPlugin.PluginType)\n\n        const dpr = viewer.renderManager.renderScale\n        if (options.displayPixelRatio !== undefined && options.displayPixelRatio !== dpr) {\n            viewer.renderManager.renderScale = options.displayPixelRatio\n        }\n        if (options.timeout) await timeout(options.timeout)\n\n        const progressive = viewer.getPlugin(ProgressivePlugin)\n        let waitForProgressive = options.waitForProgressive ?? !!progressive\n        if (waitForProgressive && !progressive) {\n            viewer.console.warn('CanvasSnapshotPlugin: ProgressivePlugin required to wait for progressive rendering')\n            waitForProgressive = false\n        }\n        if (options.progressiveFrames && !waitForProgressive) {\n            viewer.console.warn('CanvasSnapshotPlugin: waitForProgressive must be true to use progressiveFrames')\n        }\n        const lastMaxFrames = progressive?.maxFrameCount\n\n        if (waitForProgressive && progressive) {\n            progressive.maxFrameCount = Math.max(options.progressiveFrames ?? 64, progressive.maxFrameCount)\n            viewer.setDirty()\n            await viewer.doOnce('postFrame')\n\n            while (!progressive.isConverged(true)) {\n                await viewer.doOnce('postFrame')\n                // console.log(`rendering ${ 100 * this._viewer!.renderer.frameCount / progressive.maxFrameCount }%`)\n            }\n        } else {\n            viewer.setDirty()\n            await viewer.doOnce('postFrame')\n        }\n\n\n        delete options.displayPixelRatio\n        // const rect = options.rect\n        // if (rect && viewer.renderManager.renderScale !== 1) {\n        //     options.rect = {\n        //         ...rect,\n        //         x: rect.x * viewer.renderManager.renderScale,\n        //         y: rect.y * viewer.renderManager.renderScale,\n        //         width: rect.width * viewer.renderManager.renderScale,\n        //         height: rect.height * viewer.renderManager.renderScale,\n        //     }\n        // }\n\n        let file\n        if (options.tileRows && options.tileRows > 1 || options.tileColumns && options.tileColumns > 1) {\n            const res = await CanvasSnapshot.GetTiledFiles(canvas, filename, Math.max(1, options.tileRows || 1), Math.max(1, options.tileColumns || 1), options)\n            if (Array.isArray(res)) {\n                if (res.length === 1) file = res[0]\n                else if (res.length === 0) file = undefined\n                else if (!options.getDataUrl) {\n                    const zippa: Zippable = {}\n                    for (const f of res) {\n                        zippa[(f as File).name] = new Uint8Array(await (f as File).arrayBuffer())\n                    }\n                    const zipped = zipSync(zippa)\n                    file = new File([zipped], filename + '.zip', {type: 'application/zip', lastModified: Date.now()})\n                } else {\n                    file = res as string[]\n                }\n            } else {\n                file = res\n            }\n        } else {\n            file = await CanvasSnapshot.GetFile(canvas, filename, options)\n        }\n        // const file = await CanvasSnapshot.GetFile(canvas, filename, options)\n\n        // options.rect = rect\n        options.displayPixelRatio = viewer.renderManager.renderScale\n        if (progressive && lastMaxFrames !== undefined) {\n            progressive.maxFrameCount = lastMaxFrames\n        }\n        viewer.scene.mainCamera.setInteractions(true, CanvasSnapshotPlugin.PluginType, false)\n        viewer.renderManager.renderScale = dpr\n\n        return file\n    }\n\n    @uiInput('Filename')\n    @serialize()\n        filename = 'snapshot'\n\n    // @uiInput('Frame Count')\n    // @serialize()\n    //     progressiveFrames = 64\n    //\n    // @uiInput('Tile Rows')\n    // @serialize()\n    //     tileRows = 1\n    //\n    // @uiInput('Tile Columns')\n    // @serialize()\n    //     tileColumns = 1\n    //\n    // @uiVector('Crop Rect (x, y, w, h)', [0, 1], 0.001)\n    // @serialize()\n    //     rect = new Vector4(0, 0, 1, 1)\n\n    private _downloading = false\n\n    /**\n     * Only for {@link downloadSnapshot} and functions using that\n     */\n    @uiConfig(undefined, {label: 'Options'})\n    @serialize()\n        defaultOptions: CanvasSnapshotPluginOptions = {\n            waitForProgressive: true,\n            displayPixelRatio: window.devicePixelRatio,\n            scale: 1,\n            timeout: 0,\n            quality: 0.9,\n            tileRows: 1,\n            tileColumns: 1,\n            progressiveFrames: 64,\n            rect: {\n                x: 0,\n                y: 0,\n                width: 1,\n                height: 1,\n                normalized: true,\n                assumeClientRect: false,\n            },\n        }\n\n    // @uiButton('Download .png', {sendArgs: false})\n    async downloadSnapshot(filename?: string, options: CanvasSnapshotPluginOptions = {waitForProgressive: true}): Promise<void> {\n        if (!this._viewer) return\n        while (this._downloading) {\n            console.warn('CanvasSnipperPlugin: Another rendering already in progress, waiting...')\n            await timeout(100)\n        }\n        this._downloading = true\n        // if (!options.mimeType && !filename) this.filename = this.filename.split('.').slice(0, -1).join('.') + '.png'\n        const file = await this.getFile(filename, {...this.defaultOptions, ...options}).catch(e=>{\n            this._viewer?.console.error('CanvasSnapshotPlugin: Error exporting file', e)\n            return null\n        })\n\n        if (file) await this._viewer.exportBlob(file, file.name)\n        this._downloading = false\n    }\n\n    @uiButton('Download .png')\n    protected async _downloadPng(): Promise<void> {\n        // this.filename = this.filename.split('.').slice(0, -1).join('.') + '.png'\n        return this.downloadSnapshot(undefined, {mimeType: 'image/png'})\n    }\n    @uiButton('Download .jpeg')\n    protected async _downloadJpeg(): Promise<void> {\n        // this.filename = this.filename.split('.').slice(0, -1).join('.') + '.jpeg'\n        return this.downloadSnapshot(undefined, {mimeType: 'image/jpeg'})\n    }\n    @uiButton('Download .webp')\n    protected async _downloadWebp(): Promise<void> {\n        // this.filename = this.filename.split('.').slice(0, -1).join('.') + '.webp'\n        return this.downloadSnapshot(undefined, {mimeType: 'image/webp'})\n    }\n\n}\n\n/**\n * @deprecated - use {@link CanvasSnapshotPlugin}\n */\nexport class CanvasSnipperPlugin extends CanvasSnapshotPlugin {\n    static readonly PluginType: any = 'CanvasSnipper'\n    constructor() {\n        super()\n        console.warn('CanvasSnipperPlugin is deprecated, use CanvasSnapshotPlugin')\n    }\n}\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {downloadBlob} from 'ts-browser-helpers'\n\nexport interface FileTransferPluginEventMap extends AViewerPluginEventMap{\n    transferFile: {\n        path: string\n        state: 'exporting'|'done'|'error'\n        progress?: number\n        name?: string\n    }\n}\n\n/**\n * File Transfer Plugin\n *\n * Provides a way to extend the viewer.export functionality with custom actions. Used in `AWSClientPlugin` to upload files directly to S3.\n *\n * @category Plugins\n */\nexport class FileTransferPlugin extends AViewerPluginSync<FileTransferPluginEventMap> {\n    enabled = true\n\n    static readonly PluginType = 'FileTransferPlugin'\n\n    toJSON: any = undefined\n\n    async exportFile(file: File|Blob, name?: string) {\n        name = name || (file as File).name || 'file_export'\n        this.dispatchEvent({type: 'transferFile', path: name, state: 'exporting', progress: 0})\n        await this.actions.exportFile(file, name, ({state, progress})=>{\n            this.dispatchEvent({type: 'transferFile', path: name, state: state ?? 'exporting', progress})\n        })\n        this.dispatchEvent({type: 'transferFile', path: name, state: 'done'})\n    }\n\n    readonly defaultActions = {\n        exportFile: async(blob: Blob, name: string, _onProgress?: (d: {state?: 'exporting'|'done'|'error', progress?: number})=>void)=>{\n            downloadBlob(blob, name)\n        },\n    }\n\n\n    constructor() {\n        super()\n        this._updateProcessState = this._updateProcessState.bind(this)\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this.addEventListener('transferFile', this._updateProcessState as any)\n    }\n    onRemove(viewer: ThreeViewer) {\n        this.removeEventListener('transferFile', this._updateProcessState as any)\n        super.onRemove(viewer)\n    }\n\n    protected _updateProcessState(data: {path: string, state: string, progress?: number}) {\n        if (!this._viewer) return\n        this._viewer.assetManager.setProcessState(data.path, data.state !== 'done' ? {\n            state: data.state,\n            progress: data.progress ? data.progress * 100 : undefined,\n        } : undefined)\n    }\n\n    actions = {...this.defaultActions}\n}\n","vec4 Vignette(in vec4 color) {\n    vec2 uv =  vUv * (1.0 - vUv);\n    float vig = uv.x * uv.y * 16.0; // max value of this function is 1/16 at the centre(0.5, 0.5)\n    vig = pow(vig, power);\n    return vec4( mix( color.rgb, vec3( bgcolor ),  1. - vig ), color.a );\n}\n","import {uiColor, uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {Color} from 'three'\nimport {glsl, onChange, serialize} from 'ts-browser-helpers'\nimport {uniform} from '../../three'\nimport vignette from './shaders/VignettePlugin.glsl'\nimport {AScreenPassExtensionPlugin} from './AScreenPassExtensionPlugin'\n\n/**\n * Vignette Plugin\n *\n * Adds an extension to {@link ScreenPass} material\n * for applying vignette effect on the final buffer before rendering to screen.\n * The power of the vignette can be controlled with the `power` property.\n * The color of the vignette can be controlled with the `color`(previously `bgcolor`) property.\n *\n * @category Plugins\n */\n@uiFolderContainer('Vignette')\nexport class VignettePlugin extends AScreenPassExtensionPlugin {\n    static readonly PluginType = 'Vignette'\n\n    readonly extraUniforms = {\n        power: {value: 1},\n        bgcolor: {value: new Color()},\n    } as const\n\n    @onChange(VignettePlugin.prototype.setDirty)\n    @uiToggle('Enable')\n    @serialize() enabled: boolean\n\n    @uiSlider('Power', [0.1, 4], 0.01)\n    @uniform({propKey: 'power'})\n    @serialize() power = 0.5\n\n    @uiColor<VignettePlugin>('Color', t=>({onChange:()=>t?.setDirty()}))\n    @uniform({propKey: 'bgcolor'})\n    @serialize('bgcolor') color = new Color(0x000000)\n\n    /**\n     * The priority of the material extension when applied to the material in ScreenPass\n     * set to very low priority, so applied at the end\n     */\n    priority = -50\n\n    parsFragmentSnippet = () => {\n        if (this.isDisabled()) return ''\n\n        return glsl`\n            uniform float power;\n            uniform vec3 bgcolor;\n            ${vignette}\n        `\n    }\n\n    protected _shaderPatch = 'diffuseColor = Vignette(diffuseColor);'\n\n    /**\n     * @deprecated\n     */\n    get bgcolor() {\n        console.warn('VignettePlugin.bgcolor is deprecated, use VignettePlugin.color instead')\n        return this.color\n    }\n    /**\n     * @deprecated\n     */\n    set bgcolor(v) {\n        console.warn('VignettePlugin.bgcolor is deprecated, use VignettePlugin.color instead')\n        this.color = v\n    }\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n\n}\n","vec4 ChromaticAberration(in vec4 color) {\n    vec2 distFromCenter = vUv - 0.5;\n\n    vec2 aberrated = aberrationIntensity * pow(abs(distFromCenter), vec2(2.0));\n\n    vec4 outColor = vec4(\n    tDiffuseTexelToLinear (texture2D(tDiffuse, vUv + aberrated)).r,\n    color.g,\n    tDiffuseTexelToLinear (texture2D(tDiffuse, vUv - aberrated)).b,\n    color.a\n    );\n\n    return outColor;\n}\n","import {uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {glsl, onChange, serialize} from 'ts-browser-helpers'\nimport {uniform} from '../../three'\nimport ChromaticAberration from './shaders/ChromaticAberrationPlugin.glsl'\nimport {AScreenPassExtensionPlugin} from './AScreenPassExtensionPlugin'\n\n/**\n * Chromatic Aberration Plugin\n * Adds an extension to {@link ScreenPass} material\n * for applying chromatic aberration effect on the final buffer before rendering to screen.\n * The intensity of the aberration can be controlled with the `intensity`(previously aberrationIntensity) property.\n *\n * @category Plugins\n */\n@uiFolderContainer('ChromaticAberration')\nexport class ChromaticAberrationPlugin extends AScreenPassExtensionPlugin {\n    static readonly PluginType = 'ChromaticAberration'\n\n    readonly extraUniforms = {\n        aberrationIntensity: {value: 1},\n    } as const\n\n    @onChange(ChromaticAberrationPlugin.prototype.setDirty)\n    @uiToggle('Enable')\n    @serialize() enabled: boolean\n\n    @uiSlider('Intensity', [0., 0.3], 0.001)\n    @uniform({propKey: 'aberrationIntensity'})\n    @serialize('aberrationIntensity') intensity = 0.5\n\n    /**\n     * The priority of the material extension when applied to the material in ScreenPass\n     * set to very low priority, so applied at the end\n     */\n    priority = -50\n\n    parsFragmentSnippet = () => {\n        if (this.isDisabled()) return ''\n\n        return glsl`\n            uniform float aberrationIntensity;\n            ${ChromaticAberration}\n        `\n    }\n\n    protected _shaderPatch = 'diffuseColor = ChromaticAberration(diffuseColor);'\n\n    get aberrationIntensity() {\n        console.warn('ChromaticAberrationPlugin.aberrationIntensity is deprecated, use ChromaticAberrationPlugin.intensity instead')\n        return this.intensity\n    }\n    set aberrationIntensity(v) {\n        console.warn('ChromaticAberrationPlugin.aberrationIntensity is deprecated, use ChromaticAberrationPlugin.intensity instead')\n        this.intensity = v\n    }\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n}\n","// https://www.shadertoy.com/view/4sXSWs\nvec4 FilmicGrain(in vec4 color) {\n    float x = (vUv.x + 4.0 ) * (vUv.y + 4.0 ) * ( 10.0);\n    vec4 grain = vec4(mod((mod(x, 13.0) + 1.0) * (mod(x, 123.0) + 1.0), 0.01)-0.005) * grainIntensity;\n    return vec4(\n    grainMultiply ?\n        (color.rgb * vec3(1.-grain)) :\n        (color.rgb + vec3(grain)),\n    color.a);\n}\n","import {uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {glsl, onChange, serialize} from 'ts-browser-helpers'\nimport {uniform} from '../../three'\nimport FilmicGrain from './shaders/FilmicGrainPlugin.glsl'\nimport {AScreenPassExtensionPlugin} from './AScreenPassExtensionPlugin'\n\n/**\n * Filmic Grain Plugin\n * Adds an extension to {@link ScreenPass} material\n * for applying filmic grain effect on the final buffer before rendering to screen.\n * The intensity of the grain can be controlled with the `intensity` property\n * and the `multiply` property can be used to multiply the grain effect on the image instead of adding.\n *\n * @category Plugins\n */\n@uiFolderContainer('FilmicGrain')\nexport class FilmicGrainPlugin extends AScreenPassExtensionPlugin {\n    static readonly PluginType = 'FilmicGrain'\n\n    readonly extraUniforms = {\n        grainIntensity: {value: 1},\n        grainMultiply: {value: false},\n    } as const\n\n    @onChange(FilmicGrainPlugin.prototype.setDirty)\n    @uiToggle('Enable')\n    @serialize() enabled: boolean\n\n    @uiSlider('Intensity', [0., 20], 0.01)\n    @uniform({propKey: 'grainIntensity'})\n    @serialize('grainIntensity') intensity = 10\n\n    @uiToggle('Multiply')\n    @uniform({propKey: 'grainMultiply'})\n    @serialize('grainMultiply') multiply = false\n\n    /**\n     * The priority of the material extension when applied to the material in ScreenPass\n     * set to very low priority, so applied at the end\n     */\n    priority = -50\n\n    parsFragmentSnippet = () => {\n        if (this.isDisabled()) return ''\n\n        return glsl`\n            uniform float grainIntensity;\n            uniform bool grainMultiply;\n            ${FilmicGrain}\n        `\n    }\n\n    protected _shaderPatch = 'diffuseColor = FilmicGrain(diffuseColor);'\n\n    /**\n     * @deprecated\n     */\n    get grainIntensity() {\n        console.warn('FilmicGrainPlugin.grainIntensity is deprecated, use FilmicGrainPlugin.intensity instead')\n        return this.intensity\n    }\n    /**\n     * @deprecated\n     */\n    set grainIntensity(v) {\n        console.warn('FilmicGrainPlugin.grainIntensity is deprecated, use FilmicGrainPlugin.intensity instead')\n        this.intensity = v\n    }\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n}\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {absMax, now, onChange, onChange2, PointerDragHelper, serialize} from 'ts-browser-helpers'\nimport {generateUiConfig, uiButton, uiDropdown, uiMonitor, UiObjectConfig, uiSlider, uiToggle} from 'uiconfig.js'\nimport {\n    AnimationAction,\n    AnimationClip,\n    AnimationMixer,\n    EventListener2,\n    LoopOnce,\n    LoopRepeat,\n    Object3D,\n    Scene,\n} from 'three'\nimport {ProgressivePlugin} from '../pipeline/ProgressivePlugin'\nimport {IObject3D, ISceneEventMap} from '../../core'\nimport {generateUUID} from '../../three'\nimport type {FrameFadePlugin} from '../pipeline/FrameFadePlugin'\n\nexport interface GLTFAnimationPluginEventMap extends AViewerPluginEventMap{\n    checkpointBegin: object\n    checkpointEnd: object\n    animationStep: {delta: number, time: number}\n    addAnimation: {animation: IObjectAnimation}\n    removeAnimation: {animation: IObjectAnimation}\n}\n\nexport interface IObjectAnimation {\n    object: Object3D\n    mixer: AnimationMixer,\n    clips: AnimationClip[],\n    actions: AnimationAction[],\n    duration: number\n}\n\n\n/**\n * Manages playback of GLTF animations.\n *\n * The GLTF animations can be created in any 3d software that supports GLTF export like Blender.\n * If animations from multiple files are loaded, they will be merged in a single root object and played together.\n *\n * The time playback is managed automatically, but can be controlled manually by setting {@link autoIncrementTime} to false and using {@link setTime} to set the time.\n *\n * This plugin is made for playing, pausing, stopping, all the animations at once, while it is possible to play individual animations, it is not recommended.\n *\n * To play individual animations, with custom choreography, use the {@link GLTFAnimationPlugin.animations} property to get reference to the animation clips and actions. Create your own mixers and control the animation playback like in three.js\n *\n * @category Plugins\n */\n// @uiFolderContainer('GLTF Animations')\nexport class GLTFAnimationPlugin extends AViewerPluginSync<GLTFAnimationPluginEventMap> {\n    enabled = true\n    // declare uiConfig: UiObjectConfig\n\n    static readonly PluginType = 'GLTFAnimation'\n\n    protected readonly _animations: IObjectAnimation[] = []\n\n    /**\n     * List of GLTF animations loaded with the models.\n     * The animations are standard threejs AnimationClip and their AnimationAction. Each set of actions also has a mixer.\n     */\n    get animations() {\n        return [...this._animations]\n    }\n\n    /**\n     * If true, the animation time will be automatically incremented by the time delta, otherwise it has to be set manually between 0 and the animationDuration using `setTime`. (default: true)\n     * Set it to false when controlling the time manually like when using the timeline or other custom controls.\n     *\n     * Note that this is not serialized, so it will not be saved in the scene file and must be set manually in the code.\n     */\n    autoIncrementTime = true\n\n    /**\n     * Loop the complete animation. All actions are looped either individually or together based on {@link syncMaxDuration}.\n     * This happens {@link loopRepetitions} times.\n     *\n     * Note - only applicable when {@link autoIncrementTime} is true.\n     */\n    @onChange2(GLTFAnimationPlugin.prototype._onPropertyChange)\n    @uiToggle('Loop')\n    @serialize() loopAnimations = true\n\n    /**\n     * Number of times to loop the animation. (not individual actions)\n     * Only applicable when {@link loopAnimations} is true.\n     * @default Infinity\n     */\n    @onChange2(GLTFAnimationPlugin.prototype._onPropertyChange)\n    @serialize() loopRepetitions = Infinity\n\n    /**\n     * Timescale for the animation. (not individual actions)\n     * If set to 0, it will be ignored.\n     */\n    @uiSlider('Timescale', [-2, 2], 0.01)\n    @serialize() timeScale = 1\n\n    /**\n     * Speed of the animation. (not individual actions)\n     * This can be set to 0.\n     */\n    @uiSlider('Speed', [0.1, 4], 0.1) @serialize() animationSpeed = 1\n\n    /**\n     * Automatically track mouse wheel events to seek animations\n     * Control damping/smoothness with {@link scrollAnimationDamping}\n     * See also {@link animateOnPageScroll}. {@link animateOnDrag}\n     */\n    @uiToggle() @serialize() animateOnScroll = false\n\n    /**\n     * Damping for the scroll animation, when {@link animateOnScroll} is true.\n     */\n    @uiSlider('Scroll Damping', [0, 1]) @serialize() scrollAnimationDamping = 0.1\n\n    /**\n     * Automatically track scroll event in window and use `window.scrollY` along with {@link pageScrollHeight} to seek animations\n     * Control damping/smoothness with {@link pageScrollAnimationDamping}\n     * See also {@link animateOnDrag}, {@link animateOnScroll}\n     */\n    @uiToggle() @serialize() animateOnPageScroll = false\n\n    /**\n     * Damping for the scroll animation, when {@link animateOnPageScroll} is true.\n     */\n    @uiSlider('Page Scroll Damping', [0, 1]) @serialize() pageScrollAnimationDamping = 0.1\n\n    /**\n     * Automatically track drag events in either x or y axes to seek animations\n     * Control axis with {@link dragAxis} and damping/smoothness with {@link dragAnimationDamping}\n     */\n    @uiToggle() @serialize() animateOnDrag = false\n\n    /**\n     * Axis to track for drag events, when {@link animateOnDrag} is true.\n     * `x` will track horizontal drag, `y` will track vertical drag.\n     */\n    @uiDropdown('Drag Axis', [{label: 'x'}, {label: 'y'}])\n    @serialize() dragAxis: 'x'|'y' = 'y'\n\n    /**\n     * Damping for the drag animation, when {@link animateOnDrag} is true.\n     */\n    @uiSlider('Drag Damping', [0, 1]) @serialize() dragAnimationDamping = 0.3\n\n    /**\n     * If true, the animation will be played automatically when the model(any model with animations) is loaded.\n     */\n    @uiToggle() @serialize() autoplayOnLoad = false\n\n    /**\n     * Force (not serialized) version of {@link autoplayOnLoad}, this will play the animation even if it {@link autoplayOnLoad} is disabled inside the saved file.\n     */\n    autoplayOnLoadForce = false\n\n    /**\n     * Sync the duration of all clips based on the max duration, helpful for things like timeline markers\n     */\n    @uiToggle('syncMaxDuration(dev)') @serialize() syncMaxDuration = false\n\n    /**\n     * Get the current state of the animation. (read only)\n     * use {@link playAnimation}, {@link pauseAnimation}, {@link stopAnimation} to change the state.\n     */\n    @uiMonitor() get animationState(): 'none' | 'playing' | 'paused' | 'stopped' {\n        return this._animationState\n    }\n\n    /**\n     * Get the current animation time. (read only)\n     * The time is managed automatically.\n     * To manage the time manually set {@link autoIncrementTime} to false and use {@link setTime} to change the time.\n     */\n    @uiMonitor() get animationTime(): number {\n        return this._animationTime\n    }\n\n    /**\n     * Get the current animation duration (max of all animations). (read only)\n     */\n    @uiMonitor() get animationDuration(): number {\n        return this._animationDuration\n    }\n\n\n    @uiButton('Play/Pause', (that: GLTFAnimationPlugin)=>({\n        label:()=> that.animationState === 'playing' ? 'Pause' : 'Play',\n    }))\n    playPauseAnimation() {\n        this._animationState === 'playing' ? this.pauseAnimation() : this.playAnimation()\n    }\n\n    @onChange(GLTFAnimationPlugin.prototype.onStateChange)\n    protected _animationState: 'none' | 'playing' | 'paused' | 'stopped' = 'none'\n\n    private _lastAnimationTime = 0\n    private _animationTime = 0\n    private _animationDuration = 0\n    private _scrollAnimationState = 0\n    private _pageScrollAnimationState = 0\n    private _dragAnimationState = 0\n    private _pointerDragHelper = new PointerDragHelper()\n    private _lastFrameTime = 0\n    private _fadeDisabled = false\n\n    constructor() {\n        super()\n        this.playClips = this.playClips.bind(this)\n        this.playClip = this.playClip.bind(this)\n        this.playAnimation = this.playAnimation.bind(this)\n        this.playPauseAnimation = this.playPauseAnimation.bind(this)\n        this.pauseAnimation = this.pauseAnimation.bind(this)\n        this.stopAnimation = this.stopAnimation.bind(this)\n        this.resetAnimation = this.resetAnimation.bind(this)\n        this._onPropertyChange = this._onPropertyChange.bind(this)\n        this._postFrame = this._postFrame.bind(this)\n        this._wheel = this._wheel.bind(this)\n        this._scroll = this._scroll.bind(this)\n        this._pointerDragHelper.addEventListener('drag', this._drag.bind(this))\n    }\n\n    setTime(time: number) {\n        this._animationTime = Math.max(0, Math.min(time, this._animationDuration))\n    }\n\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n        viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n        viewer.scene.addEventListener('sceneUpdate', this._sceneUpdate)\n        viewer.addEventListener('postFrame', this._postFrame)\n        window.addEventListener('wheel', this._wheel)\n        window.addEventListener('scroll', this._scroll)\n        this._pointerDragHelper.element = viewer.canvas\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        while (this._animations.length) this._animations.pop()\n        viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n        viewer.scene.removeEventListener('sceneUpdate', this._sceneUpdate)\n        viewer.removeEventListener('postFrame', this._postFrame)\n        window.removeEventListener('wheel', this._wheel)\n        window.removeEventListener('scroll', this._scroll)\n        this._pointerDragHelper.element = undefined\n        return super.onRemove(viewer)\n    }\n\n    public onStateChange(): void {\n        this.uiConfig?.uiRefresh?.(true, 'postFrame')\n        // this.uiConfig?.children?.map(value => value && getOrCall(value)).flat(2).forEach(v=>v?.uiRefresh?.())\n    }\n\n    /**\n     * This will play a single clip by name\n     * It might reset all other animations, this is a bug; https://codepen.io/repalash/pen/mdjgpvx\n     * @param name\n     * @param resetOnEnd\n     */\n    async playClip(name: string, resetOnEnd = false) {\n        return this.playClips([name], resetOnEnd)\n    }\n    async playClips(names: string[], resetOnEnd = false) {\n        const anims: AnimationAction[] = []\n        this._animations.forEach(({actions})=>{\n            actions.forEach((action)=>{\n                if (names.includes(action.getClip().name)) {\n                    anims.push(action)\n                }\n            })\n        })\n        return this.playAnimation(resetOnEnd, anims)\n    }\n\n    private _lastAnimId = ''\n    /**\n     * If true, will stop the animation when the animation ends. (when not looping)\n     */\n    stopOnCheckpointEnd = true\n\n    @uiToggle()\n        autoUnpauseActions = true\n    @uiToggle()\n        autoEnableActions = true\n\n    activeActionWeight: number | null = 1\n    inactiveActionWeight: number | null = 0\n\n    /**\n     * Starts all the animations and returns a promise that resolves when all animations are done.\n     * @param resetOnEnd - if true, will reset the animation to the start position when it ends.\n     * @param animations - play specific animations, otherwise play all animations. Note: the promise returned (if this is set) from this will resolve before time if the animations was ever paused, or converged mode is on in recorder.\n     */\n    async playAnimation(resetOnEnd = false, animations?: AnimationAction[]): Promise<void> {\n        if (this.isDisabled()) return\n        let wasPlaying = false\n        if (this._animationState === 'playing') {\n            this.stopAnimation(false) // stop and play again. reset is done below.\n            wasPlaying = true\n        }\n        // safeSetProperty(this._viewer?.getPlugin<PickingPlugin>('Picking')?.transformControls, 'enabled', false)\n        let duration = 0\n        const isAllAnimations = !animations\n        if (!animations) {\n            animations = []\n            this._animations.forEach(({actions}) => {\n                // console.log(mixer, actions, clips)\n                animations!.push(...actions)\n            })\n        }\n        if (wasPlaying)\n            this.resetAnimation()\n        else if (this.animationState !== 'paused') {\n            animations.forEach((ac)=>{\n                ac.reset()\n            })\n            this._animationTime = 0\n        }\n\n        const id = generateUUID()\n        this._lastAnimId = id // todo: check logic\n        for (const ac of animations) {\n            // if (Math.abs(this.timeScale) > 0) {\n            //     if (!(ac as any)._tTimeScale) (ac as any)._tTimeScale = ac.timeScale\n            //     ac.timeScale = this.timeScale\n            // } else if ((ac as any)._tTimeScale) ac.timeScale = (ac as any)._tTimeScale\n            ac.setLoop(this.loopAnimations ? LoopRepeat : LoopOnce, this.loopRepetitions)\n            ac.play()\n            duration = Math.max(duration, ac.getClip().duration / Math.abs(ac.timeScale))\n            // if (!this._playingActions.includes(ac)) this._playingActions.push(ac)\n            // console.log(ac)\n        }\n        this._animationState = 'playing'\n        this._viewer?.setDirty()\n        if (!isAllAnimations) {\n            const loops = this.loopAnimations ? this.loopRepetitions : 1\n            duration *= loops\n            if (!isFinite(duration)) {\n                // infinite animation\n                return\n            }\n\n            await new Promise<void>((resolve) => {\n                const listen = (e: any) => {\n                    if (e.time >= duration) {\n                        this.removeEventListener('animationStep', listen)\n                        resolve()\n                    }\n                }\n                this.addEventListener('animationStep', listen)\n            })\n\n            // const animDuration = 1000 * duration - this._animationTime / this.animationSpeed + 0.01\n            //\n            // if (animDuration > 0) {\n            //     await timeout(animDuration)\n            //     return\n            // } // todo: handle pausing/early stop, converge mode for single animation playback\n        } else {\n            if (!isFinite(this._animationDuration)) {\n                // infinite animation\n                return\n            }\n            await new Promise<void>((resolve) => {\n                const listen = () => {\n                    this.removeEventListener('checkpointEnd', listen)\n                    resolve()\n                }\n                this.addEventListener('checkpointEnd', listen)\n            })\n        }\n        if (id === this._lastAnimId && this.stopOnCheckpointEnd) { // in-case multiple animations are started.\n            this.stopAnimation(resetOnEnd)\n        }\n        return\n    }\n\n    pauseAnimation() {\n        if (this._animationState !== 'playing') {\n            console.warn('pauseAnimation called when animation was not playing.')\n            return\n        }\n        this._animationState = 'paused'\n        // safeSetProperty(this._viewer?.getPlugin<PickingPlugin>('Picking')?.transformControls, 'enabled', true)\n        this._viewer?.setDirty()\n        // this._lastAnimId = '' // this disables stop on timeout end, for now.\n    }\n    resumeAnimation() {\n        if (this._animationState !== 'paused') {\n            console.warn('resumeAnimation called when animation was not paused.')\n            return\n        }\n        this._animationState = 'playing'\n        // safeSetProperty(this._viewer?.getPlugin<PickingPlugin>('Picking')?.transformControls, 'enabled', true)\n        this._viewer?.setDirty()\n    }\n\n    @uiButton('Stop', {sendArgs: false})\n    stopAnimation(reset = false) {\n        this._animationState = 'stopped'\n        // safeSetProperty(this._viewer?.getPlugin<PickingPlugin>('Picking'), 'enabled', true)\n        if (reset) this.resetAnimation()\n        else this._viewer?.setDirty()\n        this._lastAnimId = ''\n\n        if (this._viewer && this._fadeDisabled) {\n            this._viewer.getPlugin<FrameFadePlugin>('FrameFade')?.enable(this)\n            this._fadeDisabled = false\n        }\n\n    }\n\n    @uiButton('Reset', {sendArgs: false})\n    resetAnimation() {\n        if (this._animationState !== 'stopped' && this._animationState !== 'none') {\n            this.stopAnimation(true) // reset and stop\n            return\n        }\n        this._animations.forEach(({mixer}) => {\n            // console.log(mixer, actions, clips)\n            mixer.stopAllAction()\n            mixer.setTime(0)\n        })\n        this._animationTime = 0\n        this._viewer?.setDirty()\n    }\n\n\n    protected _postFrame() {\n        if (!this._viewer) return\n\n        const scrollAnimate = this.animateOnScroll //  && this._animationState === 'paused'\n        const pageScrollAnimate = this.animateOnPageScroll //  && this._animationState === 'paused'\n        const dragAnimate = this.animateOnDrag //  && this._animationState === 'paused'\n        // const timelineRunning = this._viewer.timeline.shouldRun()\n\n        if (this.isDisabled() || this._animations.length < 1 || this._animationState !== 'playing'/* && !scrollAnimate && !dragAnimate && !pageScrollAnimate && !timelineRunning*/) {\n            this._lastFrameTime = 0\n            // console.log('not anim')\n            if (this._fadeDisabled) {\n                this._viewer.getPlugin<FrameFadePlugin>('FrameFade')?.enable(this)\n                this._fadeDisabled = false\n            }\n            return\n        }\n\n        const animTime1 = this._animationTime\n\n        if (this.autoIncrementTime || pageScrollAnimate || scrollAnimate || dragAnimate) {\n            const time = now() / 1000.0\n            if (this._lastFrameTime < 1) this._lastFrameTime = time - 1.0 / 30.0\n            let delta = time - this._lastFrameTime\n            delta *= this.animationSpeed\n\n            this._lastFrameTime = time\n\n            if (pageScrollAnimate) delta *= this._pageScrollAnimationState\n            else if (scrollAnimate && dragAnimate) delta *= absMax(this._scrollAnimationState, this._dragAnimationState)\n            else if (scrollAnimate) delta *= this._scrollAnimationState\n            else if (dragAnimate) delta *= this._dragAnimationState\n\n            // if (Math.abs(delta) < 0.0001) return\n\n            const d = this._viewer.getPlugin<ProgressivePlugin>('Progressive')?.postFrameConvergedRecordingDelta()\n            if (d && d > 0) delta = d\n            if (d === 0) delta = 0 // not converged yet.\n            // if d < 0: not recording, do nothing\n\n            const ts = Math.abs(this.timeScale)\n            this._animationTime += delta * (ts > 0 ? ts : 1)\n        } else {\n            const time = now() / 1000.0\n            // if (this._lastFrameTime < 1) this._lastFrameTime = time - 1.0 / 30.0\n            // let delta = time - this._lastFrameTime\n            // delta *= this.animationSpeed\n\n            this._lastFrameTime = time\n\n            // const d = this._viewer.timeline.delta\n            // if (d < 0.0001 && this._viewer.timeline.running) return // no delta, no animation\n\n            // todo animationSpeed\n            // this._animationTime = this._viewer.timeline.time\n            const ts = Math.abs(this.timeScale) * this.animationSpeed\n            // if (d > 0.0001) {\n            //     this._animationTime += d * (ts > 0 ? ts : 1)\n            // } else {\n            this._animationTime = this._viewer.timeline.time * (ts > 0 ? ts : 1)\n            // }\n\n            // const time = this._viewer.timeline.time\n            // if (this._lastFrameTime < 1) this._lastFrameTime = Math.min(time - 1.0 / 60.0, time - this._viewer.timeline.delta)\n            // let delta = time - this._lastFrameTime\n            // delta *= this.animationSpeed\n            //\n            // this._lastFrameTime = time\n            //\n            // if (pageScrollAnimate) delta *= this._pageScrollAnimationState\n            // else if (scrollAnimate && dragAnimate) delta *= absMax(this._scrollAnimationState, this._dragAnimationState)\n            // else if (scrollAnimate) delta *= this._scrollAnimationState\n            // else if (dragAnimate) delta *= this._dragAnimationState\n            //\n            // // if (Math.abs(delta) < 0.0001) return\n            //\n            // // const d = this._viewer.getPlugin<ProgressivePlugin>('Progressive')?.postFrameConvergedRecordingDelta()\n            // // if (d && d > 0) delta = d\n            // // if (d === 0) delta = 0 // not converged yet.\n            // // if d < 0: not recording, do nothing\n            //\n            // const ts = Math.abs(this.timeScale)\n            // this._animationTime += delta * (ts > 0 ? ts : 1)\n\n        }\n\n        const animDelta = this._animationTime - this._lastAnimationTime\n\n        this._lastAnimationTime = this._animationTime\n\n        if (Math.abs(animDelta) < 0.0001) return\n\n        if (animTime1 < 0.0001) {\n            this.dispatchEvent({type: 'checkpointBegin'})\n        }\n\n        const t = this.timeScale < 0 ?\n            (isFinite(this._animationDuration) ? this._animationDuration : 0) - this._animationTime :\n            this._animationTime\n\n        this._animations.map(a=>{\n            a.actions.forEach(a1=>{\n                const startTime = a1.clipData?.startTime || 0\n                const active = a1.clipData?.active ?? true\n\n                if (a1.clipData?.timeScale !== undefined) {\n                    a1.timeScale = a1.clipData.timeScale\n                }\n                if (startTime !== undefined && a1._startTime === null || a1._startTime !== startTime) {\n                    // a1.startAt(startTime)\n                    a1._startTime = startTime\n                }\n\n                let clipDuration = a1.getClip().duration\n                if (this.autoIncrementTime && this.loopAnimations) {\n                    clipDuration *= this.loopRepetitions\n                }\n\n                const isActive = active && (t >= startTime && (!isFinite(clipDuration) || t < clipDuration / Math.abs(a1.timeScale) + startTime))\n\n                if (this.autoUnpauseActions && a1.paused && isActive) {\n                    a1.paused = false\n                }\n                if (this.autoEnableActions && !a1.enabled && isActive) {\n                    a1.enabled = true\n                }\n                if (this.inactiveActionWeight !== null && !isActive && a1.weight) {\n                    a1.setEffectiveWeight(this.inactiveActionWeight)\n                } else if (this.activeActionWeight !== null && isActive && !a1.weight) {\n                    a1.setEffectiveWeight(this.activeActionWeight)\n                }\n                // if (a.paused) {\n                //     console.warn(a)\n                // }\n            })\n            a.mixer.setTime(t)\n        })\n\n        // if (this._animationTime > this._animationDuration) this._animationTime -= this._animationDuration\n        // if (this._animationTime < 0) this._animationTime += this._animationDuration\n\n        this._pageScrollAnimationState = this.pageScrollTime - this._animationTime\n        if (Math.abs(this._pageScrollAnimationState) < 0.001) this._pageScrollAnimationState = 0\n        else this._pageScrollAnimationState *= 1.0 - this.pageScrollAnimationDamping\n\n        if (Math.abs(this._scrollAnimationState) < 0.001) this._scrollAnimationState = 0\n        else this._scrollAnimationState *= 1.0 - this.scrollAnimationDamping\n\n        if (Math.abs(this._dragAnimationState) < 0.001) this._dragAnimationState = 0\n        else this._dragAnimationState *= 1.0 - this.dragAnimationDamping\n\n        this.dispatchEvent({type: 'animationStep', delta: animDelta, time: t})\n\n        // todo: this is now checked preFrame in ThreeViewer.ts\n        // if (this._viewer.scene.mainCamera.userData.isAnimating) { // if camera is animating\n        // this._viewer.scene.mainCamera.setDirty()\n        // console.log(this._viewer.scene.mainCamera, this._viewer.scene.mainCamera.getWorldPosition(new Vector3()))\n        // }\n\n        this._viewer.renderManager.resetShadows()\n        this._viewer.setDirty()\n\n        if (!this._fadeDisabled) {\n            const ff = this._viewer.getPlugin<FrameFadePlugin>('FrameFade')\n            if (ff) {\n                ff.disable(GLTFAnimationPlugin.PluginType)\n                this._fadeDisabled = true\n            }\n        }\n\n        if (this._animationTime >= this._animationDuration) {\n            this.dispatchEvent({type: 'checkpointEnd'})\n        }\n    }\n\n    // protected _rootClips: Set<AnimationClip> = new Set()\n\n    private _objectAdd = (ev: {object?: IObject3D})=>{\n        const object = ev.object\n        if (!this._viewer || !object) return\n        let changed = false\n        // const isInRoot = ev.options?.addToRoot // for model stage etc\n\n        const s = this._refreshAnimations(object, object)\n        if (s) changed = true\n\n        // this.playAnimation()\n        if (changed) {\n            this._onPropertyChange(!this.autoplayOnLoad)\n            if (this.autoplayOnLoad || this.autoplayOnLoadForce || this._animationState === 'playing') {\n                // note play animation also resets the time to 0 if autoIncrementTime is true, todo is this idea?\n                this.playAnimation()\n            }\n        }\n    }\n\n    private _objectRemove = (ev: {object: IObject3D})=>{\n        const object = ev.object as IObject3D\n        if (!this._viewer || !object) return\n        const animation = this._animations.find(a => a.object === object)\n        if (!animation) return\n\n        animation.mixer.stopAllAction()\n\n        this._animations.splice(this._animations.indexOf(animation), 1)\n        this.dispatchEvent({type: 'removeAnimation', animation})\n\n    }\n\n    private _refreshAnimations(obj: IObject3D, root: IObject3D) {\n        if (!this._viewer) return false\n        const clips: AnimationClip[] = obj.animations\n        if (clips.length < 1) return false\n\n        let animation = this._animations.find(a => a.object === obj)\n\n        animation = animation || {\n            object: obj,\n            mixer: new AnimationMixer(root),\n            clips: [],\n            actions: [],\n            duration: 0,\n        }\n        animation.clips = clips\n\n        animation.duration = Math.max(...clips.map(an => an.duration))\n\n        //  so that looping works in sync\n        if (root.userData.gltfAnim_SyncMaxDuration ?? this.syncMaxDuration) {\n            clips.forEach(cp => cp.duration = animation.duration)\n            root.userData.gltfAnim_SyncMaxDuration = true\n        }\n\n        const actions = clips.flatMap(clip => {\n            if (!clip.userData.clipActions) {\n                clip.userData.clipActions = {}\n            }\n            const existing = clip.userData.clipActions?.[obj.uuid]\n            if (existing && existing.length) {\n                const r = []\n                for (const data of existing) {\n                    const a = animation.actions.find(a1=>a1.clipData?.uid === data.uid)\n                    if (a) r.push(a)\n                }\n                if (r.length) return r\n            }\n            if (!existing) {\n                clip.userData.clipActions[obj.uuid] = []\n            }\n\n            const action = animation.mixer.clipAction(clip)\n            action.clipData = {\n                uid: generateUUID(),\n                active: true,\n                name: clip.name,\n                startTime: 0,\n                timeScale: 1,\n            }\n            action.setLoop(this.loopAnimations ? LoopRepeat : LoopOnce, this.loopRepetitions)\n            clip.userData.clipActions[obj.uuid].push(action.clipData)\n            return action\n        })\n\n        animation.actions = actions\n\n        animation.actions.forEach(ac => ac.clampWhenFinished = true)\n\n        this._animations.push(animation)\n        this.uiConfig?.uiRefresh?.(true, 'postFrame')\n        this.dispatchEvent({type: 'addAnimation', animation})\n        // todo remove on object dispose/remove\n\n        return true\n    }\n\n    protected _sceneUpdate: EventListener2<'sceneUpdate', ISceneEventMap, Scene> = (_ev)=>{\n        if (!this._viewer) return\n        const changed = this._refreshAnimations(this._viewer.scene.modelRoot, this._viewer.scene.modelRoot)\n        if (changed) {\n            this._onPropertyChange(!this.autoplayOnLoad)\n            if (this.autoplayOnLoad || this.autoplayOnLoadForce || this._animationState === 'playing') this.playAnimation()\n        }\n\n    }\n\n    private _onPropertyChange(replay = true): void {\n        this._animationDuration = Math.max(...this._animations.map(({duration})=>duration)) * (this.loopAnimations ? this.loopRepetitions : 1)\n        if (this._animationState === 'playing' && replay !== false) {\n            this.playAnimation()\n        }\n    }\n\n    get pageScrollTime() {\n        const scrollMax = this.pageScrollHeight()\n        const time = window.scrollY / scrollMax * (this.animationDuration - 0.05)\n        return time\n    }\n\n    private _scroll() {\n        if (this.isDisabled()) return\n        this._pageScrollAnimationState = this.pageScrollTime - this.animationTime\n    }\n\n    private _wheel({deltaY}: any | WheelEvent) {\n        if (this.isDisabled()) return\n        if (Math.abs(deltaY) > 0.001)\n            this._scrollAnimationState = -1. * Math.sign(deltaY)\n    }\n\n    private _drag(ev: any) {\n        if (this.isDisabled() || !this._viewer) return\n        this._dragAnimationState = this.dragAxis === 'x' ?\n            ev.delta.x * this._viewer.canvas.width / 4 :\n            ev.delta.y * this._viewer.canvas.height / 4\n    }\n\n\n    pageScrollHeight = () => Math.max(\n        document.body.scrollHeight,\n        document.body.offsetHeight,\n        document.documentElement.clientHeight,\n        document.documentElement.scrollHeight,\n        document.documentElement.offsetHeight\n    ) - window.innerHeight\n\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'GLTF Animation',\n        children: [\n            ...generateUiConfig(this),\n            () => {\n                return this._animations.map(anim=>{\n                    const c = {\n                        type: 'folder',\n                        label: `Animation - ${anim.object.name || anim.object.uuid}`,\n                        children: [\n                            ...anim.actions.map(action=>{\n                                const clip = action.getClip()\n                                const clipData = action.clipData\n                                return !clipData ? null : {\n                                    type: 'folder',\n                                    label: `Clip - ${clip.name}`,\n                                    children: [\n                                        {type: 'checkbox', label: 'Active', property: [clipData, 'active']},\n                                        {type: 'input', label: 'Name', property: [clipData, 'name']},\n                                        {type: 'monitor', label: 'Duration', getValue: () => clip.duration.toFixed(3)},\n                                        {\n                                            type: 'number',\n                                            label: 'Start Time',\n                                            property: [clipData, 'startTime'],\n                                        },\n                                        {\n                                            type: 'number',\n                                            label: 'Time Scale',\n                                            property: [clipData, 'timeScale'],\n                                        },\n                                    ],\n                                }\n                            }),\n                        ],\n                    }\n                    return c\n                })\n            },\n        ],\n    }\n}\n\ndeclare module 'three'{\n    interface AnimationAction{\n        _startTime: number | null\n        clipData?: { // serialized data\n            uid: string\n            name?: string\n            active?: boolean\n            startTime?: number\n            timeScale?: number\n        }\n    }\n}\n","import {EventListener2, Quaternion, Vector3} from 'three'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {PopmotionPlugin} from './PopmotionPlugin'\nimport {IObject3D, IScene, ISceneEventMap} from '../../core'\n\n// todo make a serializable object like CameraView for proper ui state management\nexport interface TSavedTransform {\n    position: Vector3\n    quaternion: Quaternion\n    scale: Vector3\n    name?: string\n}\n\n/**\n * Transform Animation Plugin\n *\n * Helper plugin to save, load and animate between different transforms(position, rotation, scale) on objects.\n * Also adds a UI to add and animate transforms on objects.\n * Requires the PopmotionPlugin to animate.\n *\n * @category Plugins\n */\nexport class TransformAnimationPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'TransformAnimationPlugin'\n    toJSON: any = undefined\n\n    enabled = true\n    dependencies = [PopmotionPlugin]\n\n    constructor() {\n        super()\n    }\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n        // todo use object3dmanager here instead of addSceneObject\n        viewer.scene.addEventListener('addSceneObject', this._addSceneObject)\n    }\n    onRemove(viewer: ThreeViewer): void {\n        viewer.scene.removeEventListener('addSceneObject', this._addSceneObject)\n        return super.onRemove(viewer)\n    }\n    private _addSceneObject: EventListener2<'addSceneObject', ISceneEventMap, IScene> = (e)=>{\n        const object = e.object\n        object?.traverse && !object.isWidget && object.traverse((o: IObject3D)=>{\n            if (o.isWidget) return\n            // if (!o.userData[TransformAnimationPlugin.PluginType].transforms) {\n            //     o.userData[TransformAnimationPlugin.PluginType].transforms = []\n            // }\n\n            // for old files, todo remove later\n            o.userData[TransformAnimationPlugin.PluginType]?.transforms?.forEach((t, i)=>{\n                if (t.name === undefined) t.name = 'Transform ' + i\n            })\n\n            const uiConfig: UiObjectConfig = {\n                type: 'folder',\n                label: 'Transform Animation',\n                children: [\n                    {\n                        type: 'button',\n                        label: 'Add Current Transform',\n                        value: ()=>{\n                            this.addTransform(o)\n                            uiConfig?.uiRefresh?.()\n                        },\n                    },\n                    ()=>o.userData[TransformAnimationPlugin.PluginType]?.transforms.map((t: TSavedTransform, i: number)=>({\n                        type: 'folder',\n                        label: t.name || `Transform ${i}`,\n                        children: [\n                            {\n                                type: 'input',\n                                label: 'Name',\n                                property: [t, 'name'],\n                            },\n                            {\n                                type: 'vec3',\n                                label: 'Position',\n                                property: [t, 'position'],\n                            },\n                            {\n                                type: 'vec3',\n                                label: 'Quaternion',\n                                property: [t, 'quaternion'],\n                            },\n                            {\n                                type: 'vec3',\n                                label: 'Scale',\n                                property: [t, 'scale'],\n                            },\n                            {\n                                type: 'button',\n                                label: 'Set',\n                                value: ()=>{\n                                    this.setTransform(o, t)\n                                },\n                            },\n                            {\n                                type: 'button',\n                                label: 'Animate',\n                                value: ()=>{\n                                    this.animateTransform(o, t)\n                                },\n                            }],\n                    })),\n                ],\n            }\n            o.uiConfig?.children?.push(uiConfig) // todo check if already exists\n        })\n    }\n\n    addTransform(o: IObject3D, name?: string) {\n        if (!o.userData[TransformAnimationPlugin.PluginType]) {\n            o.userData[TransformAnimationPlugin.PluginType] = {\n                transforms: [] as TSavedTransform[],\n            }\n        }\n        const transform = {\n            name: name || 'Transform ' + (o.userData[TransformAnimationPlugin.PluginType]!.transforms.length + 1),\n            position: o.position.clone(),\n            quaternion: o.quaternion.clone(),\n            scale: o.scale.clone(),\n        }\n        o.userData[TransformAnimationPlugin.PluginType]!.transforms.push(transform)\n        return transform\n    }\n\n    setTransform(o: IObject3D, tr: TSavedTransform|number|string) {\n        const t = this.getSavedTransform(tr, o)\n        if (!t) return\n        o.position.copy(t.position)\n        o.quaternion.copy(t.quaternion)\n        o.scale.copy(t.scale)\n        o.setDirty?.()\n        o.uiConfig?.uiRefresh?.()\n    }\n\n    getSavedTransform(tr: TSavedTransform | number | string, o: IObject3D) {\n        return typeof tr === 'number' ?\n            o.userData[TransformAnimationPlugin.PluginType]?.transforms[tr] :\n            typeof tr === 'string' ?\n                o.userData[TransformAnimationPlugin.PluginType]?.transforms.find(t1 => t1.name === tr) :\n                tr\n    }\n\n    animateTransform(o: IObject3D, tr: TSavedTransform|number|string, duration = 2000) {\n        const popmotion = this._viewer?.getPlugin(PopmotionPlugin)\n        if (!popmotion) {\n            this._viewer?.console.error('PopmotionPlugin required for animation')\n        }\n        const t = this.getSavedTransform(tr, o)\n        if (!t) return\n        // todo stop all existing animations(for the current model) like CameraView?\n        const pos = new Vector3()\n        const q = new Quaternion()\n        const s = new Vector3()\n        const op = o.position.clone()\n        const oq = o.quaternion.clone()\n        const os = o.scale.clone()\n        const ep = t.position\n        const eq = t.quaternion\n        const es = t.scale\n        return popmotion?.animate({\n            from: 0,\n            to: 1,\n            duration: duration,\n            onUpdate: (v: number) => {\n                pos.lerpVectors(op, ep, v)\n                q.slerpQuaternions(oq, eq, v)\n                s.lerpVectors(os, es, v)\n                o.position.copy(pos)\n                o.quaternion.copy(q)\n                o.scale.copy(s)\n                this._viewer?.setDirty()\n                this._viewer?.renderManager.resetShadows()\n                // o.setDirty?.()\n                // o.uiConfig?.uiRefresh?.()\n            },\n            onStop: () => {\n                o.position.copy(t.position)\n                o.quaternion.copy(t.quaternion)\n                o.scale.copy(t.scale)\n                o.setDirty?.()\n                o.uiConfig?.uiRefresh?.()\n            },\n        })\n    }\n}\n\ndeclare module '../../core/IObject' {\n    interface IObject3DUserData {\n        [TransformAnimationPlugin.PluginType]?: {\n            transforms: TSavedTransform[]\n        }\n    }\n}\n","import {createDiv, createStyles, getOrCall, serialize} from 'ts-browser-helpers'\nimport {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {generateUiConfig, UiObjectConfig} from 'uiconfig.js'\nimport {AnimationResult, PopmotionPlugin} from './PopmotionPlugin'\nimport {AnimationObject, AnimationObjectEventMap} from '../../utils/AnimationObject'\nimport {IMaterial, IObject3D} from '../../core'\nimport {Event2} from 'three'\nimport type {UndoManagerPlugin} from '../interaction/UndoManagerPlugin'\n\nexport interface AnimationObjectPluginEventMap extends AViewerPluginEventMap, AnimationObjectEventMap{\n    rebuildTimeline: {timeline: [AnimationObject, AnimationResult][]}\n    animationUpdate: {animation: AnimationObject}\n}\n\n/**\n * Animation Object Plugin\n *\n * This plugin allows you to create and manage animation objects for properties in the viewer, plugins, objects, materials etc.\n * Animation objects are serializable javascript objects that bind to a property, and can animate it over time across keyframes.\n *\n * Animation Object plugin adds support for creating animations bound to viewer and plugins and serializing them along with this plugin.\n * Also adds support for tracking and playback of animation objects in the userData of objects and materials.\n *\n * All the tracked animations are played on load and synced with the viewer timeline if its active.\n *\n * This plugin also adds trigger buttons for creating and editing animation objects, keyframes, for the ui config.\n */\n// @uiFolder('Viewer Animations') // todo rename plugin to Property Animation plugin?\nexport class AnimationObjectPlugin extends AViewerPluginSync<AnimationObjectPluginEventMap> {\n    public static readonly PluginType = 'AnimationObjectPlugin'\n    enabled = true\n\n    dependencies = [PopmotionPlugin]\n\n    /**\n     * Main animation with target = viewer for global properties\n     */\n    @serialize()\n    // @uiConfig()\n    readonly animation: AnimationObject = new AnimationObject(()=>this._viewer, ()=>this._viewer, 'Viewer Animation')\n\n    readonly runtimeAnimation: AnimationObject = new AnimationObject(undefined, ()=>this._viewer, 'Runtime Animation')\n\n    getAllAnimations() {\n        return [...this.animation.animSet, ...this.runtimeAnimation.animSet]\n    }\n\n    private _fAnimationAdd = (e: AnimationObjectEventMap['animationAdd'])=>{\n        this.rebuildTimeline()\n        this.dispatchEvent({...e, type: 'animationAdd'})\n    }\n    private _fAnimationRemove = (e: Event2<'animationRemove', AnimationObjectEventMap, AnimationObject>)=>{\n        this.rebuildTimeline()\n        this.dispatchEvent(e)\n\n        if (e.fromChild && e.target === this.runtimeAnimation) {\n            const obj = e.animation.target\n            if (obj?.userData?.animationObjects) this._removeAnimationFromObject(e.animation, obj as any)\n            const visibleBtns = this._visibleBtns.get(e.animation)\n            if (visibleBtns) {\n                visibleBtns.forEach(btn => this._refreshTriggerBtn(e.animation, btn))\n            }\n        } else {\n            this._visibleBtns.delete(e.animation)\n        }\n    }\n    private _fAnimationUpdate = (e: Event2<'update', AnimationObjectEventMap, AnimationObject>)=>{\n        this.rebuildTimeline()\n        this.dispatchEvent({...e, type: 'animationUpdate', animation: e.target})\n\n        if (!this._triggerButtonsShown) return\n        const visibleBtns = this._visibleBtns.get(e.target)\n        if (visibleBtns) {\n            visibleBtns.forEach(btn => this._refreshTriggerBtn(e.target, btn))\n        }\n    }\n    private _viewerTimelineUpdate = ()=>{\n        if (!this._viewer || !this._triggerButtonsShown) return\n        this._visibleBtns.forEach((btns, ao) => {\n            btns.forEach(btn => this._refreshTriggerBtn(ao, btn))\n        })\n    }\n    private _refreshTriggerBtn = (ao: AnimationObject, btn: HTMLElement) => {\n        const activeIndex = this._getActiveIndex(ao)\n        btn.classList.remove('anim-object-uic-trigger-equals')\n        btn.classList.remove('anim-object-uic-trigger-active')\n\n        btn.dataset.activeIndex = activeIndex\n        if (activeIndex.length) {\n            btn.classList.add('anim-object-uic-trigger-active')\n            if (ao.isValueSame(parseInt(activeIndex)))\n                btn.classList.add('anim-object-uic-trigger-equals')\n        }\n    }\n\n    private _getActiveIndex(ao: AnimationObject<any>) {\n        if (!ao.target) return ''\n        const cTime = 1000 * (this._viewer?.timeline.time || 0) // current time in ui\n        const localTime = (cTime - ao.delay) / ao.duration\n        const offsetTimes = ao.offsets\n        const closestIndex = offsetTimes.reduce((prev, curr, index) => {\n            return Math.abs(curr - localTime) < Math.abs(offsetTimes[prev] - localTime) ? index : prev\n        }, 0)\n        const dist = Math.abs(offsetTimes[closestIndex] - localTime)\n        const activeIndex = dist * ao.duration < 50 ? closestIndex.toString() : ''\n        return activeIndex\n    }\n\n    private _triggerButtonsShown = false\n    get triggerButtonsShown() {\n        return this._triggerButtonsShown\n    }\n    set triggerButtonsShown(v: boolean) {\n        const changed = this._triggerButtonsShown !== v\n        this._triggerButtonsShown = v\n        if (v) document.body.classList.add('aouic-triggers-visible')\n        else document.body.classList.remove('aouic-triggers-visible')\n        if (changed && v) {\n            this._visibleBtns.forEach((btns, ao) => {\n                btns.forEach(btn => this._refreshTriggerBtn(ao, btn))\n            })\n        }\n    }\n    showTriggers(v = true) {\n        this.triggerButtonsShown = v\n    }\n\n    constructor() {\n        super()\n        this.animation.animSetParallel = true\n        this.animation.uiConfig.uiRefresh = (...args)=>this.uiConfig.uiRefresh?.(...args)\n        this.animation.addEventListener('animationAdd', this._fAnimationAdd)\n        this.animation.addEventListener('animationRemove', this._fAnimationRemove)\n        this.animation.addEventListener('update', this._fAnimationUpdate)\n        this.runtimeAnimation.animSetParallel = true\n        this.runtimeAnimation.uiConfig.uiRefresh = (...args)=>this.uiConfig.uiRefresh?.(...args)\n        this.runtimeAnimation.addEventListener('animationAdd', this._fAnimationAdd)\n        this.runtimeAnimation.addEventListener('animationRemove', this._fAnimationRemove)\n        this.runtimeAnimation.addEventListener('update', this._fAnimationUpdate)\n        this._fAnimationAdd({animation: this.animation})\n\n        createStyles(`\n        .anim-object-uic-trigger{\n            padding: 4px;\n            margin-top: -4px;\n            cursor: pointer;\n            color: var(--tp-label-foreground-color, #777);\n            display: none;\n        }\n        .anim-object-uic-trigger-visible{\n        }\n        .anim-object-uic-trigger-active{\n            color: blue;\n        }\n        .anim-object-uic-trigger-equals{\n            color: red !important;\n        }\n        .aouic-triggers-visible .anim-object-uic-trigger{\n            display: inline-block;\n        }\n        `)\n    }\n\n    // uiConfig = this.animation.uiConfig\n\n    private _currentTimeline: [AnimationObject, AnimationResult][] = []\n    private _refTimeline = false\n    rebuildTimeline() {\n        this._refTimeline = true\n    }\n    protected _viewerListeners = {\n        postFrame: ()=>{\n            const pop = this._viewer?.getPlugin(PopmotionPlugin)\n            if (this._refTimeline && pop) {\n                this._refTimeline = false\n                this._currentTimeline.forEach(([_, r]) => r.stop())\n                this._currentTimeline = this.getAllAnimations().map(o => [o, pop.animateObject(o, 0, false, pop.timelineDriver)])\n                this.dispatchEvent({type: 'rebuildTimeline', timeline: this._currentTimeline})\n            }\n        },\n    }\n    getTimeline() {\n        return this._currentTimeline\n    }\n\n    addAnimation(access?: string, target?: any, anim?: AnimationObject) {\n        anim = anim || new AnimationObject()\n        if (access !== undefined) anim.access = access\n        if (!target?.userData) {\n            if (!this.animation.animSet.includes(anim))\n                this.animation.add(anim)\n        } else {\n            if (!target.userData.animationObjects) target.userData.animationObjects = []\n            if (!target.userData.animationObjects.includes(anim)) {\n                target.userData.animationObjects.push(anim)\n                this._addAnimationObject(anim, target)\n                this._setupUiConfig(target)\n            }\n        }\n        return anim\n    }\n    removeAnimation(anim: AnimationObject, target?: any) {\n        if (!target?.userData) {\n            this.animation.remove(anim)\n        } else {\n            this._removeAnimationFromObject(anim, target)\n            this._removeAnimationObject(anim)\n            this._cleanUpUiConfig(target)\n        }\n    }\n\n    private _objectAdd = (e: {object?: IObject3D})=>{\n        const obj = e.object\n        if (!obj) return\n        if (obj.isWidget) return\n        if (Array.isArray(obj.userData.animationObjects)) {\n            obj.userData.animationObjects.forEach(ao=> this._addAnimationObject(ao, obj))\n        }\n        this._setupUiConfig(obj)\n    }\n\n    private _objectRemove = (e: {object?: IObject3D})=>{\n        const obj = e.object\n        if (!obj) return\n        if (Array.isArray(obj.userData.animationObjects)) {\n            obj.userData.animationObjects.forEach(ao=> this._removeAnimationObject(ao))\n        }\n        this._cleanUpUiConfig(obj)\n    }\n\n    private _materialAdd = (e: {material?: IMaterial})=>{\n        const obj = e.material\n        if (!obj) return\n        if (Array.isArray(obj.userData.animationObjects)) {\n            obj.userData.animationObjects.forEach(ao=> this._addAnimationObject(ao, obj))\n        }\n        this._setupUiConfig(obj)\n    }\n\n    private _materialRemove = (e: {material?: IMaterial})=>{\n        const obj = e.material\n        if (!obj) return\n        if (Array.isArray(obj.userData.animationObjects)) {\n            obj.userData.animationObjects.forEach(ao=> this._removeAnimationObject(ao))\n        }\n        this._cleanUpUiConfig(obj)\n    }\n\n    private _addAnimationObject(ao: AnimationObject, obj: IObject3D|IMaterial) {\n        ao.target = obj\n        this.runtimeAnimation.add(ao)\n    }\n\n    private _removeAnimationObject(ao: AnimationObject) {\n        this.runtimeAnimation.remove(ao)\n        ao.target = undefined\n    }\n    private _removeAnimationFromObject(ao: AnimationObject, obj: IObject3D|IMaterial) {\n        ao.target = undefined\n        if (!obj.userData.animationObjects) return\n        const ind = obj.userData.animationObjects.indexOf(ao)\n        if (ind >= 0) {\n            obj.userData.animationObjects.splice(ind, 1)\n            if (obj.userData.animationObjects.length < 1) {\n                delete obj.userData.animationObjects\n            }\n        }\n    }\n\n    private _visibleBtns = new Map<AnimationObject, Set<HTMLElement>>()\n    private _iObservers = new WeakMap<IObject3D|IMaterial, {o: IntersectionObserver, btn: HTMLElement, key: string}[]>()\n\n    private _setupUiConfig(obj: IObject3D | IMaterial) {\n        const type = (obj as IObject3D).isObject3D ? 'objects' : (obj as IMaterial).isMaterial ? 'materials' : undefined\n        if (!type) return\n        if (!obj.uiConfig) return\n        const existing = obj.uiConfig?.children?.find(c => typeof c === 'object' && c.tags?.includes(AnimationObjectPlugin.PluginType))\n        if (existing) return // todo regenerate?\n        obj.uiConfig?.children?.push({\n            type: 'folder',\n            label: 'Property Animations',\n            tags: ['animation', AnimationObjectPlugin.PluginType],\n            children: [()=>obj.userData.animationObjects?.map(ao=>ao.uiConfig)],\n        })\n\n        this._setupUiConfigButtons(obj)\n        if ((obj as IObject3D).isObject3D) {\n            (obj as IObject3D).addEventListener('objectUpdate', this._objectUpdate)\n        }\n        if ((obj as IMaterial).isMaterial) {\n            (obj as IMaterial).addEventListener('materialUpdate', this._objectUpdate)\n        }\n    }\n\n    private _cleanUpUiConfig(obj: IObject3D | IMaterial) {\n        this._cleanupUiConfigButtons(obj)\n        const observers = this._iObservers.get(obj)\n        if (observers) {\n            observers.forEach(({o, btn}) => {\n                o.disconnect()\n                btn.remove()\n            })\n            this._iObservers.delete(obj)\n        }\n        if ((obj as IObject3D).isObject3D) {\n            (obj as IObject3D).removeEventListener('objectUpdate', this._objectUpdate)\n        }\n        if ((obj as IMaterial).isMaterial) {\n            (obj as IMaterial).removeEventListener('materialUpdate', this._objectUpdate)\n        }\n        if (!obj.uiConfig) return\n        const existing = obj.uiConfig?.children?.findIndex(c => typeof c === 'object' && c.tags?.includes(AnimationObjectPlugin.PluginType))\n        if (existing !== undefined && existing >= 0) {\n            obj.uiConfig.children?.splice(existing, 1)\n        }\n    }\n\n    private _setupUiConfigButtons(obj: IObject3D | IMaterial) {\n        const components = this._animatableUiConfigs(obj)\n        for (const config of components) {\n            this.setupUiConfigButton(obj, config)\n        }\n    }\n\n    private _cleanupUiConfigButtons(obj: IObject3D | IMaterial, uiConfigs?: UiObjectConfig[]) {\n        const components = uiConfigs ?? this._animatableUiConfigs(obj)\n        for (const config of components) {\n            this.cleanupUiConfigButton(config)\n        }\n    }\n\n    setupUiConfigButton(obj: IObject3D | IMaterial, config: UiObjectConfig, path?: string) {\n        if (config._animTriggerInit) return\n        const prop = getOrCall(config.property) // todo use uiconfigmethods\n        if (!prop) return\n        const [tar, key] = prop\n        if (!tar || typeof key !== 'string' || tar !== obj && !path) return\n        const keyPath = path ? path.endsWith('.') ? path + key : path : key\n        const btn = createDiv({innerHTML: '◆', classList: ['anim-object-uic-trigger'], addToBody: false})\n        if (btn.parentElement) btn.remove()\n        btn.dataset.isAnimObjectTrigger = '1'\n        btn.title = 'Add Animation for ' + getOrCall(config.label, key) // todo use uiconfigmethods\n\n        btn.addEventListener('click', () => {\n            const undo = this._viewer?.getPlugin<UndoManagerPlugin>('UndoManagerPlugin') // todo use uiconfigmethods\n            let ao = getAo(obj, keyPath)\n            const cTime = 1000 * (this._viewer?.timeline.time || 0) // current time in ui\n            if (!ao) {\n                ao = new AnimationObject()\n                // ao.access = type + '.' + obj.uuid + '.' + keyPath\n                ao.access = keyPath\n                ao.name = obj.name + ' ' + (getOrCall(config.label, keyPath) || keyPath)\n                ao.updateTarget = true // calls setDirty on obj on any change\n                ao.delay = cTime // current time in ui\n                ao.duration = 2000\n                const cao = ao\n                const c = {\n                    redo: () => {\n                        if (!obj.userData.animationObjects) obj.userData.animationObjects = []\n                        obj.userData.animationObjects.push(cao)\n                        this._addAnimationObject(cao, obj)\n                        this._refreshTriggerBtn(cao, btn)\n                    },\n                    undo: () => {\n                        cao.removeFromParent() // this will dispatch with fromChild = true\n                        this._refreshTriggerBtn(cao, btn)\n                    },\n                }\n                c.redo()\n                undo?.undoManager?.record(c)\n            } else if (ao.values.length > 1) {\n                const cao = ao\n                const shownActiveIndex = btn.dataset.activeIndex || ''\n                const activeIndex = this._getActiveIndex(ao)\n                if (activeIndex === shownActiveIndex) {\n                    const index = parseInt(activeIndex || '-1')\n                    const ref = () => this._refreshTriggerBtn(cao, btn)\n                    if (undo) {\n                        if (index < 0) undo.performAction(ao, ao.addKeyframe, [cTime], 'addKeyframe-' + ao.access, ref)\n                        else undo.performAction(ao, ao.updateKeyframe, [index], 'editKeyframe-' + ao.access, ref)\n                        ref()\n                    } else {\n                        if (index < 0) ao.addKeyframe(cTime)\n                        else ao.updateKeyframe(index)\n                        ref()\n                    }\n\n                } else {\n                    // todo something else is shown in ui, maybe user didnt want this\n                    console.error('Active index mismatch', activeIndex, shownActiveIndex)\n                }\n            }\n            this._setBtnVisible(ao, btn, true)\n\n            // btn.remove()\n            // config.domChildren = !config.domChildren || Array.isArray(config.domChildren) ? config.domChildren?.filter(d => d !== btn) || [] : config.domChildren\n        })\n\n        const btnObserver = new IntersectionObserver(entries => {\n            const ao = getAo(obj, keyPath)\n            if (!ao) return\n            for (const entry of entries) {\n                if (entry.target !== btn) continue\n                this._setBtnVisible(ao, btn, entry.isIntersecting)\n            }\n        })\n        btnObserver.observe(btn)\n        if (!this._iObservers.has(obj)) this._iObservers.set(obj, [])\n        this._iObservers.get(obj)?.push({o: btnObserver, btn, key: keyPath})\n\n        const ao = getAo(obj, keyPath)\n        if (ao) this._refreshTriggerBtn(ao, btn)\n\n        config._animTriggerInit = true\n        config.domChildren = !config.domChildren || Array.isArray(config.domChildren) ? [...config.domChildren || [], btn] : config.domChildren\n    }\n\n    cleanupUiConfigButton(config?: UiObjectConfig) {\n        if (!config) return\n        config.domChildren = Array.isArray(config.domChildren) ? config.domChildren?.filter(d => !(d instanceof HTMLElement && d.dataset.isAnimObjectTrigger)) || [] : config.domChildren\n    }\n\n    private _setBtnVisible(ao: AnimationObject, btn: HTMLElement, visible : boolean) {\n        if (!this._visibleBtns.has(ao)) this._visibleBtns.set(ao, new Set())\n        const btns = this._visibleBtns.get(ao)!\n        // console.log(entry.isIntersecting)\n        if (visible) {\n            if (!btns.has(btn)) {\n                btn.classList.add('anim-object-uic-trigger-visible')\n                btns.add(btn)\n                // timeline time change\n                // animation object change\n            }\n        } else {\n            btn.classList.remove('anim-object-uic-trigger-visible')\n            btns.delete(btn)\n        }\n    }\n\n    private _animatableUiConfigs(obj: IObject3D | IMaterial) {\n        return obj.uiConfig?.children?.filter(c =>\n            typeof c === 'object' && c.type &&\n            ['vec3', 'color', 'number', 'checkbox', 'toggle', 'slider'].includes(c.type) &&\n            Array.isArray(c.property) && c.property[0] === obj && // todo use uiconfigmethods to get the property?\n            (!(obj as IMaterial).constructor?.InterpolateProperties || (obj as IMaterial).constructor.InterpolateProperties!.includes(c.property[1] as string))\n        ) as UiObjectConfig[] || []\n    }\n\n    private _objectUpdate = (e: {change?: string, key?: string, object?: IObject3D, material?: IMaterial, target?: IObject3D|IMaterial}) => {\n        const obj = e.object || e.material\n        if (this.isDisabled() || !this._triggerButtonsShown || !obj || obj !== e.target) return\n        const key = e.change || e.key\n        if (!obj.assetType || obj.assetType === 'widget' || !key) return\n        const btns = this._iObservers.get(obj)\n            ?.filter(o => (o.key === key || o.key?.endsWith('.' + key)) && o.btn?.parentElement)\n        if (!btns?.length) return\n        for (const obs of btns) {\n            const ao1 = getAo(obj, obs.key) // todo deep access key\n            if (!ao1) return\n            this._refreshTriggerBtn(ao1, obs.btn)\n        }\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n\n        viewer.timeline.addEventListener('update', this._viewerTimelineUpdate)\n\n        ;(viewer as any)._animGetters = { // used in extractAnimationKey\n            objects: (name: string, acc: string[])=>{\n                if (!viewer) return undefined\n                const obj = viewer.object3dManager.findObject(name)\n                return {tar: obj, acc, onChange: obj ? ()=>{\n                    obj.setDirty && obj.setDirty({refreshScene: false, frameFade: false})\n                } : undefined}\n            },\n            materials: (name: string, acc: string[])=>{\n                if (!viewer) return undefined\n                const mat = viewer.object3dManager.findMaterial(name)\n                return {tar: mat, acc, onChange: mat ? ()=>{\n                    mat.setDirty && mat.setDirty({frameFade: false})\n                } : undefined}\n            },\n        }\n\n        this._setupUiConfig(viewer.scene)\n\n        viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n        viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n        viewer.object3dManager.getMaterials().forEach(material=>this._materialAdd({material}))\n        viewer.object3dManager.addEventListener('materialAdd', this._materialAdd)\n        viewer.object3dManager.addEventListener('materialRemove', this._materialRemove)\n\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        this._cleanUpUiConfig(viewer.scene)\n\n        viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n        viewer.object3dManager.removeEventListener('materialAdd', this._materialAdd)\n        viewer.object3dManager.removeEventListener('materialRemove', this._materialRemove)\n        viewer.object3dManager.getMaterials().forEach(material=>this._materialRemove({material}))\n\n        delete (viewer as any)._animGetters\n        super.onRemove(viewer)\n    }\n\n    fromJSON(data: any, meta?: any): this | null {\n        if (!super.fromJSON(data, meta)) return null\n        // this.animation.setTarget(() => this._viewer)\n        return this\n    }\n\n    // override ui config for flatten hierarchy (for now)\n    uiConfig: UiObjectConfig = {\n        label: 'Viewer Animations',\n        type: 'folder',\n        children: [\n            generateUiConfig(this.animation).filter(c=>{\n                const label = getOrCall((c as UiObjectConfig)?.label) ?? '' as any\n                // if (label === ('animSet' as (keyof AnimationObject))) return c.children\n                return ['Animate', 'Stop', 'Animate Reverse'].includes(label)\n            }) ?? [],\n            ()=> {\n                const c = generateUiConfig(this.animation.animSet)\n                return c.map(d=>getOrCall(d)).filter(Boolean)\n            },\n            {\n                type: 'checkbox',\n                label: 'Run in Parallel',\n                property: [this.animation, 'animSetParallel'],\n            },\n            {\n                type: 'button',\n                label: 'Add Animation',\n                value: ()=>{\n                    this.animation.addAnimation()\n                    this.uiConfig.uiRefresh?.(true, 'postFrame', 1)\n                },\n            },\n            {\n                type: 'checkbox',\n                label: 'Show Triggers',\n                property: [this, 'triggerButtonsShown'],\n            },\n            // {\n            //     type: 'button',\n            //     label: 'Clear Animations',\n            //     value: ()=>{\n            //         this.animation.animSet = []\n            //         this.animation.refreshUi()\n            //     },\n            // }\n        ],\n    }\n}\n\ndeclare module '../../assetmanager/IAssetImporter'{\n    interface IImportResultUserData{\n        animationObjects?: AnimationObject[]\n    }\n}\n\nconst getAo = (obj: IObject3D|IMaterial, key: string) => {\n    // if (!obj.userData.animationObjects) obj.userData.animationObjects = []\n    return obj?.userData.animationObjects?.find(o => o.access === key)\n}\n","import {Color} from 'three'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {glsl, serialize} from 'ts-browser-helpers'\nimport {IMaterialUserData, PhysicalMaterial} from '../../core'\nimport {MaterialExtension, updateMaterialDefines} from '../../materials'\nimport {shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {AssetManager, GLTFWriter2} from '../../assetmanager'\nimport type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\n\n/**\n * Clearcoat Tint Plugin\n * Adds a material extension to PhysicalMaterial which adds tint and thickness to the built-in clearcoat properties.\n * It also adds a UI to the material to edit the settings.\n * It uses WEBGI_materials_clearcoat_tint glTF extension to save the settings in glTF files.\n * @category Plugins\n */\n@uiFolderContainer('Clearcoat Tint (MatExt)')\nexport class ClearcoatTintPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'ClearcoatTintPlugin'\n\n    @uiToggle('Enabled', (that: ClearcoatTintPlugin)=>({onChange: that.setDirty}))\n    @serialize() enabled = true\n\n    // private _defines: any = {\n    //     // eslint-disable-next-line @typescript-eslint/naming-convention\n    //     CLEARCOAT_TINT_DEBUG: false,\n    // }\n    private _uniforms: any = {\n        ccTintColor: {value: new Color()},\n        ccThickness: {value: 0.},\n        ccIor: {value: 0.},\n    }\n\n    static AddClearcoatTint(material: PhysicalMaterial, params?: IMaterialUserData['_clearcoatTint']): IMaterialUserData['_clearcoatTint']|null {\n        const ud = material?.userData\n        if (!ud) return null\n        if (!ud._clearcoatTint) ud._clearcoatTint = {}\n        const tf = ud._clearcoatTint!\n        tf.enableTint = true\n        if (tf.tintColor === undefined) tf.tintColor = '#ffffff'\n        if (tf.thickness === undefined) tf.thickness = 0.1\n        if (tf.ior === undefined) tf.ior = 1.5\n        params && Object.assign(tf, params)\n        if (material.setDirty) material.setDirty()\n        return tf\n    }\n\n    // private _multiplyPass?: MultiplyPass\n    readonly materialExtension: MaterialExtension = {\n        parsFragmentSnippet: (_, material: PhysicalMaterial)=>{\n            if (this.isDisabled() || !material?.userData._clearcoatTint?.enableTint || !(material.clearcoat > 0)) return ''\n            return glsl`\nuniform vec3 ccTintColor;\nuniform float ccThickness;\nuniform float ccIor;\nvec3 clearcoatTint(const in float dotNV, const in float dotNL, const in float clearcoat) {\n    vec3 tint = ( ccThickness > 0. ? 1. - ccTintColor : ccTintColor); // Set thickness < 0 for glow.\n    tint = exp(tint * -(ccThickness * ((dotNL + dotNV) / max(dotNL * dotNV, 1e-3)))); // beer's law\n    return mix(vec3(1.0), tint, clearcoat);\n}\n        `\n        },\n        shaderExtender: (shader, material: PhysicalMaterial) => {\n            if (this.isDisabled() || !material?.userData._clearcoatTint?.enableTint || !(material.clearcoat > 0)) return\n\n            // Note: clearcoat only considers specular, not diffuse\n\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader,\n                'float dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );',\n                'float dotNVcc = saturate( dot( geometryClearcoatNormal, -refract(geometryViewDir, geometryClearcoatNormal, 1./ccIor) ) );')\n\n            // todo: we are considering all light is coming from env map, but we should consider light coming from light sources by seperating light and env map attenuation\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader,\n                'outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;',\n                'outgoingLight *= clearcoatTint(dotNVcc, dotNVcc, material.clearcoat);\\n', {prepend: true})\n\n            shader.defines && (shader.defines.USE_UV = '')\n\n        },\n        onObjectRender: (_, material) => {\n            const tfUd = material.userData._clearcoatTint\n            if (!tfUd?.enableTint) return\n\n            this._uniforms.ccTintColor.value.set(tfUd.tintColor) // could be number or string also, apart from Color\n            this._uniforms.ccThickness.value = tfUd.thickness\n            this._uniforms.ccIor.value = tfUd.ior\n\n            updateMaterialDefines({\n                // ...this._defines,\n                ['CLEARCOAT_TINT_ENABLED']: +!this.isDisabled(),\n            }, material)\n        },\n        extraUniforms: {\n            // ...this._uniforms, // done in constructor\n        },\n        computeCacheKey: (material1: PhysicalMaterial) => {\n            return (this.isDisabled() ? '0' : '1') + (material1.userData._clearcoatTint?.enableTint ? '1' : '0') + (material1.clearcoat > 0 ? '1' : '0')\n        },\n        isCompatible: (material1: PhysicalMaterial) => {\n            return material1.isPhysicalMaterial\n        },\n        getUiConfig: (material: PhysicalMaterial) => { // todo use uiConfigMaterialExtension\n            const viewer = this._viewer!\n            if (material.userData._clearcoatTint === undefined) material.userData._clearcoatTint = {}\n            const state = material.userData._clearcoatTint\n            const config: UiObjectConfig = {\n                type: 'folder',\n                label: 'Clearcoat Tint',\n                onChange: (ev)=>{\n                    if (!ev.config) return\n                    this.setDirty()\n                },\n                children: [\n                    {\n                        type: 'checkbox',\n                        label: 'Enabled',\n                        get value() {\n                            return state.enableTint || false\n                        },\n                        set value(v) {\n                            if (v === state.enableTint) return\n                            if (v) {\n                                if (!ClearcoatTintPlugin.AddClearcoatTint(material))\n                                    viewer.dialog.alert('Cannot add clearcoat tint.')\n                            } else {\n                                state.enableTint = false\n                                if (material.setDirty) material.setDirty()\n                            }\n                            config.uiRefresh?.(true, 'postFrame')\n                        },\n                    },\n                    {\n                        type: 'color',\n                        label: 'Tint color',\n                        hidden: () => !state.enableTint,\n                        property: [state, 'tintColor'],\n                    },\n                    {\n                        type: 'input',\n                        label: 'Thickness',\n                        hidden: () => !state.enableTint,\n                        property: [state, 'thickness'],\n                    },\n                    {\n                        type: 'slider',\n                        bounds: [0.8, 2.5],\n                        label: 'IOR',\n                        hidden: () => !state.enableTint,\n                        property: [state, 'ior'],\n                    },\n                ],\n            }\n            return config\n        },\n\n    }\n\n    setDirty = (): void => {\n        this.materialExtension.setDirty?.()\n        this._viewer?.setDirty()\n    }\n\n    constructor() {\n        super()\n        Object.assign(this.materialExtension.extraUniforms!, this._uniforms)\n    }\n\n    onAdded(v: ThreeViewer) {\n        super.onAdded(v)\n        v.assetManager.materials.registerMaterialExtension(this.materialExtension)\n        v.assetManager.registerGltfExtension(clearCoatTintGLTFExtension)\n    }\n\n    onRemove(v: ThreeViewer) {\n        v.assetManager.materials?.unregisterMaterialExtension(this.materialExtension)\n        v.assetManager.unregisterGltfExtension(clearCoatTintGLTFExtension.name)\n        return super.onRemove(v)\n    }\n\n    /**\n     * @deprecated - use {@link clearCoatTintGLTFExtension}\n     */\n    public static readonly CLEARCOAT_TINT_GLTF_EXTENSION = 'WEBGI_materials_clearcoat_tint'\n\n}\n\ndeclare module '../../core/IMaterial' {\n    interface IMaterialUserData {\n        _clearcoatTint?: {\n            enableTint?: boolean\n            tintColor?: Color|number|string\n            thickness?: number\n            ior?: number\n        }\n    }\n}\n\n/**\n * ClearcoatTint Materials Extension\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_clearcoat_tint.html (todo - fix link)\n */\nclass GLTFMaterialsClearcoatTintExtensionImport implements GLTFLoaderPlugin {\n    public name: string\n    public parser: GLTFParser\n\n    constructor(parser: GLTFParser) {\n        this.parser = parser\n        this.name = clearCoatTintGLTFExtension.name\n    }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n        const parser = this.parser\n        const materialDef = parser.json.materials[materialIndex]\n        if (!materialDef.extensions || !materialDef.extensions[this.name]) return\n        const extension = materialDef.extensions[this.name]\n        if (!materialParams.userData) materialParams.userData = {}\n        ClearcoatTintPlugin.AddClearcoatTint(materialParams)\n        ThreeSerialization.Deserialize(extension, materialParams.userData._clearcoatTint)\n    }\n}\n\nconst glTFMaterialsClearcoatTintExtensionExport = (w: GLTFWriter2)=> ({\n    writeMaterial: (material: any, materialDef: any) => {\n        if (!material.isMeshStandardMaterial || !material.userData._clearcoatTint?.enableTint) return\n        materialDef.extensions = materialDef.extensions || {}\n\n        const extensionDef: any = ThreeSerialization.Serialize(material.userData._clearcoatTint)\n\n        materialDef.extensions[ clearCoatTintGLTFExtension.name ] = extensionDef\n        w.extensionsUsed[ clearCoatTintGLTFExtension.name ] = true\n    },\n})\n\nexport const clearCoatTintGLTFExtension = {\n    name: 'WEBGI_materials_clearcoat_tint',\n    import: (p) => new GLTFMaterialsClearcoatTintExtensionImport(p),\n    export: glTFMaterialsClearcoatTintExtensionExport,\n    textures: undefined,\n} satisfies AssetManager['gltfExtensions'][number]\n","#include <randomHelpers>\n#include <voronoiNoise>\n\nuniform vec2 noiseBumpParams;\nuniform float noiseBumpScale;\nuniform float noiseBumpFlakeScale;\nuniform float noiseFlakeClamp;\nuniform float noiseFlakeRadius;\nuniform bool useColorFlakes;\nuniform vec4 flakeParams; // Roughness, Metalness, Strength, Threshold\nuniform vec3 flakeFallOffParams; // useFallOff, fallOffFactor\n\nvec3 perturbNormalArb_nb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\n    #ifdef BUMP_MAP_SCALE_LEGACY\n    vec3 vSigmaX = ( dFdx( surf_pos.xyz ) );\n    vec3 vSigmaY = ( dFdy( surf_pos.xyz ) );\n    #else\n    // normalize is done to ensure that the bump map looks the same regardless of the texture's scale\n    vec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n    vec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n    #endif\n    vec3 vN = surf_norm; // normalized\n\n    vec3 R1 = cross( vSigmaY, vN );\n    vec3 R2 = cross( vN, vSigmaX );\n\n    float fDet = dot( vSigmaX, R1 ) * faceDirection;\n\n    vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n    return normalize( abs( fDet ) * surf_norm - vGrad );\n\n}\n","vec3 outColor, outColor1, outColor2, outColor3, outColor4, outColor5;\nfloat distFac = length(vViewPosition.xyz);\n/*float e = floor( log2( 0.3 * distFac + 3.0 ) / 0.3785116);\nfloat level_z = 0.1 * pow( 1.3 , e ) - 0.2;*/\nfloat level = 1.;//0.15 / level_z;\nvec2 uvMod = noiseBumpFlakeScale * noiseBumpParams.xy * vUv * level;\nfloat voronoiDist = clamp(voronoi_f1_2d( uvMod, 1., noiseFlakeClamp, noiseFlakeRadius, outColor ), 0.0, 1.0);\n\nvec3 oldNormal = normal;\nnormal = perturbNormalArb_nb( - vViewPosition, normal, (2. * outColor.xy - 1.) * noiseBumpScale, faceDirection ); \n\nfloat oldRoughnessFactor = roughnessFactor;\nfloat oldMetalnessFactor = metalnessFactor;\nroughnessFactor = mix(roughnessFactor, flakeParams.x, 1. - voronoiDist);\nmetalnessFactor = mix(metalnessFactor, flakeParams.y, 1. - voronoiDist);\n\n\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\n    vec3 sparkleRadiance = getIBLRadiance( normalize(vViewPosition), normal, roughnessFactor );\n    float sparkleIntensity = length(sparkleRadiance);\n    float sparkleIntensityMultiplier = sparkleIntensity > 1.3 ? flakeParams.z : 1.;\n    \n    vec3 oldDiffuseColor = diffuseColor.rgb;\n    vec2 cellPosition_ = floor(uvMod);\n    vec3 colorRGB = useColorFlakes ? hash3(cellPosition_) : vec3(1.);\n    \n    float fallOff_ = mix(1., 1. / (1. + flakeFallOffParams.y * distFac + flakeFallOffParams.z * distFac * distFac), flakeFallOffParams.x);\n    diffuseColor.rgb *= mix(vec3(1.), sparkleIntensityMultiplier * colorRGB * fallOff_, vec3(1. - voronoiDist));\n\n    if(sparkleIntensity < flakeParams.w) {\n        float mixFactor = 1.;\n        roughnessFactor = mix(roughnessFactor, oldRoughnessFactor, mixFactor);\n        metalnessFactor = mix(metalnessFactor, oldMetalnessFactor, mixFactor);\n        normal = normalize(mix(normal, oldNormal, mixFactor));\n        diffuseColor.rgb = mix(diffuseColor.rgb, oldDiffuseColor, mixFactor);\n    }\n#endif","import {Vector2, Vector2Tuple, Vector3, Vector3Tuple, Vector4, Vector4Tuple} from 'three'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {serialize} from 'ts-browser-helpers'\nimport {IMaterial, IMaterialUserData, IObject3D, PhysicalMaterial} from '../../core'\nimport {MaterialExtension, updateMaterialDefines} from '../../materials'\nimport {shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {AssetManager, GLTFWriter2} from '../../assetmanager'\nimport type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport NoiseBumpMaterialPluginPars from './shaders/NoiseBumpMaterialPlugin.pars.glsl'\nimport NoiseBumpMaterialPluginPatch from './shaders/NoiseBumpMaterialPlugin.patch.glsl'\n\n/**\n * NoiseBump Materials Extension\n * Adds a material extension to PhysicalMaterial to add support for sparkle bump / noise bump by creating procedural bump map from noise to simulate sparkle flakes.\n * It uses voronoise function from blender along with several additions to generate the noise for the generation.\n * It also adds a UI to the material to edit the settings.\n * It uses WEBGI_materials_noise_bump glTF extension to save the settings in glTF files.\n * @category Plugins\n */\n@uiFolderContainer('Noise/Sparkle Bump (MatExt)')\nexport class NoiseBumpMaterialPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'NoiseBumpMaterialPlugin'\n\n    @uiToggle('Enabled', (that: NoiseBumpMaterialPlugin)=>({onChange: that.setDirty}))\n    @serialize() enabled = true\n\n    // private _defines: any = {\n    // }\n    private _uniforms: any = {\n        noiseBumpParams: {value: new Vector2()}, // u scale, v scale,\n        noiseBumpScale: {value: 0.05},\n        noiseBumpFlakeScale: {value: 1000.0},\n        noiseFlakeClamp: {value: 1.0},\n        noiseFlakeRadius: {value: 0.5},\n        flakeParams: {value: new Vector4(0, 1, 3, 0)},\n        flakeFallOffParams: {value: new Vector3(0, 1, 0)},\n        useColorFlakes: {value: false},\n    }\n\n    public static AddNoiseBumpMaterial(material: IMaterial, params?: IMaterialUserData['_noiseBumpMat']): boolean {\n        const ud = material?.userData\n        if (!ud) return false\n        if (!ud._noiseBumpMat) {\n            ud._noiseBumpMat = {}\n        }\n        const tf = ud._noiseBumpMat\n        tf.hasBump = true\n        if (tf.bumpNoiseParams === undefined) tf.bumpNoiseParams = new Vector2(0.5, 0.5)\n        if (tf.bumpScale === undefined) tf.bumpScale = 0.05\n        if (tf.flakeScale === undefined) tf.flakeScale = 0.05\n        if (tf.flakeClamp === undefined) tf.flakeClamp = 1\n        if (tf.flakeRadius === undefined) tf.flakeRadius = 0.3\n        if (tf.useColorFlakes === undefined) tf.useColorFlakes = false\n        if (tf.flakeParams === undefined) tf.flakeParams = new Vector4(0, 1, 3, 0)\n        if (tf.flakeFallOffParams === undefined) tf.flakeFallOffParams = new Vector3(0, 1, 0)\n        params && Object.assign(tf, params)\n        if (material.setDirty) material.setDirty()\n        return true\n    }\n\n    readonly materialExtension: MaterialExtension = {\n        parsFragmentSnippet: (_, material: PhysicalMaterial)=>{\n            if (this.isDisabled() || !material?.userData._noiseBumpMat?.hasBump) return ''\n            return NoiseBumpMaterialPluginPars\n        },\n        shaderExtender: (shader, material: PhysicalMaterial) => {\n            if (this.isDisabled() || !material?.userData._noiseBumpMat?.hasBump) return\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#glMarker beforeAccumulation', NoiseBumpMaterialPluginPatch, {prepend: true})\n            shader.defines && (shader.defines.USE_UV = '')\n            // @ts-expect-error this is not req anymore actually.\n            shader.extensionDerivatives = true\n        },\n        onObjectRender: (_: IObject3D, material) => {\n            const tfUd = material.userData._noiseBumpMat\n            if (!tfUd?.hasBump) return\n\n            if (Array.isArray(tfUd.bumpNoiseParams)) this._uniforms.noiseBumpParams.value.fromArray(tfUd.bumpNoiseParams)\n            else this._uniforms.noiseBumpParams.value.copy(tfUd.bumpNoiseParams)\n            this._uniforms.noiseBumpScale.value = tfUd.bumpScale\n            this._uniforms.noiseBumpFlakeScale.value = tfUd.flakeScale\n            this._uniforms.noiseFlakeClamp.value = tfUd.flakeClamp\n            this._uniforms.noiseFlakeRadius.value = tfUd.flakeRadius\n            if (Array.isArray(tfUd.flakeParams)) this._uniforms.flakeParams.value.fromArray(tfUd.flakeParams)\n            else this._uniforms.flakeParams.value.copy(tfUd.flakeParams)\n            if (Array.isArray(tfUd.flakeFallOffParams)) this._uniforms.flakeFallOffParams.value.fromArray(tfUd.flakeFallOffParams)\n            else this._uniforms.flakeFallOffParams.value.copy(tfUd.flakeFallOffParams)\n            this._uniforms.useColorFlakes.value = tfUd.useColorFlakes\n\n            updateMaterialDefines({\n                // ...this._defines,\n                ['NOISE_BUMP_MATERIAL_ENABLED']: +!this.isDisabled(),\n            }, material)\n        },\n        extraUniforms: {\n            // ...this._uniforms, // done in constructor\n        },\n        computeCacheKey: (material1: PhysicalMaterial) => {\n            return (this.isDisabled() ? '0' : '1') + (material1.userData._noiseBumpMat?.hasBump ? '1' : '0')\n        },\n        isCompatible: (material1: PhysicalMaterial) => material1.isPhysicalMaterial,\n        getUiConfig: material => { // todo use uiConfigMaterialExtension\n            const viewer = this._viewer!\n            if (material.userData._noiseBumpMat === undefined) material.userData._noiseBumpMat = {}\n            const state = material.userData._noiseBumpMat\n            const config: UiObjectConfig = {\n                type: 'folder',\n                label: 'SparkleBump (NoiseBump)',\n                onChange: (ev)=>{\n                    if (!ev.config) return\n                    this.setDirty()\n                },\n                children: [\n                    {\n                        type: 'checkbox',\n                        label: 'Enabled',\n                        get value() {\n                            return state.hasBump || false\n                        },\n                        set value(v) {\n                            if (v === state.hasBump) return\n                            if (v) {\n                                if (!NoiseBumpMaterialPlugin.AddNoiseBumpMaterial(material))\n                                    viewer.dialog.alert('Cannot add NoiseBumpMaterial.')\n                            } else {\n                                state.hasBump = false\n                                if (material.setDirty) material.setDirty()\n                            }\n                            config.uiRefresh?.(true, 'postFrame')\n                        },\n                    },\n                    {\n                        type: 'vec4',\n                        label: 'Bump Noise Params',\n                        bounds: [0, 1],\n                        hidden: () => !state.hasBump,\n                        property: [state, 'bumpNoiseParams'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Bump Scale',\n                        bounds: [0, 0.001],\n                        stepSize: 0.00001,\n                        hidden: () => !state.hasBump,\n                        property: [state, 'bumpScale'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Flake Scale',\n                        bounds: [100, 10000],\n                        stepSize: 0.0001,\n                        hidden: () => !state.hasBump,\n                        property: [state, 'flakeScale'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Flake Clamp',\n                        bounds: [0, 1],\n                        stepSize: 1,\n                        hidden: () => !state.hasBump,\n                        property: [state, 'flakeClamp'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Flake Radius',\n                        bounds: [0.01, 1],\n                        stepSize: 0.001,\n                        hidden: () => !state.hasBump,\n                        property: [state, 'flakeRadius'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Flake Roughness',\n                        bounds: [0., 1],\n                        stepSize: 0.01,\n                        hidden: () => !state.hasBump,\n                        property: [state.flakeParams, 'x'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Flake Metalness',\n                        bounds: [0., 1],\n                        stepSize: 0.01,\n                        hidden: () => !state.hasBump,\n                        property: [state.flakeParams, 'y'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Flake Strength',\n                        bounds: [0.0, 100],\n                        stepSize: 0.001,\n                        hidden: () => !state.hasBump,\n                        property: [state.flakeParams, 'z'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Flake Threshold',\n                        bounds: [0.1, 10],\n                        stepSize: 0.001,\n                        hidden: () => !state.hasBump,\n                        property: [state.flakeParams, 'w'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Falloff',\n                        stepSize: 1,\n                        bounds: [0, 1],\n                        hidden: () => !state.hasBump,\n                        property: [state.flakeFallOffParams, 'x'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Linear falloff factor',\n                        bounds: [0., 10],\n                        stepSize: 0.001,\n                        hidden: () => !state.hasBump,\n                        property: [state.flakeFallOffParams, 'y'],\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Quadratic falloff factor',\n                        bounds: [0., 10],\n                        stepSize: 0.001,\n                        hidden: () => !state.hasBump,\n                        property: [state.flakeFallOffParams, 'z'],\n                    },\n                    {\n                        type: 'checkbox',\n                        label: 'Colored Flakes',\n                        hidden: () => !state.hasBump,\n                        property: [state, 'useColorFlakes'],\n                    },\n                ],\n            }\n            return config\n        },\n\n    }\n\n    setDirty = (): void => {\n        this.materialExtension.setDirty?.()\n        this._viewer?.setDirty()\n    }\n\n    constructor() {\n        super()\n        Object.assign(this.materialExtension.extraUniforms!, this._uniforms)\n    }\n\n    onAdded(v: ThreeViewer) {\n        super.onAdded(v)\n        v.assetManager.materials.registerMaterialExtension(this.materialExtension)\n        v.assetManager.registerGltfExtension(noiseBumpMaterialGLTFExtension)\n    }\n\n    onRemove(v: ThreeViewer) {\n        v.assetManager.materials?.unregisterMaterialExtension(this.materialExtension)\n        v.assetManager.unregisterGltfExtension(noiseBumpMaterialGLTFExtension.name)\n        return super.onRemove(v)\n    }\n\n    /**\n     * @deprecated - use {@link noiseBumpMaterialGLTFExtension}\n     */\n    public static readonly NOISE_BUMP_MATERIAL_GLTF_EXTENSION = 'WEBGI_materials_noise_bump'\n\n}\n\ndeclare module '../../core/IMaterial' {\n    interface IMaterialUserData {\n        _noiseBumpMat?: {\n            hasBump?: boolean\n            bumpNoiseParams?: Vector2Tuple | Vector2\n            bumpScale?: number\n            flakeScale?: number\n            flakeClamp?: number\n            flakeRadius?: number\n            useColorFlakes?: boolean\n            flakeParams?: Vector4Tuple | Vector4\n            flakeFallOffParams?: Vector3Tuple | Vector3\n        }\n    }\n}\n\n/**\n * FragmentClipping Materials Extension\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_fragment_clipping_extension.html (todo - fix link)\n */\nclass GLTFMaterialsNoiseBumpMaterialImport implements GLTFLoaderPlugin {\n    public name: string\n    public parser: GLTFParser\n\n    constructor(parser: GLTFParser) {\n        this.parser = parser\n        this.name = noiseBumpMaterialGLTFExtension.name\n    }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n        const parser = this.parser\n        const materialDef = parser.json.materials[materialIndex]\n        if (!materialDef.extensions || !materialDef.extensions[this.name]) return\n        const extension = materialDef.extensions[this.name]\n        if (!materialParams.userData) materialParams.userData = {}\n        NoiseBumpMaterialPlugin.AddNoiseBumpMaterial(materialParams)\n        ThreeSerialization.Deserialize(extension, materialParams.userData._noiseBumpMat)\n    }\n}\n\nconst glTFMaterialsNoiseBumpMaterialExport = (w: GLTFWriter2)=> ({\n    writeMaterial: (material: any, materialDef: any) => {\n        if (!material.isMeshStandardMaterial || !material.userData._noiseBumpMat?.hasBump) return\n        materialDef.extensions = materialDef.extensions || {}\n\n        const extensionDef: any = ThreeSerialization.Serialize(material.userData._noiseBumpMat)\n\n        materialDef.extensions[ noiseBumpMaterialGLTFExtension.name ] = extensionDef\n        w.extensionsUsed[ noiseBumpMaterialGLTFExtension.name ] = true\n    },\n})\n\nexport const noiseBumpMaterialGLTFExtension = {\n    name: 'WEBGI_materials_noise_bump',\n    import: (p) => new GLTFMaterialsNoiseBumpMaterialImport(p),\n    export: glTFMaterialsNoiseBumpMaterialExport,\n    textures: undefined,\n} satisfies AssetManager['gltfExtensions'][number]\n\n","#if defined(CUSTOM_BUMP_MAP_ENABLED) && CUSTOM_BUMP_MAP_ENABLED > 0\n\n#if CUSTOM_BUMP_MAP_BICUBIC > 0  // from http://www.java-gaming.org/index.php?topic=35123.0\nvec4 cubic_cb(float v){\n    vec4 n = vec4(1.0, 2.0, 3.0, 4.0) - v;\n    vec4 s = n * n * n;\n    float x = s.x;\n    float y = s.y - 4.0 * s.x;\n    float z = s.z - 4.0 * s.y + 6.0 * s.x;\n    float w = 6.0 - x - y - z;\n    return vec4(x, y, z, w) * (1.0/6.0);\n}\n\nvec4 textureBicubic_cb(sampler2D sampler, vec2 texCoords){\n\n    vec2 texSize = vec2(textureSize(sampler, 0));\n    vec2 invTexSize = 1.0 / texSize;\n\n    texCoords = texCoords * texSize - 0.5;\n\n    vec2 fxy = fract(texCoords);\n    texCoords -= fxy;\n\n    vec4 xcubic = cubic_cb(fxy.x);\n    vec4 ycubic = cubic_cb(fxy.y);\n\n    vec4 c = texCoords.xxyy + vec2 (-0.5, +1.5).xyxy;\n\n    vec4 s = vec4(xcubic.xz + xcubic.yw, ycubic.xz + ycubic.yw);\n    vec4 offset = c + vec4 (xcubic.yw, ycubic.yw) / s;\n\n    offset *= invTexSize.xxyy;\n\n    vec4 sample0 = texture(sampler, offset.xz);\n    vec4 sample1 = texture(sampler, offset.yz);\n    vec4 sample2 = texture(sampler, offset.xw);\n    vec4 sample3 = texture(sampler, offset.yw);\n\n    float sx = s.x / (s.x + s.y);\n    float sy = s.z / (s.z + s.w);\n\n    return mix(\n    mix(sample3, sample2, sx), mix(sample1, sample0, sx)\n    , sy);\n}\n#endif\n\nvarying vec2 vCustomBumpUv;\nuniform sampler2D customBumpMap;\nuniform float customBumpScale;\n\n// same as bumpmap_pars_fragment, but with customBumpMap, customBumpUv and bicubic\nvec2 dHdxy_fwd_cb() {\n\n    vec2 dSTdx = dFdx( vCustomBumpUv );\n    vec2 dSTdy = dFdy( vCustomBumpUv );\n\n    #if CUSTOM_BUMP_MAP_BICUBIC > 0\n    float Hll = customBumpScale * textureBicubic_cb( customBumpMap, vCustomBumpUv ).x;\n    float dBx = customBumpScale * textureBicubic_cb( customBumpMap, vCustomBumpUv + dSTdx ).x - Hll;\n    float dBy = customBumpScale * textureBicubic_cb( customBumpMap, vCustomBumpUv + dSTdy ).x - Hll;\n    #else\n    float Hll = customBumpScale * texture2D( customBumpMap, vCustomBumpUv ).x;\n    float dBx = customBumpScale * texture2D( customBumpMap, vCustomBumpUv + dSTdx ).x - Hll;\n    float dBy = customBumpScale * texture2D( customBumpMap, vCustomBumpUv + dSTdy ).x - Hll;\n    #endif\n\n    return vec2( dBx, dBy );\n\n}\n#ifndef USE_BUMPMAP\nvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\n    #ifdef BUMP_MAP_SCALE_LEGACY\n    vec3 vSigmaX = ( dFdx( surf_pos.xyz ) );\n    vec3 vSigmaY = ( dFdy( surf_pos.xyz ) );\n    #else\n    // normalize is done to ensure that the bump map looks the same regardless of the texture's scale\n    vec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n    vec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n    #endif\n\n    vec3 vN = surf_norm; // normalized\n\n    vec3 R1 = cross( vSigmaY, vN );\n    vec3 R2 = cross( vN, vSigmaX );\n\n    float fDet = dot( vSigmaX, R1 ) * faceDirection;\n\n    vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n    return normalize( abs( fDet ) * surf_norm - vGrad );\n\n}\n#endif\n#endif\n","import {Matrix3, SRGBColorSpace} from 'three'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {serialize} from 'ts-browser-helpers'\nimport {IMaterial, IObject3D, ITexture, PhysicalMaterial} from '../../core'\nimport {MaterialExtension, updateMaterialDefines} from '../../materials'\nimport {isNonRelativeUrl, shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {AssetManager, GLTFWriter2} from '../../assetmanager'\nimport type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport CustomBumpMapPluginShader from './shaders/CustomBumpMapPlugin.glsl'\nimport {matDefine} from '../../three'\nimport {makeSamplerUi} from '../../ui/image-ui'\n\n/**\n * Custom Bump Map Plugin\n * Adds a material extension to PhysicalMaterial to support custom bump maps.\n * A Custom bump map is similar to the built-in bump map, but allows using an extra bump map and scale to give a combined effect.\n * This plugin also has support for bicubic filtering of the custom bump map and is enabled by default.\n * It also adds a UI to the material to edit the settings.\n * It uses WEBGI_materials_custom_bump_map glTF extension to save the settings in glTF files.\n * @category Plugins\n */\n@uiFolderContainer('Custom BumpMap (MatExt)')\nexport class CustomBumpMapPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'CustomBumpMapPlugin'\n\n    @uiToggle('Enabled', (that: CustomBumpMapPlugin)=>({onChange: that.setDirty}))\n    @serialize() enabled = true\n\n    @uiToggle('Bicubic', (that: CustomBumpMapPlugin)=>({onChange: that.setDirty}))\n    @matDefine('CUSTOM_BUMP_MAP_BICUBIC', undefined, true, CustomBumpMapPlugin.prototype.setDirty)\n    @serialize() bicubicFiltering = true\n\n    private _defines: any = {\n        ['CUSTOM_BUMP_MAP_DEBUG']: false,\n        ['CUSTOM_BUMP_MAP_BICUBIC']: true,\n    }\n    private _uniforms: any = {\n        customBumpUvTransform: {value: new Matrix3()},\n        customBumpScale: {value: 0.001},\n        customBumpMap: {value: null},\n    }\n\n    public enableCustomBump(material: IMaterial, map?: ITexture, scale?: number): boolean {\n        const ud = material?.userData\n        if (!ud) return false\n        if (ud._hasCustomBump === undefined) {\n            const meshes = material.appliedMeshes\n            let possible = true\n            if (meshes) for (const {geometry} of meshes) {\n                if (geometry && (!geometry.attributes.position || !geometry.attributes.normal || !geometry.attributes.uv)) {\n                    possible = false\n                }\n                // if (possible && !geometry.attributes.tangent) {\n                //     geometry.computeTangents()\n                // }\n            }\n            if (!possible) {\n                return false\n            }\n        }\n        ud._hasCustomBump = true\n        ud._customBumpScale = scale ?? ud._customBumpScale ?? 0.001\n        ud._customBumpMap = map ?? ud._customBumpMap ?? null\n        if (material.setDirty) material.setDirty()\n        return true\n    }\n\n    readonly materialExtension: MaterialExtension = {\n        parsFragmentSnippet: (_, material: PhysicalMaterial)=>{\n            if (this.isDisabled() || !material?.userData._hasCustomBump) return ''\n            return CustomBumpMapPluginShader\n        },\n        shaderExtender: (shader, material: PhysicalMaterial) => {\n            if (this.isDisabled() || !material?.userData._hasCustomBump) return\n            const customBumpMap = material.userData._customBumpMap\n            if (!customBumpMap) return\n\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#glMarker beforeAccumulation',\n                `\n#if defined(CUSTOM_BUMP_MAP_ENABLED) && CUSTOM_BUMP_MAP_ENABLED > 0\n    normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd_cb(), faceDirection );\n#endif\n                `, {prepend: true}\n            )\n\n            shader.vertexShader = shaderReplaceString(shader.vertexShader, '#include <uv_pars_vertex>',\n                `\n#if defined(CUSTOM_BUMP_MAP_ENABLED) && CUSTOM_BUMP_MAP_ENABLED > 0\n    varying vec2 vCustomBumpUv;\n    uniform mat3 customBumpUvTransform;\n#endif\n                `, {prepend: true},\n            )\n            shader.vertexShader = shaderReplaceString(shader.vertexShader, '#include <uv_vertex>',\n                `\n#if defined(CUSTOM_BUMP_MAP_ENABLED) && CUSTOM_BUMP_MAP_ENABLED > 0\n    vCustomBumpUv = ( customBumpUvTransform * vec3( uv, 1 ) ).xy;\n#endif\n                `, {prepend: true},\n            )\n\n            shader.defines && (shader.defines.USE_UV = '')\n        },\n        onObjectRender: (object: IObject3D, material) => {\n            const userData = material.userData\n            if (!userData?._hasCustomBump) return\n            if (!object.isMesh || !object.geometry) return\n            const tex = userData._customBumpMap?.isTexture ? userData._customBumpMap : null\n            this._uniforms.customBumpMap.value = tex\n            this._uniforms.customBumpScale.value = tex ? userData._customBumpScale ?? 0 : 0\n            if (tex) {\n                tex.updateMatrix()\n                this._uniforms.customBumpUvTransform.value.copy(tex.matrix)\n            }\n            updateMaterialDefines({\n                ...this._defines,\n                ['CUSTOM_BUMP_MAP_ENABLED']: +this.enabled,\n            }, material)\n        },\n        extraUniforms: {\n            // ...this._uniforms, // done in constructor\n        },\n        computeCacheKey: (material1: PhysicalMaterial) => {\n            return (this.enabled ? '1' : '0') + (material1.userData._hasCustomBump ? '1' : '0') + material1.userData?._customBumpMap?.uuid\n        },\n        isCompatible: (material1: PhysicalMaterial) => material1.isPhysicalMaterial,\n        getUiConfig: material => { // todo use uiConfigMaterialExtension\n            const viewer = this._viewer!\n            const enableCustomBump = this.enableCustomBump.bind(this)\n            const state = material.userData\n            const config: UiObjectConfig = {\n                type: 'folder',\n                label: 'CustomBumpMap',\n                onChange: (ev)=>{\n                    if (!ev.config) return\n                    this.setDirty()\n                },\n                children: [\n                    {\n                        type: 'checkbox',\n                        label: 'Enabled',\n                        get value() {\n                            return state._hasCustomBump || false\n                        },\n                        set value(v) {\n                            if (v === state._hasCustomBump) return\n                            if (v) {\n                                if (!enableCustomBump(material))\n                                    viewer.dialog.alert('CustomBumpMapPlugin - Cannot add CustomBumpMap.')\n                            } else {\n                                state._hasCustomBump = false\n                                if (material.setDirty) material.setDirty()\n                            }\n                            config.uiRefresh?.(true, 'postFrame')\n                        },\n                    },\n                    {\n                        type: 'slider',\n                        label: 'Bump Scale',\n                        bounds: [-20, 20],\n                        stepSize: 0.001,\n                        hidden: () => !state._hasCustomBump,\n                        property: [state, '_customBumpScale'],\n                        // onChange: this.setDirty,\n                    },\n                    {\n                        type: 'image',\n                        label: 'Bump Map',\n                        hidden: () => !state._hasCustomBump,\n                        property: [state, '_customBumpMap'],\n                        onChange: ()=>{\n                            if (material.setDirty) material.setDirty()\n                        },\n                    },\n                    makeSamplerUi(state as any, '_customBumpMap', 'Sampler', ()=>!state._hasCustomBump, ()=>material.setDirty && material.setDirty()),\n                ],\n            }\n            return config\n        },\n\n    }\n\n    setDirty = (): void => {\n        this.materialExtension.setDirty?.()\n        this._viewer?.setDirty()\n    }\n\n    constructor() {\n        super()\n        Object.assign(this.materialExtension.extraUniforms!, this._uniforms)\n    }\n\n    onAdded(v: ThreeViewer) {\n        super.onAdded(v)\n        // v.addEventListener('preRender', this._preRender)\n        v.assetManager.materials.registerMaterialExtension(this.materialExtension)\n        v.assetManager.registerGltfExtension(customBumpMapGLTFExtension)\n        // v.getPlugin(GBufferPlugin)?.material?.registerMaterialExtensions([this.materialExtension])\n    }\n\n    onRemove(v: ThreeViewer) {\n        v.assetManager.materials?.unregisterMaterialExtension(this.materialExtension)\n        v.assetManager.unregisterGltfExtension(customBumpMapGLTFExtension.name)\n        // v.getPlugin(GBufferPlugin)?.material?.unregisterMaterialExtensions([this.materialExtension])\n        return super.onRemove(v)\n    }\n\n    /**\n     * @deprecated use {@link customBumpMapGLTFExtension}\n     */\n    public static readonly CUSTOM_BUMP_MAP_GLTF_EXTENSION = 'WEBGI_materials_custom_bump_map'\n\n}\n\ndeclare module '../../core/IMaterial' {\n    interface IMaterialUserData {\n        _hasCustomBump?: boolean\n        _customBumpMap?: ITexture | null\n        _customBumpScale?: number\n    }\n}\n\n\n/**\n * FragmentClipping Materials Extension\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_fragment_clipping_extension.html\n */\nclass GLTFMaterialsCustomBumpMapImport implements GLTFLoaderPlugin {\n    public name: string\n    public parser: GLTFParser\n\n    constructor(parser: GLTFParser, private _viewer?: ThreeViewer) {\n        this.parser = parser\n        this.name = customBumpMapGLTFExtension.name\n    }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n        const parser = this.parser\n        const materialDef = parser.json.materials[materialIndex]\n        if (!materialDef.extensions || !materialDef.extensions[this.name]) return\n        const extension = materialDef.extensions[this.name]\n\n        if (!materialParams.userData) materialParams.userData = {}\n        materialParams.userData._hasCustomBump = true // single _ so that its saved when cloning but not when saving\n        materialParams.userData._customBumpScale = extension.customBumpScale ?? 0.0\n\n        const resources = extension.resources ? await this._viewer?.loadConfigResources(extension.resources) : undefined\n\n        const pending = []\n        const tex = extension.customBumpMap\n        if (tex) {\n            if (tex && tex.resource && typeof tex.resource === 'string') {\n                materialParams.userData._customBumpMap = ThreeSerialization.Deserialize(tex, null, resources, false)\n            } else if (tex && tex.index !== undefined) {\n                pending.push(parser.assignTexture(materialParams.userData, '_customBumpMap', tex).then((t: any) => {\n                    // t.format = RGBFormat\n                    t.colorSpace = SRGBColorSpace\n                }))\n            } else {\n                console.warn('CustomBumpMapPlugin: Invalid Texture Map in extension', tex, materialDef.name)\n                materialParams.userData._customBumpMap = null\n            }\n        }\n        return Promise.all(pending)\n    }\n\n    // do any mesh or geometry processing here\n    // afterRoot(result: GLTF): Promise<void> | null {\n    //     result.scene.traverse((object: any) => {\n    //         const mat = object.material?.userData?._hasCustomBump\n    //         if (!mat) return\n    //         const geom = object.geometry\n    //         if (!geom.attributes.tangent) {\n    //             geom.computeTangents()\n    //             geom.attributes.tangent.needsUpdate = true\n    //         }\n    //     })\n    //     return null\n    // }\n}\n\nconst glTFMaterialsCustomBumpMapExport = (w: GLTFWriter2)=> ({\n    writeMaterial: (material: any, materialDef: any) => {\n        if (!material.isMeshStandardMaterial || !material.userData._hasCustomBump) return\n        if ((material.userData._customBumpScale || 0) < 0.001) return // todo: is this correct?\n\n        materialDef.extensions = materialDef.extensions || {}\n\n        const meta = {images: {}, textures: {}}\n        const extensionDef: any = {}\n\n        extensionDef.customBumpScale = material.userData._customBumpScale || 1.0\n\n        const rootPath = material.userData._customBumpMap?.userData.rootPath\n        // this is required because gltf transform doesnt support data uris or external urls\n        if (rootPath && isNonRelativeUrl(rootPath)) {\n            extensionDef.customBumpMap = ThreeSerialization.Serialize(material.userData._customBumpMap, meta, false)\n        }\n\n        if (w.checkEmptyMap(material.userData._customBumpMap) && extensionDef.customBumpMap === undefined) {\n\n            const customBumpMapDef = {index: w.processTexture(material.userData._customBumpMap)}\n            w.applyTextureTransform(customBumpMapDef, material.userData._customBumpMap)\n            extensionDef.customBumpMap = customBumpMapDef\n\n        }\n\n        if (Object.keys(meta.textures).length || Object.keys(meta.images).length)\n            extensionDef.resources = meta\n\n        materialDef.extensions[ customBumpMapGLTFExtension.name ] = extensionDef\n        w.extensionsUsed[ customBumpMapGLTFExtension.name ] = true\n    },\n})\n\nexport const customBumpMapGLTFExtension = {\n    name: 'WEBGI_materials_custom_bump_map',\n    import: (p, v) => new GLTFMaterialsCustomBumpMapImport(p, v),\n    export: glTFMaterialsCustomBumpMapExport,\n    textures: {\n        customBumpMap: 'RGB',\n    },\n} satisfies AssetManager['gltfExtensions'][number]\n","\n#ifdef USE_BUMPMAP\n\nmat3 mat3_inverse( mat3 A )\n{\n    mat3 M_t = mat3(\n    vec3( A[0][0], A[1][0], A[2][0] ),\n    vec3( A[0][1], A[1][1], A[2][1] ),\n    vec3( A[0][2], A[1][2], A[2][2] ) );\n    float det = dot( cross( M_t[0], M_t[1] ), M_t[2] );\n    mat3 adjugate = mat3( cross( M_t[1], M_t[2] ),\n    cross( M_t[2], M_t[0] ),\n    cross( M_t[0], M_t[1] ) );\n    return adjugate / det;\n}\n\n\nfloat CalculateHeight( in vec2 texCoords )\n{\n    float height = texture2D( bumpMap, texCoords ).x;\n    return clamp( height, 0.0, 1.0 );\n}\n\nconst vec2 bumpMapSize = vec2(512, 512);\n// Return normal in tangent space from normal map if available or bump map\nvec3 CalculateNormal( in vec2 texCoords )\n{\n    #if defined( TANGENTSPACE_NORMALMAP ) && 0 //todo: fix. not working properly.\n    vec3  mapN = texture2D( normalMap, texCoords ).xyz;\n    mapN.xy *= normalScale;\n    return normalize( mapN );\n    #else\n    vec2 texOffs = 1.0 / bumpMapSize;\n    #if PARALLAX_NORMAL_MAP_QUALITY > 0\n    float hx[9];\n    hx[0] = texture2D( bumpMap, texCoords.st + texOffs * vec2(-1.0, -1.0) ).r;\n    hx[1] = texture2D( bumpMap, texCoords.st + texOffs * vec2( 0.0, -1.0) ).r;\n    hx[2] = texture2D( bumpMap, texCoords.st + texOffs * vec2( 1.0, -1.0) ).r;\n    hx[3] = texture2D( bumpMap, texCoords.st + texOffs * vec2(-1.0,  0.0) ).r;\n    hx[4] = texture2D( bumpMap, texCoords.st ).r;\n    hx[5] = texture2D( bumpMap, texCoords.st + texOffs * vec2( 1.0, 0.0) ).r;\n    hx[6] = texture2D( bumpMap, texCoords.st + texOffs * vec2(-1.0, 1.0) ).r;\n    hx[7] = texture2D( bumpMap, texCoords.st + texOffs * vec2( 0.0, 1.0) ).r;\n    hx[8] = texture2D( bumpMap, texCoords.st + texOffs * vec2( 1.0, 1.0) ).r;\n    vec2  deltaH = vec2(hx[0]-hx[2] + 2.0*(hx[3]-hx[5]) + hx[6]-hx[8], hx[0]-hx[6] + 2.0*(hx[1]-hx[7]) + hx[2]-hx[8]);\n    #else\n    float h_xa   = texture2D( bumpMap, texCoords.st + texOffs * vec2(-1.0,  0.0) ).r;\n    float h_xb   = texture2D( bumpMap, texCoords.st + texOffs * vec2( 1.0,  0.0) ).r;\n    float h_ya   = texture2D( bumpMap, texCoords.st + texOffs * vec2( 0.0, -1.0) ).r;\n    float h_yb   = texture2D( bumpMap, texCoords.st + texOffs * vec2( 0.0,  1.0) ).r;\n    vec2  deltaH = vec2(h_xa-h_xb, h_ya-h_yb);\n    #endif\n    return normalize( vec3( deltaH / texOffs, 1.0 ) );\n    #endif\n}\n\n//https://github.com/Rabbid76/graphics-snippets/blob/master/html/technique/parallax_005_parallax_relief_mapping_derivative_tbn.html\n//https://web.archive.org/web/20190128023901/http://sunandblackcat.com/tipFullView.php?topicid=28\nvec3 ReliefParallax( in float frontFace, in vec3 texDir3D, in vec2 texCoord )\n{\n    float surf_sign       = frontFace;\n    float back_face       = step(0.0, -surf_sign);\n    vec2  texStep         = surf_sign * texDir3D.xy / abs(texDir3D.z); // (z is negative) the direction vector points downwards in tangent-space\n    vec2  texC            = texCoord.st + surf_sign * texStep + back_face * texStep.xy;\n    float mapHeight       = 1.0;\n    float bumpHeightStep  = 1.0 / float(PARALLAX_MAP_STEPS);\n    float bestBumpHeight  = mapHeight+bumpHeightStep;\n\n    #pragma unroll_loop_start\n    for ( int i = 0 ; i < PARALLAX_MAP_STEPS ; i ++ ) {\n\n        if ( mapHeight < bestBumpHeight )\n        {\n            bestBumpHeight -= bumpHeightStep;\n            mapHeight = back_face + surf_sign * CalculateHeight(texC.xy - bestBumpHeight * texStep.xy);\n        }\n\n    }\n    #pragma unroll_loop_end\n\n    bestBumpHeight += bumpHeightStep;\n\n    #pragma unroll_loop_start\n    for ( int i = 0; i < PARALLAX_MAP_B_STEPS ; i ++ ) {\n\n        bumpHeightStep *= 0.5;\n        bestBumpHeight -= bumpHeightStep;\n        mapHeight       = back_face + surf_sign * CalculateHeight( texC.xy - bestBumpHeight * texStep.xy );\n        bestBumpHeight += ( bestBumpHeight < mapHeight ) ? bumpHeightStep : 0.0;\n\n    }\n    #pragma unroll_loop_end\n\n    bestBumpHeight -= bumpHeightStep * clamp( ( bestBumpHeight - mapHeight ) / bumpHeightStep, 0.0, 1.0 );\n    mapHeight       = bestBumpHeight;\n    texC           -= mapHeight * texStep;\n\n    return vec3( texC.xy, mapHeight );\n}\n\nvec3 reliefParallaxPerturbNormal(in float faceDirection, inout vec3 normal){\n    if(abs(bumpScale) < 0.001) return vec3(vBumpMapUv, 0.);\n\n    //    #ifdef DOUBLE_SIDED\n    //\n    //    normal = normal * faceDirection;\n    //\n    //    #endif\n\n    float parallaxHeight;\n\n    vec2  texCoords     = vBumpMapUv;\n    float face_sign     = sign(dot(normal, vViewPosition));\n\n    // Followup: Normal Mapping Without Precomputed Tangents [http://www.thetenthplanet.de/archives/1180]\n    vec3  N             = normalize(normal);\n    vec3  dp1           = dFdx(-vViewPosition);\n    vec3  dp2           = dFdy(-vViewPosition);\n    vec2  duv1          = dFdx(vBumpMapUv);\n    vec2  duv2          = dFdy(vBumpMapUv);\n    vec3  dp2perp       = cross(dp2, N);\n    vec3  dp1perp       = cross(N, dp1);\n    vec3  T             = dp2perp * duv1.x + dp1perp * duv2.x;\n    vec3  B             = dp2perp * duv1.y + dp1perp * duv2.y;\n    float invmax        = inversesqrt(max(dot(T, T), dot(B, B)));\n    mat3 tbnMat        = mat3(T * invmax, B * invmax, N * bumpScale);\n\n    vec3 tangentPos = normalize(mat3_inverse(tbnMat) * -vViewPosition);\n\n    // vec2 parallaxUv = parallaxMapping(tangentPos, vBumpMapUv, parallaxHeight);\n    vec3 parallaxUv = ReliefParallax(face_sign, tangentPos, vBumpMapUv);\n\n    tbnMat[2] = face_sign * N / bumpScale;\n\n    normal = normalize(tbnMat * CalculateNormal(parallaxUv.xy).xyz);\n\n    //todo test this.\n    #ifdef FLIP_SIDED\n\n    normal = - normal;\n\n    #endif\n\n    //    #ifdef DOUBLE_SIDED\n    //\n    //    normal = normal * faceDirection;\n    //\n    //    #endif\n\n    // normal = geometryNormal;\n\n    // todo: modify geometryPosition (vViewPosition) for point, spot and area lights\n\n    return parallaxUv;\n}\n\n#endif // USE_BUMPMAP\n","import {MaterialExtension, updateMaterialDefines} from '../../materials'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {onChange, serialize} from 'ts-browser-helpers'\nimport {uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {shaderReplaceString} from '../../utils'\nimport {ShaderChunk} from 'three'\nimport {PhysicalMaterial} from '../../core'\nimport ParallaxMappingPluginReliefShader from './shaders/ParallaxMappingPlugin.relief.glsl'\n\n/**\n * Parallax Mapping Plugin\n * Adds a material extension to PhysicalMaterial which parallax mapping to bump map in the material.\n * This is a port of Relief Parallax Mapping from [Rabbid76/graphics-snippets](https://github.com/Rabbid76/graphics-snippets/blob/master/html/technique/parallax_005_parallax_relief_mapping_derivative_tbn.html)\n * @category Plugins\n */\n@uiFolderContainer('Parallax Bump Mapping (MatExt)')\nexport class ParallaxMappingPlugin extends AViewerPluginSync {\n    public static PluginType = 'ReliefParallaxMapping'\n\n    @onChange(ParallaxMappingPlugin.prototype._updateExtension)\n    @serialize()\n    @uiToggle('Enabled') enabled = true\n\n    @uiSlider('Step count', [1, 32], 1)\n    @onChange(ParallaxMappingPlugin.prototype._updateExtension)\n    @serialize() stepCount = 12\n\n    @uiSlider('Binary search steps', [1, 8], 1)\n    @onChange(ParallaxMappingPlugin.prototype._updateExtension)\n    @serialize() binaryStepCount = 3\n\n    @onChange(ParallaxMappingPlugin.prototype._updateExtension)\n    @uiToggle('Debug Normals') debugNormals = false\n    @onChange(ParallaxMappingPlugin.prototype._updateExtension)\n    @uiToggle('Debug Hit Height') debugHitHeight = false\n\n    private _defines: any = {\n        ['PARALLAX_NORMAL_MAP_QUALITY']: 0,\n    }\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n        this._updateExtension = this._updateExtension.bind(this)\n    }\n\n    private _updateExtension() {\n        this._bumpMapExtension?.setDirty?.()\n        this._viewer?.setDirty()\n    }\n    private _bumpMapExtension: MaterialExtension = {\n        shaderExtender: (shader, material, _renderer) => {\n            if (!material.bumpMap || this.isDisabled()) return\n\n            shader.fragmentShader = shader.fragmentShader.replace('#include <normal_fragment_begin>', '')\n            shader.fragmentShader = shader.fragmentShader.replace('#include <normal_fragment_maps>', '')\n\n            shader.fragmentShader = shader.fragmentShader.replace('#include <map_fragment>',\n                '#include <normal_fragment_begin>\\n#include <normal_fragment_maps>\\n#include <map_fragment>')\n\n            for (const s of ['map_fragment', 'alphamap_fragment', 'roughnessmap_fragment', 'metalnessmap_fragment', 'emissivemap_fragment', 'transmission_fragment']) {\n                shader.fragmentShader = shaderReplaceString(shader.fragmentShader, `#include <${s}>`,\n                    (ShaderChunk as any)[s].replace(/\\bv\\w+Uv\\b/g, 'parallaxUv.xy', {replaceAll: true})\n                )\n            }\n\n            if (this.debugNormals || this.debugHitHeight)\n                shader.fragmentShader = shaderReplaceString(shader.fragmentShader,\n                    // .replace('texture2D( map, parallaxUv.xy )', 'texture2D( map, parallaxUv.xy )')\n                    'texture2D( map, parallaxUv.xy )',\n                    this.debugNormals ? 'vec4(normal, 1.); normal = nonPerturbedNormal' : 'vec4(parallaxUv.z,0., 0., 1.)')\n\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#include <normal_fragment_maps>',\n                shaderReplaceString(\n                    shaderReplaceString(\n                        ShaderChunk.normal_fragment_maps,\n                        '#elif defined( USE_NORMALMAP_TANGENTSPACE )', '#elif defined( USE_NORMALMAP_TANGENTSPACE ) && !defined( USE_BUMPMAP )'),\n                    'normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );',\n                    // 'diffuseColor.rgb = vec3(0, dHdxy_fwd());'\n                    // 'diffuseColor.rgb = CalculateNormal(vUv).rgb;'\n                    'vec3 parallaxUv = reliefParallaxPerturbNormal(faceDirection, normal);'\n                )\n            )\n        },\n        parsFragmentSnippet: ()=> {\n            return this.isDisabled() ? '' : (ParallaxMappingPluginReliefShader + '\\n')\n                .replaceAll('PARALLAX_MAP_STEPS', this.stepCount.toString()) // replacing here to unroll for loop.\n                .replaceAll('PARALLAX_MAP_B_STEPS', this.binaryStepCount.toString())\n        },\n        isCompatible: (material: PhysicalMaterial) => {\n            return material.isPhysicalMaterial\n        },\n        computeCacheKey: material => {\n            return '' + !this.isDisabled() + material.bumpMap?.uuid + this.debugNormals + this.debugHitHeight + this.stepCount.toString() + this.binaryStepCount.toString()\n        },\n        onObjectRender: (_object, material, _renderer) => {\n            if (this.isDisabled()) return // todo: use extraDefines\n            updateMaterialDefines({\n                ...this._defines,\n            }, material)\n        },\n    } as MaterialExtension\n\n    onAdded(viewer: ThreeViewer) {\n        viewer.materialManager.registerMaterialExtension(this._bumpMapExtension)\n        return super.onAdded(viewer)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.materialManager.unregisterMaterialExtension(this._bumpMapExtension)\n        return super.onRemove(viewer)\n    }\n\n}\n","#include <simpleCameraHelpers>\nuniform vec4 fragClippingPosition;\nuniform vec4 fragClippingParams;\nuniform float fragClippingCamAspect;\n#if FRAG_CLIPPING_MODE == FragmentClippingMode.Circle\nfloat fragClippingCircle(){\n    vec2 pos = viewToScreen(vViewPosition.xyz).xy;\n    float radius = fragClippingParams.x;\n    vec2 center = fragClippingPosition.xy;\n    pos.y /= fragClippingCamAspect;\n    center.y /= fragClippingCamAspect;\n    return length(pos - center) - radius;\n}\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Ellipse\nfloat fragClippingEllipse(){\n    vec2 pos = viewToScreen(vViewPosition.xyz).xy;\n    vec2 radius = fragClippingParams.xy;\n    vec2 center = fragClippingPosition.xy;\n    pos.y /= fragClippingCamAspect;\n    center.y /= fragClippingCamAspect;\n    return length((pos - center) / radius) - 1.0;\n}\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Rectangle\nfloat fragClippingRectangle(){\n    vec2 pos = viewToScreen(vViewPosition.xyz).xy;\n    vec2 radius = fragClippingParams.xy;\n    vec2 center = fragClippingPosition.xy;\n    pos.y /= fragClippingCamAspect;\n    center.y /= fragClippingCamAspect;\n    vec2 d = abs(pos - center) - radius;\n    return min(max(d.x,d.y),0.0) + length(max(d,0.0));\n}\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Plane\nfloat fragClippingPlane(){\n    vec3 pos = vViewPosition.xyz;\n    vec3 normal = fragClippingParams.xyz;\n    float d = dot(pos, normal) - fragClippingParams.w;\n    return d;\n}\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Sphere\nfloat fragClippingSphere(){\n    vec3 pos = vViewPosition.xyz;\n    vec3 center = fragClippingPosition.xyz;\n    float radius = fragClippingParams.x;\n    pos.y /= fragClippingCamAspect;\n    center.y /= fragClippingCamAspect;\n    return length(pos - center) - radius;\n}\n#endif\n","float fragClippingDist = 0.0;\n#if FRAG_CLIPPING_MODE == FragmentClippingMode.Circle\nfragClippingDist = fragClippingCircle();\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Ellipse\nfragClippingDist = fragClippingEllipse();\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Rectangle\nfragClippingDist = fragClippingRectangle();\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Plane\nfragClippingDist = fragClippingPlane();\n#elif FRAG_CLIPPING_MODE == FragmentClippingMode.Sphere\nfragClippingDist = fragClippingSphere();\n#endif\n#if FRAG_CLIPPING_DEBUG\ngl_FragColor = vec4(max(fragClippingDist, 0.0), 0.0, 0.0, 1.0);\n//    gl_FragColor = vec4(vViewPosition.xyz, 1.0);\n#include <colorspace_fragment>\nreturn;\n#endif\n\n#if FRAG_CLIPPING_INVERSE == 1\nif (fragClippingDist > 0.0) discard;\n#else\nif (fragClippingDist < 0.0) discard;\n#endif\n","import {Matrix3, Plane as PlaneThree, Vector4, Vector4Tuple} from 'three'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {serialize} from 'ts-browser-helpers'\nimport {IMaterial, IMaterialUserData, IObject3D, PhysicalMaterial} from '../../core'\nimport {MaterialExtension, updateMaterialDefines} from '../../materials'\nimport {shaderReplaceString, ThreeSerialization} from '../../utils'\nimport {AssetManager, GLTFWriter2} from '../../assetmanager'\nimport type {GLTFLoaderPlugin, GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport FragmentClippingExtensionPluginPars from './shaders/FragmentClippingExtensionPlugin.pars.glsl'\nimport FragmentClippingExtensionPluginPatch from './shaders/FragmentClippingExtensionPlugin.patch.glsl'\n\n/**\n * FragmentClipping Materials Extension\n * Adds a material extension to PhysicalMaterial to add support for fragment clipping.\n * Fragment clipping allows to clip fragments of the material in screen space or world space based on a circle, rectangle, plane, sphere, etc.\n * It uses fixed SDFs with params defined by the user for clipping.\n * It also adds a UI to the material to edit the settings.\n * It uses `WEBGI_materials_fragment_clipping_extension` glTF extension to save the settings in glTF files.\n * @category Plugins\n */\n@uiFolderContainer('Fragment Clipping (MatExt)')\nexport class FragmentClippingExtensionPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'FragmentClippingExtensionPlugin1'\n\n    @uiToggle('Enabled', (that: FragmentClippingExtensionPlugin)=>({onChange: that.setDirty}))\n    @serialize() enabled = true\n\n    private _defines: any = {\n        ['FRAG_CLIPPING_DEBUG']: 0,\n    }\n    private _uniforms: any = {\n        fragClippingPosition: {value: new Vector4()}, // point on plane, center of sphere, center of cylinder, etc\n        fragClippingParams: {value: new Vector4()}, // normal of plane, radius of sphere, radius of cylinder, etc\n        fragClippingCamAspect: {value: 1},\n    }\n\n    public static AddFragmentClipping(material: IMaterial, params?: IMaterialUserData['_fragmentClippingExt']): boolean {\n        const ud = material?.userData\n        if (!ud) return false\n        if (!ud._fragmentClippingExt) {\n            ud._fragmentClippingExt = {}\n        }\n        const tf = ud._fragmentClippingExt\n        tf.clipEnabled = true\n        if (tf.clipPosition === undefined) tf.clipPosition = [0, 0, 0, 0]\n        if (tf.clipParams === undefined) tf.clipParams = [0, 0, 0, 0]\n        if (tf.clipMode === undefined !== undefined) tf.clipMode = FragmentClippingMode.Circle\n        if (tf.clipInvert === undefined !== undefined) tf.clipInvert = false\n        params && Object.assign(tf, params)\n        if (material.setDirty) material.setDirty()\n        return true\n    }\n\n    private _plane = new PlaneThree()\n    private _viewNormalMatrix = new Matrix3()\n    private _v4 = new Vector4()\n\n    readonly materialExtension: MaterialExtension = {\n        parsFragmentSnippet: (_, material: PhysicalMaterial)=>{\n            if (!this.enabled || !material?.userData._fragmentClippingExt?.clipEnabled) return ''\n            return Object.entries(FragmentClippingMode)\n                .map(v=>['FragmentClippingMode.' + v[0], '' + v[1]])// replace enum with integer values in the shader\n                .reduce((a, v)=>a.replace(v[0], v[1]), FragmentClippingExtensionPluginPars)\n        },\n        shaderExtender: (shader, material: PhysicalMaterial) => {\n            if (!this.enabled || !material?.userData._fragmentClippingExt?.clipEnabled) return\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#glMarker mainStart', Object.entries(FragmentClippingMode)\n                .map(v=>['FragmentClippingMode.' + v[0], '' + v[1]]) // replace enum with integer values in the shader\n                .reduce((a, v)=>a.replace(v[0], v[1]), '\\n' + FragmentClippingExtensionPluginPatch), {append: true})\n        },\n        onObjectRender: (object: IObject3D, material) => {\n            let tfUd = material.userData._fragmentClippingExt\n            if (material.userData.isGBufferMaterial && object && object.material && !Array.isArray(object.material)) { // todo isGBufferMaterial\n                tfUd = object.material?.userData._fragmentClippingExt\n            }\n            if (!tfUd?.clipEnabled) return\n\n            if (Array.isArray(tfUd.clipPosition))\n                this._uniforms.fragClippingPosition.value.fromArray(tfUd.clipPosition)\n            else\n                this._uniforms.fragClippingPosition.value.copy(tfUd.clipPosition)\n\n            if (tfUd.clipMode === FragmentClippingMode.Plane && tfUd.clipParams) {\n                const clipParams = Array.isArray(tfUd.clipParams) ? this._v4.fromArray(tfUd.clipParams) : this._v4.copy(tfUd.clipParams)\n                const viewMatrix = this._viewer!.scene.mainCamera.matrixWorldInverse\n                this._plane.normal.set(clipParams.x, clipParams.y, clipParams.z)\n                this._plane.constant = clipParams.w\n                this._viewNormalMatrix.getNormalMatrix(viewMatrix)\n                this._plane.applyMatrix4(viewMatrix, this._viewNormalMatrix)\n                this._uniforms.fragClippingParams.value.set(this._plane.normal.x, this._plane.normal.y, this._plane.normal.z, this._plane.constant)\n            } else {\n                if (Array.isArray(tfUd.clipPosition))\n                    this._uniforms.fragClippingParams.value.fromArray(tfUd.clipParams)\n                else\n                    this._uniforms.fragClippingParams.value.copy(tfUd.clipParams)\n            }\n            if (this._viewer?.scene.mainCamera.isPerspectiveCamera)\n                this._uniforms.fragClippingCamAspect.value = this._viewer?.scene.mainCamera.aspect\n            else this._uniforms.fragClippingCamAspect.value = 1.0\n\n            updateMaterialDefines({\n                ...this._defines,\n                // ['FRAGMENT_CLIPPING_EXTENSION_ENABLED']: this.enabled,\n                ['FRAG_CLIPPING_MODE']: +(tfUd.clipMode ?? FragmentClippingMode.Circle),\n                ['FRAG_CLIPPING_INVERSE']: +(tfUd.clipInvert ?? false),\n            }, material)\n        },\n        extraUniforms: {\n            // ...this._uniforms, // done in constructor\n        },\n        computeCacheKey: (material1: PhysicalMaterial) => {\n            return (this.enabled ? '1' : '0') + (material1.userData._fragmentClippingExt?.clipEnabled ? '1' : '0')\n        },\n        isCompatible: (material1: PhysicalMaterial) => {\n            return material1.isPhysicalMaterial || material1.userData.isGBufferMaterial // todo isGBufferMaterial\n        },\n        getUiConfig: material => { // todo use uiConfigMaterialExtension\n            const viewer = this._viewer!\n            if (material.userData._fragmentClippingExt === undefined) material.userData._fragmentClippingExt = {}\n            const state = material.userData._fragmentClippingExt\n            const config: UiObjectConfig = {\n                type: 'folder',\n                label: 'Fragment Clipping',\n                onChange: (ev)=>{\n                    if (!ev.config) return\n                    this.setDirty()\n                },\n                children: [\n                    {\n                        type: 'checkbox',\n                        label: 'Enabled',\n                        get value() {\n                            return state.clipEnabled || false\n                        },\n                        set value(v) {\n                            if (v === state.clipEnabled) return\n                            if (v) {\n                                if (!FragmentClippingExtensionPlugin.AddFragmentClipping(material))\n                                    viewer.dialog.alert('Cannot add FragmentClippingExtension.')\n                            } else {\n                                state.clipEnabled = false\n                                if (material.setDirty) material.setDirty()\n                            }\n                            config.uiRefresh?.(true, 'postFrame')\n                        },\n                    },\n                    {\n                        type: 'dropdown',\n                        label: 'Mode',\n                        children: Object.entries(FragmentClippingMode)\n                            // .filter(key => !isNaN(Number(FragmentClippingMode[key])))\n                            .map(v => ({label: v[0], value: v[1]})),\n                        hidden: () => !state.clipEnabled,\n                        property: [state, 'clipMode'],\n                    },\n                    {\n                        type: 'vec4',\n                        label: 'Position',\n                        bounds: [-1, 1],\n                        hidden: () => !state.clipEnabled,\n                        property: [state, 'clipPosition'],\n                    },\n                    {\n                        type: 'vec4',\n                        label: 'Params',\n                        bounds: [0, 1],\n                        hidden: () => !state.clipEnabled,\n                        property: [state, 'clipParams'],\n                    },\n                    {\n                        type: 'toggle',\n                        label: 'Invert',\n                        hidden: () => !state.clipEnabled,\n                        property: [state, 'clipInvert'],\n                    },\n                ],\n            }\n            return config\n        },\n\n    }\n\n    setDirty = (): void => {\n        this.materialExtension.setDirty?.()\n        this._viewer?.setDirty()\n    }\n\n    constructor() {\n        super()\n        Object.assign(this.materialExtension.extraUniforms!, this._uniforms)\n    }\n\n    onAdded(v: ThreeViewer) {\n        super.onAdded(v)\n        // v.addEventListener('preRender', this._preRender)\n        v.assetManager.materials.registerMaterialExtension(this.materialExtension)\n        v.assetManager.registerGltfExtension(fragmentClippingGLTFExtension)\n        // v.getPlugin(GBufferPlugin)?.material?.registerMaterialExtensions([this.materialExtension])\n\n    }\n\n    onRemove(v: ThreeViewer) {\n        v.assetManager.materials?.unregisterMaterialExtension(this.materialExtension)\n        v.assetManager.unregisterGltfExtension(fragmentClippingGLTFExtension.name)\n        // v.getPlugin(GBufferPlugin)?.material?.unregisterMaterialExtensions([this.materialExtension])\n        return super.onRemove(v)\n    }\n\n    /**\n     * @deprecated use - use {@link fragmentClippingGLTFExtension}\n     */\n    public static readonly FRAGMENT_CLIPPING_EXTENSION_GLTF_EXTENSION = 'WEBGI_materials_fragment_clipping_extension'\n\n}\n\ndeclare module '../../core/IMaterial' {\n    interface IMaterialUserData {\n        _fragmentClippingExt?: {\n            clipEnabled?: boolean\n            clipPosition?: Vector4|Vector4Tuple\n            clipParams?: Vector4|Vector4Tuple\n            clipMode?: FragmentClippingMode\n            clipInvert?: boolean\n        }\n    }\n}\n\n\nexport enum FragmentClippingMode {\n    Circle = 0,\n    Ellipse = 1,\n    Rectangle = 2,\n    Plane = 3,\n    Sphere = 4\n}\n\n/**\n * FragmentClipping Materials Extension\n *\n * Specification: https://threepipe.org/docs/gltf-extensions/WEBGI_materials_fragment_clipping_extension.html\n */\nclass GLTFMaterialsFragmentClippingExtensionImport implements GLTFLoaderPlugin {\n    public name: string\n    public parser: GLTFParser\n\n    constructor(parser: GLTFParser) {\n        this.parser = parser\n        this.name = fragmentClippingGLTFExtension.name\n    }\n\n    async extendMaterialParams(materialIndex: number, materialParams: any) {\n        const parser = this.parser\n        const materialDef = parser.json.materials[materialIndex]\n        if (!materialDef.extensions || !materialDef.extensions[this.name]) return\n        const extension = materialDef.extensions[this.name]\n        if (!materialParams.userData) materialParams.userData = {}\n        FragmentClippingExtensionPlugin.AddFragmentClipping(materialParams)\n        ThreeSerialization.Deserialize(extension, materialParams.userData._fragmentClippingExt)\n    }\n}\n\nconst glTFMaterialsFragmentClippingExtensionExport = (w: GLTFWriter2)=> ({\n    writeMaterial: (material: any, materialDef: any) => {\n        if (!material.isMeshStandardMaterial || !material.userData._fragmentClippingExt?.clipEnabled) return\n        materialDef.extensions = materialDef.extensions || {}\n\n        const extensionDef: any = ThreeSerialization.Serialize(material.userData._fragmentClippingExt)\n\n        materialDef.extensions[ fragmentClippingGLTFExtension.name ] = extensionDef\n        w.extensionsUsed[ fragmentClippingGLTFExtension.name ] = true\n    },\n})\n\nexport const fragmentClippingGLTFExtension = {\n    name: 'WEBGI_materials_fragment_clipping',\n    import: (p) => new GLTFMaterialsFragmentClippingExtensionImport(p),\n    export: glTFMaterialsFragmentClippingExtensionExport,\n    textures: undefined,\n} satisfies AssetManager['gltfExtensions'][number]\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {IRenderTarget} from '../../rendering'\nimport {ICamera, IObjectExtension} from '../../core'\nimport {uiFolderContainer, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport type {RenderTargetPreviewPlugin} from '../ui/RenderTargetPreviewPlugin'\n\nexport interface VirtualCamerasPluginEventMap extends AViewerPluginEventMap {\n    preRenderCamera: {camera: VirtualCamera}\n    preBlitCamera: {camera: VirtualCamera, readBuffer: WebGLTexture}\n    postRenderCamera: {camera: VirtualCamera}\n}\n\nexport interface VirtualCamera {\n    camera: ICamera\n    target: IRenderTarget\n    enabled: boolean\n}\n@uiFolderContainer('Virtual Cameras')\nexport class VirtualCamerasPlugin extends AViewerPluginSync<VirtualCamerasPluginEventMap> {\n    public static readonly PluginType = 'VirtualCamerasPlugin'\n\n    @uiToggle()\n        enabled = true\n\n    toJSON: any = undefined // disable serialization\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n\n    cameras: VirtualCamera[] = []\n\n    protected _viewerListeners = {\n        preRender: () => {\n            if (this.isDisabled() || !this._viewer) return\n            const viewer = this._viewer\n            for (const v of this.cameras) {\n                if (!v.enabled) continue\n                const camera = v.camera\n                try {\n                    this.dispatchEvent({type: 'preRenderCamera', camera: v})\n                    viewer.scene.renderCamera = camera\n                    viewer.renderManager.render(viewer.scene, false)\n                    const source = viewer.renderManager.composer.readBuffer.texture\n                    this.dispatchEvent({type: 'preBlitCamera', camera: v, readBuffer: source})\n                    viewer.renderManager.blit(v.target, {source})\n                    this.dispatchEvent({type: 'postRenderCamera', camera: v})\n                } catch (e: any) {\n                    viewer.console.error(e)\n                    v.enabled = false\n                    if (viewer.debug) throw e\n                }\n            }\n        },\n    }\n\n    private _objectExtension: IObjectExtension = {\n        uuid: 'VirtualCameraPluginExt',\n        isCompatible: object => object.isCamera,\n        getUiConfig: (object): UiObjectConfig[]|undefined => {\n            if (!object.isCamera) return undefined\n            return [{\n                type: 'button',\n                label: 'Add Virtual Camera',\n                hidden: ()=>!!this.cameras.find(f=>f.camera === object),\n                onClick: () => {\n                    if (!this._viewer) return\n                    this.addCamera(object as ICamera, undefined, true)\n                    object.setDirty && object.setDirty()\n                    return ()=>{\n                        this.removeCamera(object as ICamera)\n                        object.setDirty && object.setDirty()\n                    }\n                },\n            }, {\n                type: 'button',\n                label: 'Virtual Camera Enabled',\n                hidden: ()=>!this.cameras.find(f=>f.camera === object),\n                getValue: ()=>{\n                    const vCam = this.cameras.find(f => f.camera === object)\n                    return vCam ? vCam.enabled : false\n                },\n                setValue: ()=>{\n                    const vCam = this.cameras.find(f => f.camera === object)\n                    if (vCam) {\n                        vCam.enabled = !vCam.enabled\n                        return vCam.enabled\n                    }\n                    return false\n                },\n            }, {\n                type: 'button',\n                label: 'Remove Virtual Camera',\n                hidden: ()=>!this.cameras.find(f=>f.camera === object),\n                onClick: () => {\n                    if (!this._viewer) return\n                    this.removeCamera(object as ICamera)\n                    object.setDirty && object.setDirty()\n                    return ()=>{\n                        this.addCamera(object as ICamera, undefined, true)\n                        object.setDirty && object.setDirty()\n                    }\n                },\n            }]\n        },\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        // todo save camera state in userData?\n        viewer.object3dManager.registerObjectExtension(this._objectExtension)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.object3dManager.unregisterObjectExtension(this._objectExtension)\n        super.onRemove(viewer)\n    }\n\n    addCamera(camera: ICamera, target?: IRenderTarget, addTargetPreview = false): VirtualCamera {\n        if (!this._viewer) throw 'Plugin not added to viewer'\n        target = target ?? this._viewer.renderManager.composerTarget.clone(true)\n        target.name = camera.name + '_virtualCamTarget'\n        const vCam: VirtualCamera = {camera, target, enabled: true}\n        this.cameras.push(vCam)\n        // todo: track for jitter in progressive or something else for jittering\n\n        if (addTargetPreview) {\n            const rt = this._viewer.getPlugin<RenderTargetPreviewPlugin>('RenderTargetPreviewPlugin')\n            rt?.addTarget(target, camera.name, false, false, true)\n        }\n        return vCam\n    }\n\n    removeCamera(camera: ICamera): boolean {\n        if (!this._viewer) throw 'Plugin not added to viewer'\n        const index = this.cameras.findIndex(f => f.camera === camera)\n        if (index >= 0) {\n            const vCam = this.cameras[index]\n            this.cameras.splice(index, 1)\n            const rt = this._viewer.getPlugin<RenderTargetPreviewPlugin>('RenderTargetPreviewPlugin')\n            rt?.removeTarget(vCam.target)\n            vCam.target.dispose()\n            return true\n        }\n        return false\n\n    }\n\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {generateUiConfig, uiButton, uiDropdown, uiInput, UiObjectConfig, uiToggle} from 'uiconfig.js'\nimport {MaterialExtension} from '../../materials'\nimport {Box3, DirectionalLight, Group, MathUtils, Matrix4, Object3D, ShaderChunk, Vector2, Vector3} from 'three'\nimport {onChange, serialize} from 'ts-browser-helpers'\nimport {DirectionalLight2, ICamera, IObject3D, IObject3DEventMap, ISceneEventMap} from '../../core'\nimport {shaderReplaceString} from '../../utils'\n\n/**\n * Configuration data for CSM (Cascaded Shadow Maps) light parameters\n */\nexport interface CSMLightData {\n    /** Number of shadow cascades. Default: 3 */\n    cascades?: number;\n    /** Shadow map resolution for each cascade. Default: 2048 */\n    shadowMapSize?: number;\n    /** Shadow bias to prevent shadow acne. If undefined, uses light's existing bias */\n    shadowBias?: number|undefined;\n    /** Near plane distance for shadow camera. If undefined, uses light's existing near */\n    lightNear?: number|undefined;\n    /** Far plane distance for shadow camera. If undefined, uses light's existing far */\n    lightFar?: number|undefined;\n    // lightRadius?: number;\n    /** Margin around the frustum bounds for shadow calculation. Default: 200 */\n    lightMargin?: number;\n}\n\nconst defaultData = {\n    cascades: 3,\n    // maxFar: 100000,\n    // mode: 'practical',\n    shadowMapSize: 2048,\n    shadowBias: undefined,\n    lightNear: undefined,\n    lightFar: undefined,\n    lightMargin: 200,\n    // lightRadius: 1,\n} as const satisfies CSMLightData\n\n/**\n * Cascaded Shadow Maps (CSM) plugin for high-quality directional light shadows across large scenes.\n *\n * This plugin implements cascaded shadow mapping to provide better shadow quality across\n * different distances from the camera by splitting the view frustum into multiple cascades,\n * each with its own shadow map at an appropriate resolution.\n *\n * Features:\n * - Multiple cascade splitting modes: uniform, logarithmic, practical, and custom\n * - Automatic light attachment to first directional light found\n * - Configurable shadow parameters per light\n * - Material extension for proper shadow sampling\n * - Optional fade between cascades\n *\n * Original three-csm implementation - https://github.com/StrandedKitty/three-csm\n * @example\n * ```typescript\n * const viewer = new ThreeViewer({\n *     plugins: [new CascadedShadowsPlugin()]\n * })\n *\n * const light = new DirectionalLight2(0xffffff, 1.5)\n * viewer.scene.addObject(light)\n *\n * const csmPlugin = viewer.getPlugin(CascadedShadowsPlugin)!\n * csmPlugin.setLightParams({\n *     cascades: 4,\n *     shadowMapSize: 1024,\n *     lightMargin: 100\n * }, light)\n * ```\n */\nexport class CascadedShadowsPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'CascadedShadowsPlugin'\n\n    /** Enable/disable the cascaded shadow maps plugin */\n    @uiToggle()\n    @serialize()\n    @onChange('setDirty')\n        enabled = true\n\n    /** Current camera used for frustum calculations */\n    camera?: ICamera // todo camera onchange\n    /** Parent object containing all CSM lights */\n    parent: Object3D = new Group()\n\n    /**\n     * Total cascades\n     */\n    // @onChange('refreshLights')\n    // totalCascades\n\n    // @onChange('refreshLights')\n    //     cascades = 3\n    //\n    /** Maximum far distance for shadow calculation */\n    @onChange('cameraNeedsUpdate')\n    @serialize()\n    @uiInput()\n        maxFar = 100000\n\n    /** Cascade splitting mode: uniform, logarithmic, practical, or custom */\n    @onChange('cameraNeedsUpdate')\n    @serialize()\n    @uiDropdown(undefined, ['uniform', 'logarithmic', 'practical'/* , 'custom'*/])\n        mode: 'uniform'|'logarithmic'|'practical'|'custom' = 'practical'\n\n    /**\n     * Automatically attach to first found directional light in the scene that casts shadow, if none is attached yet.\n     * Call {@link refreshAttachedLight} to manually trigger light search.\n     */\n    @uiToggle()\n    @serialize()\n        attachToFirstLight = true\n\n    /** Enable fade between cascades for smoother transitions */\n    @onChange('cameraNeedsUpdate')\n    @serialize()\n    @uiToggle()\n        fade: boolean\n\n    // todo\n    //  multi light support can also be added\n    //  directional light only for now\n    //  patch ui config for attached lights\n    //  add light helper option?\n\n    /** The main directional light that CSM will be applied to */\n    @onChange('refreshLights')\n        light?: DirectionalLight&IObject3D\n\n    /** Custom callback for defining cascade splits when mode is 'custom' */\n    @onChange('cameraNeedsUpdate')\n        customSplitsCallback?: (amount: number, near: number, far: number, breaks: number[]) => void\n\n    /** Main camera frustum for cascade calculation */\n    mainFrustum: CSMFrustum\n    /** Individual frustums for each cascade */\n    frustums: CSMFrustum[] = []\n    /** Cascade break points in normalized depth [0-1] */\n    breaks: number[] = []\n    /** Extended break data for shader uniforms */\n    extendedBreaks: (Vector3|Vector2)[] = []\n    /** Generated directional lights for each cascade */\n    lights: DirectionalLight[] = []\n\n\n    constructor(enabled = true) {\n        super()\n        this.injectInclude()\n        this._lastEnabled = enabled\n        this.enabled = enabled\n\n        this.mainFrustum = new CSMFrustum()\n    }\n\n    private _lightRef: CascadedShadowsPlugin['light']|undefined = undefined\n    private _lightUpdate = (e: IObject3DEventMap['objectUpdate'])=>{\n        if (e?.object !== this.light) return\n        this.refreshLights(e)\n    }\n\n    /**\n     * Configure shadow parameters for a specific light\n     * @param params - CSM light configuration parameters\n     * @param light - Target light (uses attached light if not specified)\n     */\n    setLightParams(params: CSMLightData, light?: DirectionalLight&IObject3D) {\n        light = light || this.light\n        if (!light) {\n            this._viewer?.console.warn('CascadedShadowsPlugin: No light attached to CascadedShadowsPlugin')\n            return\n        }\n        let userData = light.userData[CascadedShadowsPlugin.PluginType] as CSMLightData|undefined\n        if (!userData) {\n            userData = {}\n            light.userData[CascadedShadowsPlugin.PluginType] = userData\n        }\n        Object.assign(userData, params)\n\n        if (light === this.light)\n            this.refreshLights()\n    }\n\n    refreshLights = (e?: any) => {\n        if (this._lightRef && this._lightRef !== this.light) {\n            this._lightRef.removeEventListener('objectUpdate', this._lightUpdate)\n            if (this._lightAutoAttached) this._lightAutoAttached = false\n            this._lightRef = undefined\n        }\n\n        if (!this.light) {\n            return\n        }\n\n        if (!this._lightRef) {\n            this.light.addEventListener('objectUpdate', this._lightUpdate)\n            this._lightRef = this.light\n        }\n\n        if (this.isDisabled()) return\n\n        this.light.castShadow = false // todo this will be set as false in gltf then\n        this.light.visible = false // todo this will be set as false in gltf then\n        this.parent.visible = true\n\n\n        let userData = this.light.userData[CascadedShadowsPlugin.PluginType] as CSMLightData|undefined\n        if (!userData) {\n            userData = {}\n            this.light.userData[CascadedShadowsPlugin.PluginType] = userData\n        }\n        const data = {\n            ...defaultData,\n            ...userData,\n        }\n\n        for (let i = 0; i < data.cascades; i++) {\n\n            if (!this.lights[i]) {\n                const light = new DirectionalLight(0xffffff, 1)\n                light.name = 'CSM Light ' + i\n                this.lights.push(light)\n                this.parent.add(light)\n                this.parent.add(light.target)\n            }\n            const light = this.lights[i]\n\n            light.intensity = this.light.intensity\n            light.color.set(this.light.color)\n            light.castShadow = true\n            light.shadow.mapSize.width = data.shadowMapSize\n            light.shadow.mapSize.height = data.shadowMapSize\n\n            light.shadow.camera.near = data.lightNear ?? this.light.shadow.camera.near\n            light.shadow.camera.far = data.lightFar ?? this.light.shadow.camera.far\n            light.shadow.bias = data.shadowBias ?? this.light.shadow.bias\n            light.shadow.normalBias = this.light.shadow.normalBias\n            light.shadow.radius = this.light.shadow.radius\n            // todo blurSamples? anything else?\n\n        }\n\n        if (this.lights.length > data.cascades) {\n            const remove = this.lights.splice(data.cascades, this.lights.length - data.cascades)\n            for (const light of remove) {\n                this.parent.remove(light.target)\n                this.parent.remove(light)\n            }\n        }\n\n        const changeKey = e?.change ?? e?.key\n        if (!changeKey && ![\n            'intensity', 'castShadow', 'mapSize', 'bias', 'radius', 'shadow', 'deserialize',\n        ].includes(changeKey)) this.cameraNeedsUpdate()\n    }\n\n    private _mainCameraChange = (event: ISceneEventMap['mainCameraChange']) => {\n        this.camera = event.camera\n        this.cameraNeedsUpdate()\n    }\n\n    private _cameraUpdated = false\n    private _mainCameraUpdate = (event: ISceneEventMap['mainCameraUpdate']) => {\n        if (event.projectionUpdated !== false) this.cameraNeedsUpdate()\n        else this.setDirty()\n    }\n    cameraNeedsUpdate = () => {\n        this._cameraUpdated = true\n        this._viewer?.setDirty()\n    }\n\n    private _needsUpdate = false\n    private _lastEnabled: boolean\n    setDirty = () => {\n        const enabled = !this.isDisabled()\n        if (enabled !== this._lastEnabled) {\n            this._lastEnabled = enabled\n            this.refreshLights()\n            if (!enabled) {\n                if (this.light) {\n                    this.light.castShadow = true\n                    this.light.visible = true\n                    this.parent.visible = false\n                    this.light.setDirty && this.light.setDirty()\n                }\n                this.extendedBreaks.length = 0\n                this._sversion++\n                this.materialExtension.setDirty && this.materialExtension.setDirty()\n                this._viewer?.setDirty()\n            }\n        }\n        if (!enabled) return\n        this._needsUpdate = true\n        this._viewer?.setDirty()\n    }\n\n    protected _viewerListeners = {\n        preRender: () => {\n            if (this.isDisabled() || !this.light) return\n            let updated = false\n            if (/* this.camera?.isOrthographicCamera || */this._cameraUpdated) {\n                // updateOrthoCamera()\n                this._updateFrustums()\n                updated = true\n                // if (params.autoUpdateHelper) {\n                //     csmHelper.update()\n                // }\n            } else {\n                // if (params.autoUpdateHelper) {\n                //     csmHelper.update()\n                // }\n            }\n            if (this._needsUpdate && !this.update()) updated = true\n            if (updated) this._viewer?.renderManager.resetShadows()\n        },\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.scene.addEventListener('mainCameraChange', this._mainCameraChange)\n        viewer.scene.addEventListener('mainCameraUpdate', this._mainCameraUpdate)\n        viewer.renderManager.addEventListener('resize', this.cameraNeedsUpdate)\n        this.camera = viewer.scene.mainCamera\n        viewer.materialManager.registerMaterialExtension(this.materialExtension)\n\n        viewer.object3dManager.addEventListener('lightAdd', this.refreshAttachedLight)\n        viewer.object3dManager.addEventListener('lightRemove', this.refreshAttachedLight)\n        this.refreshAttachedLight()\n\n        viewer.scene.addObject(this.parent, {addToRoot: true, indexInParent: 0}) // we need to be before modelRoot so other lights dont interfere in the shader\n        // this.parent = viewer.scene\n        this.refreshLights()\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)\n        viewer.scene.removeEventListener('mainCameraUpdate', this._mainCameraUpdate)\n        viewer.renderManager.removeEventListener('resize', this.cameraNeedsUpdate)\n        viewer.materialManager.unregisterMaterialExtension(this.materialExtension)\n\n        viewer.object3dManager.removeEventListener('lightAdd', this.refreshAttachedLight)\n        viewer.object3dManager.removeEventListener('lightRemove', this.refreshAttachedLight)\n        this.refreshAttachedLight()\n        if (this.light && this._lightAutoAttached) {\n            this.light = undefined\n            this._lightAutoAttached = false\n        }\n\n        for (const light of this.lights) {\n            // todo dispose shadowmaps\n            this.parent.remove(light.target)\n            this.parent.remove(light)\n        }\n        this.parent.clear()\n        this.parent.removeFromParent()\n\n        this.camera = undefined\n\n        super.onRemove(viewer)\n    }\n\n    protected _initCascades(breaks: number[]) {\n        const camera = this.camera\n        if (!camera) return this.frustums\n        camera.updateProjectionMatrix && camera.updateProjectionMatrix() // this is not needed actually\n        this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar)\n        this.mainFrustum.split(breaks, this.frustums)\n\n        return this.frustums\n    }\n\n    protected _updateShadowBounds() {\n\n        for (let i = 0; i < this.frustums.length; i++) {\n\n            const light = this.lights[i]\n            const shadowCam = light.shadow.camera\n            const frustum = this.frustums[i]\n\n            // Get the two points that represent that furthest points on the frustum assuming\n            // that's either the diagonal across the far plane or the diagonal across the whole\n            // frustum itself.\n            const nearVerts = frustum.vertices.near\n            const farVerts = frustum.vertices.far\n            const point1 = farVerts[0]\n            let point2\n            if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {\n\n                point2 = farVerts[2]\n\n            } else {\n\n                point2 = nearVerts[2]\n\n            }\n\n            let squaredBBWidth = point1.distanceTo(point2)\n            if (this.fade && this.camera) {\n\n                // expand the shadow extents by the fade margin if fade is enabled.\n                const camera = this.camera\n                const far = Math.max(camera.far, this.maxFar)\n                const linearDepth = frustum.vertices.far[0].z / (far - camera.near)\n                const margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near)\n\n                squaredBBWidth += margin\n\n            }\n\n            shadowCam.left = -squaredBBWidth / 2\n            shadowCam.right = squaredBBWidth / 2\n            shadowCam.top = squaredBBWidth / 2\n            shadowCam.bottom = -squaredBBWidth / 2\n            shadowCam.updateProjectionMatrix()\n\n        }\n\n    }\n\n    protected _getBreaks(cascades: number) {\n        this.breaks.length = 0\n\n        const camera = this.camera\n        if (!camera) return this.breaks\n\n        const far = Math.min(camera.far, this.maxFar)\n\n        let mode = this.mode\n        if (mode === 'custom' && this.customSplitsCallback === undefined) {\n            console.error('CSM: Custom split scheme callback not defined.')\n            mode = 'practical'\n        }\n\n\n        switch (mode) {\n\n        case 'uniform':\n            this._uniformSplit(cascades, camera.near, far, this.breaks)\n            break\n        case 'logarithmic':\n            this._logarithmicSplit(cascades, camera.near, far, this.breaks)\n            break\n        case 'practical':\n        default:\n            this._practicalSplit(cascades, camera.near, far, 0.5, this.breaks)\n            break\n        case 'custom':\n            if (this.customSplitsCallback) {\n                this.customSplitsCallback(cascades, camera.near, far, this.breaks)\n            }\n            break\n\n        }\n\n        return this.breaks\n    }\n\n    /**\n     * Uniform split function for shadow cascades\n     */\n    private _uniformSplit(amount: number, near: number, farValue: number, target: number[]): void {\n        for (let i = 1; i < amount; i++) {\n            target.push((near + (farValue - near) * i / amount) / farValue)\n        }\n        target.push(1)\n    }\n\n    /**\n     * Logarithmic split function for shadow cascades\n     */\n    private _logarithmicSplit(amount: number, near: number, farValue: number, target: number[]): void {\n        for (let i = 1; i < amount; i++) {\n            target.push(near * (farValue / near) ** (i / amount) / farValue)\n        }\n        target.push(1)\n    }\n\n    /**\n     * Practical split function for shadow cascades\n     */\n    private _practicalSplit(amount: number, near: number, farValue: number, lambda: number, target: number[]): void {\n        this._uniformArray.length = 0\n        this._logArray.length = 0\n        this._logarithmicSplit(amount, near, farValue, this._logArray)\n        this._uniformSplit(amount, near, farValue, this._uniformArray)\n\n        for (let i = 1; i < amount; i++) {\n            target.push(MathUtils.lerp(this._uniformArray[i - 1], this._logArray[i - 1], lambda))\n        }\n        target.push(1)\n    }\n\n    private _lastCenters: Vector3[] = []\n\n    update() {\n        this._needsUpdate = false\n        const camera = this.camera\n        if (!camera || !this.light) return true\n\n        const frustums = this.frustums\n\n        const {\n            shadowMapSize = defaultData.shadowMapSize,\n            lightMargin = defaultData.lightMargin,\n        } = this.light.userData[CascadedShadowsPlugin.PluginType] as CSMLightData|undefined || {}\n\n        {\n            this.light.updateMatrixWorld()\n            const lightPos = this.light.getWorldPosition(this._center)\n            // const lightPos = this._center.copy(this.light.position)\n            this.light.target.updateMatrixWorld()\n            this.light.target.getWorldPosition(this._lightDirection)\n            // this._lightDirection.copy(this.light.target.position)\n\n            // console.log(lightPos, this._lightDirection, this.light)\n\n            // for each frustum we need to find its min-max box aligned with the light orientation\n            // the position in lightOrientationMatrix does not matter, as we transform there and back\n            this._lightOrientationMatrix.lookAt(lightPos, this._lightDirection, this._up)\n            this._lightOrientationMatrixInverse.copy(this._lightOrientationMatrix).invert()\n\n            this._lightDirection.sub(lightPos).normalize()\n        }\n\n        const centers = []\n        for (let i = 0; i < frustums.length; i++) {\n\n            const light = this.lights[i]\n            const shadowCam = light.shadow.camera\n            const texelWidth = (shadowCam.right - shadowCam.left) / shadowMapSize\n            const texelHeight = (shadowCam.top - shadowCam.bottom) / shadowMapSize\n            this._cameraToLightMatrix.multiplyMatrices(this._lightOrientationMatrixInverse, camera.matrixWorld)\n            frustums[i].toSpace(this._cameraToLightMatrix, this._lightSpaceFrustum)\n\n            const nearVerts = this._lightSpaceFrustum.vertices.near\n            const farVerts = this._lightSpaceFrustum.vertices.far\n            this._bbox.makeEmpty()\n            for (let j = 0; j < 4; j++) {\n\n                this._bbox.expandByPoint(nearVerts[j])\n                this._bbox.expandByPoint(farVerts[j])\n\n            }\n\n            this._bbox.getCenter(this._center)\n            this._center.z = this._bbox.max.z + lightMargin\n            this._center.x = Math.floor(this._center.x / texelWidth) * texelWidth\n            this._center.y = Math.floor(this._center.y / texelHeight) * texelHeight\n            this._center.applyMatrix4(this._lightOrientationMatrix)\n\n            centers.push(this._center.clone())\n            light.position.copy(this._center)\n            light.target.position.copy(this._center).add(this._lightDirection)\n\n        }\n        let same = true\n        if (centers.length === this._lastCenters.length) {\n            for (let i = 0; i < centers.length; i++) {\n                if (Math.abs(centers[i].x - this._lastCenters[i].x) + Math.abs(centers[i].y - this._lastCenters[i].y) + Math.abs(centers[i].z - this._lastCenters[i].z) > 0.001) {\n                    same = false\n                    break\n                }\n            }\n        } else same = false\n        this._lastCenters = centers\n        return same\n    }\n\n    private _lightAutoAttached = false\n\n    /**\n     * Finds and attaches to the first directional light in the scene that casts shadows\n     */\n    @uiButton() refreshAttachedLight = () => {\n        if (this.light && this._lightAutoAttached) {\n            if (!this.light.parent) {\n                this.light = undefined\n                this._lightAutoAttached = false\n            }\n            return\n        }\n        if (!this.attachToFirstLight) return\n        const objects = this._viewer?.object3dManager.getLights() || []\n        for (const obj of objects) {\n            if (obj.isDirectionalLight && obj.castShadow) {\n                if (obj as any === this.light) return\n                this.light = obj as DirectionalLight2\n                this._lightAutoAttached = true\n                return\n            }\n        }\n    }\n\n    private _sversion = 0\n    protected _updateFrustums = () => {\n        if (!this.light) return\n\n        const {\n            cascades = defaultData.cascades,\n        } = this.light.userData[CascadedShadowsPlugin.PluginType] as CSMLightData|undefined || {}\n\n        const breaks = this._getBreaks(cascades)\n        /* const frustums = */this._initCascades(breaks)\n        this._updateShadowBounds()\n\n        // Compute and cache extended breaks for material extension\n        this.extendedBreaks.length = 0\n        for (let i = 0; i < breaks.length; i++) {\n            const amount = breaks[i]\n            this.extendedBreaks.push(new Vector2(breaks[i - 1] || 0, amount/* , cascades + 0.1*/)) // setting total cascades for that light so it can be used in shader in the future\n        }\n\n        // this.updateUniforms()\n        this._sversion++\n        this.materialExtension.setDirty && this.materialExtension.setDirty()\n        this._cameraUpdated = false\n        this.setDirty()\n    }\n\n    /**\n     * Total cascades\n     */\n    get cascades() {\n        if (this.isDisabled() || !this.light) return 0\n        return this.frustums.length\n    }\n\n    materialExtension: MaterialExtension = {\n        extraDefines: {\n            ['CSM_CASCADES']: () => this.cascades.toString(),\n            ['USE_CSM']: ()=>this.light && !this.isDisabled() ? '1' : undefined,\n            ['CSM_FADE']: () => this.fade ? '1' : undefined,\n        },\n        extraUniforms: {\n            // ['CSM_cascades']: {value: []},\n            // ['cameraNear']: ()=>({value: this.camera?.near ?? 0.01}), // todo test dynamic prop\n            // ['shadowFar']: ()=>{\n            //     console.log('update uniform')\n            //     return {value: Math.min(this.camera?.far ?? 1000, this.maxFar)}\n            // },\n        },\n        computeCacheKey: () => {\n            return (this.isDisabled() ? '1' : '0') + this.lights.length + (this.fade ? '1' : '0') + this.light?.uuid\n        },\n        // shaderExtender: (shader) => {\n        //     // console.log('shader extend')\n        //     // if (!shader.uniforms.CSM_cascades) shader.uniforms.CSM_cascades = {value: []}\n        //     // this.getExtendedBreaks(shader.uniforms.CSM_cascades.value)\n        // },\n        onObjectRender: (_, material) => {\n            if (material.extraUniformsToUpload.CSM_cascades) material.extraUniformsToUpload.CSM_cascades.needsUpdate = false\n            if (material.extraUniformsToUpload.cameraNear) material.extraUniformsToUpload.cameraNear.needsUpdate = false\n            if (material.extraUniformsToUpload.shadowFar) material.extraUniformsToUpload.shadowFar.needsUpdate = false\n\n            if (this.isDisabled() || !this.light) return\n\n            if (!material.extraUniformsToUpload) material.extraUniformsToUpload = {}\n\n            if (!material.extraUniformsToUpload.CSM_cascades) material.extraUniformsToUpload.CSM_cascades = {value: []}\n            if (!material.extraUniformsToUpload.cameraNear) material.extraUniformsToUpload.cameraNear = {value: 0}\n            if (!material.extraUniformsToUpload.shadowFar) material.extraUniformsToUpload.shadowFar = {value: 0}\n\n            if (!(material as any).__csmVersion) (material as any).__csmVersion = 0\n            if ((material as any).__csmVersion === this._sversion) return\n            ;(material as any).__csmVersion = this._sversion\n            material.extraUniformsToUpload.cameraNear.value = this.camera?.near ?? 0.01\n            material.extraUniformsToUpload.shadowFar.value = Math.min(this.camera?.far ?? 1000, this.maxFar)\n            material.extraUniformsToUpload.CSM_cascades.value = this.extendedBreaks// .map(v=>v.clone())\n\n            material.extraUniformsToUpload.cameraNear.needsUpdate = true\n            material.extraUniformsToUpload.shadowFar.needsUpdate = true\n            material.extraUniformsToUpload.CSM_cascades.needsUpdate = true\n        },\n\n        isCompatible: (material: any) => {\n            return material.isMeshStandardMaterial || material.isMeshPhysicalMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial\n        },\n    }\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Cascaded Shadows (CSM)',\n        children: [\n            ...generateUiConfig(this),\n            {\n                type: 'button',\n                label: ()=>this.light ? 'Select Light' : 'No Light Attached',\n                disabled: ()=>!this.light,\n                onClick: ()=>{\n                    if (!this.light) return\n                    this.light.dispatchEvent({type: 'select', ui: true, value: this.light, object: this.light})\n                },\n            },\n        ],\n    }\n\n    // todo in three.js r166 update, add shadow intensity in shader calls\n    injectInclude() {\n        // for hot reload etc\n        if (ShaderChunk.lights_fragment_begin.includes('defined( USE_CSM ) && defined( CSM_CASCADES )')) return\n\n        // ShaderChunk.lights_fragment_begin = CSMShader.lights_fragment_begin\n        ShaderChunk.lights_fragment_begin = shaderReplaceString(\n            ShaderChunk.lights_fragment_begin,\n            '#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n', `\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) && defined( USE_CSM ) && defined( CSM_CASCADES )\n\n\tDirectionalLight directionalLight;\n\tfloat linearDepth = (vViewPosition.z) / (shadowFar - cameraNear);\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#if defined( USE_SHADOWMAP ) && defined( CSM_FADE )\n\t\tvec2 cascade;\n\t\tfloat cascadeCenter;\n\t\tfloat closestEdge;\n\t\tfloat margin;\n\t\tfloat csmx;\n\t\tfloat csmy;\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\t\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t\t#if ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\t\t\n            #if ( UNROLLED_LOOP_INDEX < CSM_CASCADES )\n\n\t\t\t\t// NOTE: Depth gets larger away from the camera.\n\t\t\t\t// cascade.x is closer, cascade.y is further\n\t\t\t\tcascade = CSM_cascades[ UNROLLED_LOOP_INDEX ];\n\t\t\t\tcascadeCenter = ( cascade.x + cascade.y ) / 2.0;\n\t\t\t\tclosestEdge = linearDepth < cascadeCenter ? cascade.x : cascade.y;\n\t\t\t\tmargin = 0.25 * pow( closestEdge, 2.0 );\n\t\t\t\tcsmx = cascade.x - margin / 2.0;\n\t\t\t\tcsmy = cascade.y + margin / 2.0;\n\t\t\t\tif( linearDepth >= csmx && ( linearDepth < csmy || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 ) ) {\n\n\t\t\t\t\tfloat dist = min( linearDepth - csmx, csmy - linearDepth );\n\t\t\t\t\tfloat ratio = clamp( dist / margin, 0.0, 1.0 );\n\n\t\t\t\t\tvec3 prevColor = directLight.color;\n\t\t\t\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\t\tbool shouldFadeLastCascade = UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth > cascadeCenter;\n\t\t\t\t\tdirectLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );\n\n\t\t\t\t\tReflectedLight prevLight = reflectedLight;\n\t\t\t\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t\t\t\tbool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;\n\t\t\t\t\tfloat blendRatio = shouldBlend ? ratio : 1.0;\n\n\t\t\t\t\treflectedLight.directDiffuse = mix( prevLight.directDiffuse, reflectedLight.directDiffuse, blendRatio );\n\t\t\t\t\treflectedLight.directSpecular = mix( prevLight.directSpecular, reflectedLight.directSpecular, blendRatio );\n\t\t\t\t\treflectedLight.indirectDiffuse = mix( prevLight.indirectDiffuse, reflectedLight.indirectDiffuse, blendRatio );\n\t\t\t\t\treflectedLight.indirectSpecular = mix( prevLight.indirectSpecular, reflectedLight.indirectSpecular, blendRatio );\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n            #else \n            \n                directionalLightShadow = directionalLightShadows[ i ];\n                directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n    \n                RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t\t#endif\n\t\t\t\n\t\t\t#endif\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#elif defined (USE_SHADOWMAP)\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\t\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t\t#if ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\n                directionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\t\n\t\t\t\t#if ( UNROLLED_LOOP_INDEX < CSM_CASCADES )\n\n\t\t\t\t\tif(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\t\tif(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t\t\t#else\n\n\t\t\t\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t#endif\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#elif ( NUM_DIR_LIGHT_SHADOWS > 0 )\n\t\t// note: no loop here - all CSM lights are in fact one light only\n\t\tgetDirectionalLightInfo( directionalLights[0], directLight );\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t#endif\n\n\t#if ( NUM_DIR_LIGHTS > NUM_DIR_LIGHT_SHADOWS)\n\t\t// compute the lights not casting shadows (if any)\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = NUM_DIR_LIGHT_SHADOWS; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\n\t\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) && !( defined( USE_CSM ) && defined( CSM_CASCADES ) )\n`)\n        // ShaderChunk.lights_pars_begin = CSMShader.lights_pars_begin\n        ShaderChunk.lights_pars_begin = `\n#if defined( USE_CSM ) && defined( CSM_CASCADES )\nuniform vec2 CSM_cascades[CSM_CASCADES];\nuniform float cameraNear;\nuniform float shadowFar;\n#endif\n\t` + ShaderChunk.lights_pars_begin\n\n    }\n\n    // temp variables\n    private readonly _lightDirection = new Vector3()\n    private readonly _cameraToLightMatrix = new Matrix4()\n    private readonly _lightSpaceFrustum = new CSMFrustum()\n    private readonly _center = new Vector3()\n    private readonly _bbox = new Box3()\n    private readonly _uniformArray: number[] = []\n    private readonly _logArray: number[] = []\n    private readonly _lightOrientationMatrix = new Matrix4()\n    private readonly _lightOrientationMatrixInverse = new Matrix4()\n    private readonly _up = new Vector3(0, 1, 0)\n\n}\n\nexport interface FrustumParams {\n    projectionMatrix?: Matrix4;\n    maxFar?: number;\n}\n\nexport interface FrustumVertices {\n    far: Vector3[];\n    near: Vector3[]\n}\n\nexport class CSMFrustum {\n    private _inverseProjectionMatrix = new Matrix4()\n\n    public vertices: FrustumVertices = {\n        near: [\n            new Vector3(),\n            new Vector3(),\n            new Vector3(),\n            new Vector3(),\n        ],\n        far: [\n            new Vector3(),\n            new Vector3(),\n            new Vector3(),\n            new Vector3(),\n        ],\n    }\n\n    public constructor(data: FrustumParams = {}) {\n\n        if (data.projectionMatrix !== undefined) {\n\n            this.setFromProjectionMatrix(data.projectionMatrix, data.maxFar || 10000)\n\n        }\n\n    }\n\n    public setFromProjectionMatrix(projectionMatrix: Matrix4, maxFar: number): FrustumVertices {\n\n        const isOrthographic = projectionMatrix.elements[ 2 * 4 + 3 ] === 0\n\n        this._inverseProjectionMatrix.copy(projectionMatrix).invert()\n\n        // 3 --- 0  vertices.near/far order\n        // |     |\n        // 2 --- 1\n        // clip space spans from [-1, 1]\n\n        this.vertices.near[ 0 ].set(1, 1, -1)\n        this.vertices.near[ 1 ].set(1, -1, -1)\n        this.vertices.near[ 2 ].set(-1, -1, -1)\n        this.vertices.near[ 3 ].set(-1, 1, -1)\n        this.vertices.near.forEach((v) => {\n\n            v.applyMatrix4(this._inverseProjectionMatrix)\n\n        })\n\n        this.vertices.far[ 0 ].set(1, 1, 1)\n        this.vertices.far[ 1 ].set(1, -1, 1)\n        this.vertices.far[ 2 ].set(-1, -1, 1)\n        this.vertices.far[ 3 ].set(-1, 1, 1)\n        this.vertices.far.forEach((v) => {\n\n            v.applyMatrix4(this._inverseProjectionMatrix)\n\n            const absZ = Math.abs(v.z)\n            if (isOrthographic) {\n\n                v.z *= Math.min(maxFar / absZ, 1.0)\n\n            } else {\n\n                v.multiplyScalar(Math.min(maxFar / absZ, 1.0))\n\n            }\n\n        })\n\n        return this.vertices\n\n    }\n\n    public split(breaks: number[], target: CSMFrustum[]) {\n\n        while (breaks.length > target.length) {\n\n            target.push(new CSMFrustum())\n\n        }\n\n        target.length = breaks.length\n\n        for (let i = 0; i < breaks.length; i++) {\n\n            const cascade = target[ i ]\n\n            if (i === 0) {\n\n                for (let j = 0; j < 4; j++) {\n\n                    cascade.vertices.near[ j ].copy(this.vertices.near[ j ])\n\n                }\n\n            } else {\n\n                for (let j = 0; j < 4; j++) {\n\n                    cascade.vertices.near[ j ].lerpVectors(this.vertices.near[ j ], this.vertices.far[ j ], breaks[ i - 1 ])\n\n                }\n\n            }\n\n            if (i === breaks.length - 1) {\n\n                for (let j = 0; j < 4; j++) {\n\n                    cascade.vertices.far[ j ].copy(this.vertices.far[ j ])\n\n                }\n\n            } else {\n\n                for (let j = 0; j < 4; j++) {\n\n                    cascade.vertices.far[ j ].lerpVectors(this.vertices.near[ j ], this.vertices.far[ j ], breaks[ i ])\n\n                }\n\n            }\n\n        }\n\n    }\n\n    public toSpace(cameraMatrix: Matrix4, target: CSMFrustum) {\n\n        for (let i = 0; i < 4; i++) {\n\n            target.vertices.near[ i ]\n                .copy(this.vertices.near[ i ])\n                .applyMatrix4(cameraMatrix)\n\n            target.vertices.far[ i ]\n                .copy(this.vertices.far[ i ])\n                .applyMatrix4(cameraMatrix)\n\n        }\n\n    }\n\n}\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {PickingPlugin} from '../interaction/PickingPlugin'\nimport {escapeRegExp, getOrCall, imageBitmapToBase64, makeColorSvgCircle, serialize} from 'ts-browser-helpers'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {IMaterial, IObject3D, PhysicalMaterial} from '../../core'\nimport {MaterialPreviewGenerator} from '../../three'\nimport {Color} from 'three'\nimport {AnimationResult, PopmotionPlugin} from '../animation/PopmotionPlugin'\nimport {FrameFadePlugin} from '../pipeline/FrameFadePlugin'\nimport {AnimateTime} from '../../utils'\n\n/**\n * Material Configurator Plugin (Base)\n *\n * This plugin allows you to create variations of materials mapped to material names or uuids in the scene.\n * These variations can be applied to the materials in the scene. (This copies the properties to the same material instances instead of assigning new materials)\n * The plugin interfaces with the picking plugin and also provides uiConfig to show and edit the variations.\n *\n * See `MaterialConfiguratorPlugin` in [plugin-configurator](https://threepipe.org/plugins/configurator/docs/index.html) for example on inheriting with a custom UI renderer.\n *\n * @category Plugins\n */\nexport class MaterialConfiguratorBasePlugin extends AViewerPluginSync<{'refreshUi': object} & AViewerPluginEventMap> {\n    enabled = true\n    public static PluginType = 'MaterialConfiguratorPlugin'\n    private _picking: PickingPlugin | undefined\n    protected _previewGenerator: MaterialPreviewGenerator | undefined\n    private _uiNeedRefresh = false\n\n    constructor() {\n        super()\n        this.addEventListener('deserialize', this.refreshUi)\n        this.refreshUi = this.refreshUi.bind(this)\n        this._preFrame = this._preFrame.bind(this)\n        this._refreshUi = this._refreshUi.bind(this)\n        this._refreshUiConfig = this._refreshUiConfig.bind(this)\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n\n        viewer.forPlugin(PickingPlugin, (p)=>{\n            this._picking = p\n            this._picking?.addEventListener('selectedObjectChanged', this._refreshUiConfig)\n        }, ()=>{\n            this._picking?.removeEventListener('selectedObjectChanged', this._refreshUiConfig)\n            this._picking = undefined\n        }, this)\n        this._previewGenerator = new MaterialPreviewGenerator()\n        viewer.addEventListener('preFrame', this._refreshUi)\n        viewer.addEventListener('preFrame', this._preFrame)\n    }\n\n    /**\n     * Apply all variations(by selected index or first item) when a config is loaded\n     */\n    @serialize()\n        applyOnLoad = true\n\n    applyOnLoadForce = false\n\n    /**\n     * Reapply all selected variations again.\n     * Useful when a model or config is loaded or changed and the variations are not applied in the model.\n     * It is automatically called when the config is loaded if `applyOnLoad` is true.\n     */\n    reapplyAll() {\n        this.variations.forEach(async v => {\n            if (v.selectedIndex === undefined) return // nothing selected\n            this.applyVariation(v, v.selectedIndex)\n        })\n    }\n\n    fromJSON(data: any, meta?: any): this | Promise<this | null> | null {\n        this.variations = []\n        if (!super.fromJSON(data, meta)) return null // it's not a promise\n        if (this.applyOnLoadForce && data.applyOnLoad !== false ||\n            data.applyOnLoad !== undefined && this.applyOnLoad) {\n            this.reapplyAll()\n        }\n        return this\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        this._previewGenerator?.dispose()\n        this._previewGenerator = undefined\n\n        this._picking?.removeEventListener('selectedObjectChanged', this._refreshUiConfig)\n        this.removeEventListener('deserialize', this.refreshUi)\n        viewer.removeEventListener('preFrame', this._refreshUi)\n        viewer.removeEventListener('preFrame', this._preFrame)\n\n        this._picking = undefined\n\n        return super.onRemove(viewer)\n    }\n\n    findVariation(mapping?: string): MaterialVariations|undefined {\n        return mapping ? this.variations.find(v => {\n            if (v.regex ?? true) return mapping.match(typeof v.uuid === 'string' ? '^' + v.uuid + '$' : v.uuid) !== null\n            else return v.uuid === mapping\n        }) : undefined\n    }\n\n    getSelectedVariation(): MaterialVariations|undefined {\n        const selected = this._selectedMaterial()\n        if (!selected) return undefined\n        const v = this.findVariation(selected.uuid) || this.findVariation(selected.name)\n        if (v && v.regex === undefined) v.regex = true // required for tweakpane and old files, it cannot be undefined\n        return v\n    }\n\n    /**\n     * Apply a material variation based on index or uuid.\n     * @param variations\n     * @param matUuidOrIndex\n     * @param setSelectedIndex - default true, to be used with animation\n     * @param time - optional data to animate(lerp) from current value to the target material.\n     */\n    applyVariation(variations: MaterialVariations, matUuidOrIndex: string|number, setSelectedIndex?: boolean, time?: AnimateTime & {from?: string | number}): boolean {\n        const m = this._viewer?.materialManager\n        if (!m) return false\n        const material = this.findMaterialVariation(matUuidOrIndex, variations)\n        if (!material) return false\n        setSelectedIndex && (variations.selectedIndex = variations.materials.indexOf(material))\n\n        const fromMaterial = time?.from !== undefined ? this.findMaterialVariation(time.from, variations) : undefined\n        return m.applyMaterial(material, variations.uuid, variations.regex ?? true, time?.from !== undefined ? {...time, from: fromMaterial} : (time as AnimateTime))\n    }\n\n    findMaterialVariation(matUuidOrIndex: string | number, variations: MaterialVariations) {\n        return typeof matUuidOrIndex === 'string' ?\n            variations.materials.find(m1 => m1.uuid === matUuidOrIndex) :\n            variations.materials[matUuidOrIndex]\n    }\n\n    async applyVariationAnimate(variations: MaterialVariations, matUuidOrIndex: string|number, duration = 500): Promise<void> {\n        if (variations._animation) {\n            variations._animation.stop()\n        }\n        const popmotion = this._viewer?.getPlugin(PopmotionPlugin)\n        if (!popmotion) {\n            throw new Error('MaterialConfiguratorBasePlugin - PopmotionPlugin is required for animation, please add it to the viewer.')\n        }\n        this._viewer?.getPlugin(FrameFadePlugin)?.disable(MaterialConfiguratorBasePlugin.PluginType)\n        const anim = popmotion.animateNumber({\n            duration,\n            onUpdate: (v, dv) => {\n                this.applyVariation(variations, matUuidOrIndex, true, {t: v, dt: dv})\n            },\n            onComplete: () => {\n                this.applyVariation(variations, matUuidOrIndex, true, {t: 1, dt: 0})\n            },\n            onEnd: ()=>{\n                if (variations._animation !== anim) return\n                variations._animation = undefined\n            },\n        })\n        variations._animation = anim\n        await variations._animation?.promise\n        this._viewer?.getPlugin(FrameFadePlugin)?.enable(MaterialConfiguratorBasePlugin.PluginType)\n    }\n\n    /**\n     * Get the preview for a material variation\n     * Should be called from preFrame ideally. (or preRender but set viewerSetDirty = false)\n     * @param preview - Type of preview. Could be generate:sphere, generate:cube, color, map, emissive, etc.\n     * @param material - Material or index of the material in the variation.\n     * @param viewerSetDirty - call viewer.setDirty() after setting the preview. So that the preview is cleared from the canvas.\n     */\n    getPreview(material: IMaterial, preview: string, viewerSetDirty = true): string {\n        if (!this._viewer) return ''\n        // const m = typeof material === 'number' ? variation.materials[material] : material\n        const m = material\n        if (!m) return ''\n        let image = ''\n        if (!preview.startsWith('generate:')) {\n            const pp = (m as any)[preview] || '#ff00ff'\n            image = pp.image ? imageBitmapToBase64(pp.image, 100) : ''\n            if (!image.length) image = makeColorSvgCircle(pp.isColor ? (pp as Color).getHexString() : pp)\n        } else {\n            image = this._previewGenerator!.generate(m,\n                this._viewer.renderManager.renderer,\n                this._viewer.scene.environment,\n                preview.split(':')[1]\n            )\n        }\n        if (viewerSetDirty) this._viewer.setDirty() // because called from preFrame\n        return image\n    }\n\n    /**\n     * Refreshes the UI in the next frame\n     */\n    refreshUi(): void {\n        if (this.isDisabled() || !this._viewer || getOrCall(this.uiConfig.hidden)) return\n        this.dispatchEvent({type: 'refreshUi'})\n        this._uiNeedRefresh = true\n    }\n\n    private _refreshUiConfig() {\n        if (this.isDisabled()) return\n        this.uiConfig.uiRefresh?.(true, 'postFrame', 500) // don't call this.refreshUi here\n    }\n\n    // must be called from preFrame\n    protected async _refreshUi(): Promise<boolean> {\n        if (this.isDisabled()) return false\n        if (!this._viewer || !this._uiNeedRefresh) return false\n        this._uiNeedRefresh = false\n        this._refreshUiConfig()\n        return true\n    }\n\n    protected _preFrame() {\n        if (this.isDisabled()) return false\n        if (!this._viewer?.timeline.shouldRun() || !this.variations.length) return false\n        const time = this._viewer?.timeline.time\n        const delta = this._viewer?.timeline.delta || 0\n        const looping = this._viewer?.timeline.resetOnEnd ?? false\n\n        let applied = false\n        for (const variation of this.variations) {\n            if (!variation.timeline?.length) continue\n            const selected = variation.selectedIndex\n            const sortedTimeline = variation.timeline\n                .sort((a, b) => -a.time + b.time)\n            const selectedTime = sortedTimeline.find(t => t.time <= time)\n            const selectedItemI = selectedTime ? sortedTimeline.indexOf(selectedTime) : -1\n            const previousTime =\n                selectedItemI < sortedTimeline.length - 1 && selectedItemI >= 0 ?\n                    sortedTimeline[selectedItemI + 1] : // next item is the previous item because of sorting.\n                    looping && selectedItemI > 0 ? sortedTimeline[0] : undefined\n            const isSeeking = !this._viewer?.timeline.running\n\n            if (selectedTime) {\n                const notSelected = typeof selected === 'undefined' ||\n                    selectedTime.index !== selected && (typeof selected !== 'number' || selectedTime.index !== variation.materials[selected]?.uuid)\n                if (isSeeking || notSelected) {\n                    const start = selectedTime.time\n\n                    const duration = selectedTime.duration ?? 0.5\n\n                    let t = duration < 1e-6 ? 1 : (time - start) / duration\n                    let dt = duration < 1e-6 ? 0 : delta / duration\n\n                    // if (t <= 1 || isSeeking) { // seeking if not running\n                    if (t > 1) {\n                        t = 1\n                    }\n                    if (dt < 1e-6)\n                        dt = 1.0 / 60\n                    // dt = 1. - t // if delta is too small, we can assume we are at the end of the timeline (like when dragging) (dragging uses from value now)\n                    // dt = (1. - t) / 2\n                    // console.log(selectedItemI, previousTime?.index, t, dt)\n                    this.applyVariation(variation, selectedTime.index, t >= 1. - 0.00001, {\n                        t, dt,\n                        from: isSeeking ? previousTime?.index : undefined,\n                        rm: this._viewer?.renderManager,\n                    })\n                    applied = true\n                    // }\n                }\n            }\n        }\n\n        return applied\n    }\n\n\n    @serialize()\n        variations: MaterialVariations[] = []\n\n    private _selectedMaterial = () => {\n        const selected = this._picking?.getSelectedObject()\n        if (!selected) return undefined\n        if ((selected as IMaterial).isMaterial) return selected as IMaterial\n        else {\n            const mat = ((selected as IObject3D)?.material || undefined) as IMaterial | undefined\n            if (Array.isArray(mat)) return mat[0]\n            return mat\n        }\n    }\n\n    protected _uicShowAllVariations = false\n\n    createVariationsUiConfig(v?: MaterialVariations) {\n        // if(!v) v = this.getSelectedVariation()\n        if (!v) return undefined\n        return {\n            type: 'folder',\n            label: v.title,\n            uuid: v.uuid,\n            children: [\n                {\n                    type: 'input',\n                    label: 'mapping',\n                    property: () => [v, 'uuid'],\n                    onChange: async() => this.refreshUi(),\n                },\n                {\n                    type: 'input',\n                    label: 'title',\n                    property: () => [v, 'title'],\n                    onChange: async() => this.refreshUi(),\n                },\n                {\n                    type: 'dropdown',\n                    label: 'Preview Type',\n                    property: () => [v, 'preview'],\n                    onChange: async() => this.refreshUi(),\n                    children: ['generate:sphere', 'generate:cube', 'color', 'map', 'emissive', ...Object.keys(PhysicalMaterial.MaterialProperties).filter(x => x.endsWith('Map'))].map(k => ({\n                        label: k,\n                        value: k,\n                    })),\n                },\n                {\n                    type: 'checkbox',\n                    label: 'regex mapping',\n                    // hidden: () => !this._selectedMaterial()/* || this.getSelectedVariation()?.uuid.match(/[.*+?[\\](){}^$|\\\\]/) === null*/,\n                    property: () => [v, 'regex'],\n                    onChange: async() => this.refreshUi(),\n                },\n\n                ...v.materials.map(m => {\n                    return m.uiConfig ? Object.assign(m.uiConfig, {expanded: false}) : {}\n                }),\n            ],\n        }\n    }\n\n    uiConfig: UiObjectConfig = {\n        label: 'Material Configurator',\n        type: 'folder',\n        // expanded: true,\n        children: [\n            () => [\n                {\n                    type: 'input',\n                    label: 'uuid',\n                    property: [this._selectedMaterial(), 'uuid'],\n                    hidden: () => !this._selectedMaterial(),\n                    disabled: true,\n                },\n                this.createVariationsUiConfig(this.getSelectedVariation()) ?? (this._uicShowAllVariations ? {} : {\n                    type: 'button',\n                    label: 'Select a material to see or add variations',\n                    readOnly: true,\n                }),\n                this._uicShowAllVariations && !this._selectedMaterial() ? this.variations.map(v => this.createVariationsUiConfig(v)) : [],\n                {\n                    type: 'button',\n                    label: 'Clear variations',\n                    hidden: () => !this.getSelectedVariation(),\n                    value: async() => {\n                        const v = this.getSelectedVariation()\n                        if (v && await this._viewer!.dialog.confirm('Material configurator: Remove all variations for this material?')) v.materials = []\n                        this.refreshUi()\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Remove completely',\n                    hidden: () => !this.getSelectedVariation(),\n                    value: async() => {\n                        const v = this.getSelectedVariation()\n                        if (v && await this._viewer!.dialog.confirm('Material configurator: Remove this variation?')) {\n                            this.removeVariation(v)\n                        }\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Add Variation',\n                    hidden: () => !this._selectedMaterial(),\n                    value: async() => {\n                        const mat = this._selectedMaterial()\n                        if (!mat) return\n                        if (!mat.name && !await this._viewer?.dialog.confirm('Material configurator: Material has no name. Use uuid instead?')) return\n                        this.addVariation(mat)\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Refresh Ui',\n                    value: () => this.refreshUi(),\n                },\n                {\n                    type: 'button',\n                    label: 'Apply All',\n                    value: () => {\n                        this.variations.forEach(v => this.applyVariation(v, v.materials[0].uuid))\n                    },\n                },\n                {\n                    type: 'checkbox',\n                    label: 'Show All',\n                    hidden: () => this._selectedMaterial(),\n                    property: () => [this, '_uicShowAllVariations'],\n                    onChange: async() => this.uiConfig?.uiRefresh?.(),\n                },\n            ],\n        ],\n    }\n\n    removeVariationForMaterial(material: IMaterial) {\n        let variation = this.findVariation(material.uuid)\n        if (!variation && material.name.length > 0) variation = this.findVariation(material.name)\n        if (variation) this.removeVariation(variation)\n    }\n    removeVariation(variation: MaterialVariations) {\n        if (!variation) return\n        this.variations.splice(this.variations.indexOf(variation), 1)\n        this.refreshUi()\n    }\n    addVariation(material?: IMaterial, variationKey?: string, cloneMaterial = true) {\n        const clone = cloneMaterial && material?.clone ? material.clone() : material\n        if (material && clone) {\n            let variation = this.findVariation(variationKey ?? material.uuid)\n            if (!variation && !variationKey && material.name.length > 0) variation = this.findVariation(material.name)\n            if (!variation) {\n                variation = this.createVariation(material, variationKey)\n            }\n            variation.materials.push(clone)\n            this.refreshUi()\n        }\n    }\n\n    createVariation(material: IMaterial, variationKey?: string) {\n        this.variations.push({\n            uuid: variationKey ?? material.name.length > 0 ? escapeRegExp(material.name) : material.uuid,\n            title: material.name.length > 0 ? material.name : 'No Name',\n            preview: 'generate:sphere',\n            materials: [],\n            regex: true,\n        })\n        return this.variations[this.variations.length - 1]\n    }\n}\n\nexport interface MaterialVariations {\n    /**\n     * The name or the uuid of the material in the scene\n     */\n    uuid: string\n    /**\n     * Title to show in the UI\n     */\n    title: string\n    preview: keyof PhysicalMaterial | 'generate:sphere' | 'generate:cube' | 'generate:cylinder'\n    materials: IMaterial[]\n    data?: {\n        icon?: string,\n        [key: string]: any\n    }[]\n    /**\n     * Whether to use regex to match the material name.\n     * @default true\n     */\n    regex?: boolean\n    selectedIndex?: number | string\n    /**\n     * Keyframes for the viewer timeline animation\n     */\n    timeline?: {\n        time: number,\n        index: number|string,\n        duration?: number,\n    }[]\n\n    _animation?: AnimationResult\n}\n","import {Object3D, Vector3} from 'three'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {PickingPlugin} from '../interaction/PickingPlugin'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {serialize} from 'ts-browser-helpers'\nimport {snapObject} from '../../three'\nimport {IObject3D} from '../../core'\n\n/**\n * Switch Node Plugin (Base)\n *\n * This plugin allows you to configure object variations in a file and apply them in the scene.\n * Each SwitchNode is a parent object with multiple direct children. Only one child is visible at a time.\n * This works by toggling the `visible` property of the children of a parent object.\n * The plugin interfaces with the picking plugin and also provides uiConfig to show and edit the variations.\n * It also provides a function to create snapshot previews of individual variations. This creates a limited render of the object with the selected child visible.\n * To get a proper render, it's better to render it offline and set the image as a preview.\n *\n * See `SwitchNodePlugin` in [plugin-configurator](https://threepipe.org/plugins/configurator/docs/index.html) for example on inheriting with a custom UI renderer.\n *\n * @category Plugins\n */\nexport class SwitchNodeBasePlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'SwitchNodePlugin'\n\n    enabled = true\n    private _picking: PickingPlugin | undefined\n    private _uiNeedRefresh = false\n\n    constructor() {\n        super()\n\n        this._postFrame = this._postFrame.bind(this)\n        this.refreshUiConfig = this.refreshUiConfig.bind(this)\n        this.addEventListener('deserialize', async() => {\n            // await timeout(200) // not needed actually\n            this.refreshUi()\n        })\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.forPlugin(PickingPlugin, (p) => {\n            this._picking = p\n            this._picking?.addEventListener('selectedObjectChanged', this.refreshUiConfig)\n        }, () => {\n            this._picking?.removeEventListener('selectedObjectChanged', this.refreshUiConfig)\n            this._picking = undefined\n        }, this)\n        viewer.addEventListener('postFrame', this._postFrame)\n    }\n    onRemove(viewer: ThreeViewer) {\n        this._picking?.removeEventListener('selectedObjectChanged', this.refreshUiConfig)\n        this._picking = undefined\n        viewer.removeEventListener('postFrame', this._postFrame)\n        super.onRemove(viewer)\n    }\n\n    protected _postFrame() {\n        if (this._uiNeedRefresh) this._refreshUi() // only call this from here.\n    }\n\n    /**\n     * Whether refreshScene should be called when a node is selected. Refreshing scene will notify the plugins about the update, like shadows can be baked.\n     * Disable this when nothing significant geometry/node changes happen when switch nodes are changed.\n     */\n    @serialize() refreshScene = true\n\n    /**\n     * Select a switch node variation with name or uuid.\n     * @param node\n     * @param nameOrUuid\n     * @param setDirty - set dirty in the viewer after update.\n     */\n    selectNode(node: ObjectSwitchNode, nameOrUuid: string|number, setDirty = true) {\n        const obj = this._viewer?.scene.getObjectByName(node.name)\n        if (!obj || obj.children.length < 1) return\n        const child = typeof nameOrUuid === 'number' ?\n            obj.children[nameOrUuid] :\n            obj.children.find(c => c.name === nameOrUuid || c.uuid === nameOrUuid)\n        if (!child) {\n            this._viewer?.console.warn('SwitchNodePlugin: child not found', nameOrUuid)\n            return false\n        }\n        node.selected = child.name || child.uuid\n        let changed = false\n        for (const child1 of obj.children) {\n            const visible = child1.visible\n            child1.visible = (child1.name || child1.uuid) === node.selected\n            changed = changed || visible !== child1.visible\n        }\n        if (changed && setDirty) this._viewer!.scene.setDirty({refreshScene: this.refreshScene, frameFade: true})\n        return changed\n    }\n\n\n    /**\n     * Apply all variations(by selected index or first item) when a config is loaded\n     */\n    applyOnLoad = true\n\n    /**\n     * Reapply all selected variations again.\n     * Useful when the scene is loaded or changed and the variations are not applied.\n     */\n    reapplyAll() {\n        this.variations.forEach(v => this.selectNode(v, v.selected || 0, false))\n        this._viewer!.scene.setDirty({refreshScene: true, frameFade: true})\n    }\n\n    fromJSON(data: any, meta?: any): this | Promise<this | null> | null {\n        this.variations = []\n        if (!super.fromJSON(data, meta)) return null // its not a promise\n        if (data.applyOnLoad === undefined) { // old files\n            this.applyOnLoad = true // setting true because all the items will be visible otherwise.\n        }\n        if (this.applyOnLoad) this.reapplyAll()\n        return this\n    }\n\n    refreshUi() {\n        if (!this.enabled) return\n        this._uiNeedRefresh = true\n    }\n\n    protected _refreshUi(): boolean {\n        if (!this.enabled) return false\n        if (!this._viewer) return false\n        this._uiNeedRefresh = false\n        if (this.autoSnapIcons) this.snapIcons()\n\n        this.refreshUiConfig()\n        return true\n    }\n\n    refreshUiConfig() {\n        if (!this.enabled) return\n        this.uiConfig.uiRefresh?.()\n    }\n\n    @serialize() variations: ObjectSwitchNode[] = []\n\n    protected _selectedSwitchNode = (): Object3D | undefined => {\n        const obj = this._picking?.getSelectedObject<IObject3D>() // (?.material || undefined) as IMaterial | undefined\n        if (!obj?.isObject3D) return undefined\n        const nodes = this.variations.map(v => v.name)\n        let found: Object3D | undefined = undefined\n        obj.traverseAncestors(a => {\n            if (found) return\n            if (!a.name) return\n            if (nodes.includes(a.name)) found = a\n        })\n        return found\n    }\n\n    /**\n     * Get the preview for a switch node variation\n     * Should be called from preFrame ideally. (or preRender but set viewerSetDirty = false)\n     * @param child - Child Object to get the preview for\n     * @param variation - Switch node variation that contains the child.\n     * @param viewerSetDirty - call viewer.setDirty() after setting the preview. So that the preview is cleared from the canvas.\n     */\n    getPreview(variation: ObjectSwitchNode, child: Object3D, viewerSetDirty = true): string {\n        if (!this._viewer || !variation) return ''\n        // const m = typeof material === 'number' ? variation.materials[material] : material\n        const cv = variation.camView\n        const camOffset = new Vector3(\n            (cv.includes('right') ? 1 : 0) - (cv.includes('left') ? 1 : 0),\n            (cv.includes('top') ? 1 : 0) - (cv.includes('bottom') ? 1 : 0),\n            (cv.includes('front') ? 1 : 0) - (cv.includes('back') ? 1 : 0)\n        )\n        if (!variation.camDistance) variation.camDistance = 1\n        const image = snapObject(this._viewer!.renderManager.renderer, child, this._viewer?.scene, 7, camOffset.multiplyScalar(variation.camDistance * 2))\n        if (viewerSetDirty) this._viewer.setDirty() // because called from preFrame\n        return image\n    }\n\n    addNode(node: ObjectSwitchNode, refreshUi = true) {\n        this.variations.push(node)\n        if (refreshUi) this.refreshUi()\n    }\n\n    /**\n     * If true, the plugin will automatically take snapshots of the icons in _refreshUi and put them in the object.userdata.__icon\n     * Otherwise, call {@link snapIcons} manually\n     */\n    autoSnapIcons = false\n\n    /**\n     * Snapshots icons and puts in the userdata.__icon\n     */\n    snapIcons() {\n        for (const variation of this.variations) {\n            const obj = this._viewer!.scene.getObjectByName(variation.name)\n            if (!obj) {\n                console.warn('no object found for variation, skipping', variation)\n                continue\n            }\n            if (obj.children.length < 1) {\n                console.warn('SwitchNode does not have enough children', variation)\n            }\n\n            for (const child of obj.children) {\n                if (child.userData.__icon) continue\n                const image = this.getPreview(variation, child, false)\n                if (image) child.userData.__icon = image\n            }\n        }\n    }\n\n    uiConfig: UiObjectConfig = {\n        label: 'Switch Node Plugin',\n        type: 'folder',\n        // expanded: true,\n        children: [\n            {\n                type: 'checkbox',\n                label: 'Enabled',\n                property: [this, 'enabled'],\n            },\n            () => [\n                {\n                    type: 'folder',\n                    label: 'All nodes',\n                    expanded: true,\n                    children: [\n                        this.variations.map(v => ({\n                            type: 'input',\n                            label: v.title,\n                            property: [v, 'name'],\n                            onChange: () => this.refreshUi(),\n                        })),\n                    ],\n                },\n                {\n                    type: 'button',\n                    label: 'Add Node',\n                    value: () => {\n                        this.addNode({\n                            name: 'switch_node',\n                            selected: '',\n                            title: 'Switch Node',\n                            camView: 'front',\n                            camDistance: 1,\n                        })\n                    },\n                },\n                {\n                    type: 'button',\n                    label: 'Refresh UI',\n                    value: () => this.refreshUi(),\n                },\n                {\n                    type: 'input',\n                    label: 'Selected node title',\n                    hidden: () => !this._selectedSwitchNode(),\n                    property: () => {\n                        const node = this._selectedSwitchNode()\n                        if (!node) return []\n                        return [this.variations.find(v => v.name === node.name), 'title']\n                    },\n                    onChange: () => this.refreshUi(),\n                },\n                {\n                    type: 'slider',\n                    bounds: [0.01, 2],\n                    stepSize: 0.01,\n                    label: 'Cam Distance',\n                    hidden: () => !this._selectedSwitchNode(),\n                    property: () => {\n                        const node = this._selectedSwitchNode()\n                        if (!node) return []\n                        return [this.variations.find(v => v.name === node.name), 'camDistance']\n                    },\n                    // onChange: ()=> this.refreshUi(),\n                },\n                {\n                    type: 'dropdown',\n                    label: 'Cam View',\n                    hidden: () => !this._selectedSwitchNode(),\n                    property: () => {\n                        const node = this._selectedSwitchNode()\n                        if (!node) return []\n                        return [this.variations.find(v => v.name === node.name), 'camView']\n                    },\n                    onChange: () => this.refreshUi(),\n                    children: ['top', 'bottom', 'front', 'back', 'left', 'right'].map(k => ({\n                        label: k,\n                        value: k,\n                    })),\n                },\n\n            ],\n        ],\n    }\n\n}\n\nexport interface ObjectSwitchNode{\n    name: string,\n    title: string,\n    selected: string,\n    camView: 'top'|'bottom'|'front'|'back'|'left'|'right'|string,\n    camDistance: number,\n}\n","import {BufferAttribute, BufferGeometry, Float32BufferAttribute} from 'three'\nimport {Class, getOrCall} from 'ts-browser-helpers'\nimport {generateUiConfig, UiObjectConfig} from 'uiconfig.js'\nimport {IGeometry} from '../../core/IGeometry'\nimport {IMaterial} from '../../core/IMaterial'\nimport {IObject3D} from '../../core/IObject'\nimport {BufferGeometry2} from '../../core/geometry/BufferGeometry2'\nimport {LineGeometry2} from '../../core/geometry/LineGeometry2'\nimport {Mesh2} from '../../core/object/Mesh2'\nimport {PhysicalMaterial} from '../../core/material/PhysicalMaterial'\n\nexport interface GeometryGenerator<T=any>{\n    generate(g?: IGeometry, parameters?: T): IGeometry\n    createUiConfig?(geometry: IGeometry): UiObjectConfig[]\n}\n\nfunction updateAttribute<T extends BufferAttribute=Float32BufferAttribute>(geometry: BufferGeometry, attribute: string, itemSize: number, array: T | number[], cls?: Class<T>) {\n    const attr = geometry.getAttribute(attribute) as T\n    const count = Array.isArray(array) ? array.length / itemSize : array.count\n    if (attr && attr.count === count) {\n        attr.set(Array.isArray(array) ? array : (array as T).array)\n        attr.needsUpdate = true\n    } else {\n        geometry.setAttribute(attribute, Array.isArray(array) ? new (cls ?? Float32BufferAttribute)(array, itemSize) : array as T)\n    }\n    return attr\n}\n\nfunction updateIndices(geometry: BufferGeometry, indices: number[] | BufferAttribute) {\n    const index = geometry.index\n    if (index && index.count === (Array.isArray(indices) ? indices.length : indices.count)) {\n        index.set(Array.isArray(indices) ? indices : (indices as BufferAttribute).array)\n        index.needsUpdate = true // todo: wireframe attribute is not updating\n    } else geometry.setIndex(indices)\n}\n\nexport function updateUi(geometry: BufferGeometry, childrenUi: () => UiObjectConfig[]) {\n    const uiConfig = (geometry as any).uiConfig as UiObjectConfig\n    if (!uiConfig) return\n    let oldUi = uiConfig.children?.find((c) => typeof c === 'object' && c.tags?.includes('generatedGeometry')) as UiObjectConfig | undefined\n    if (!oldUi) {\n        oldUi = {\n            type: 'folder',\n            label: 'Generation Params',\n            expanded: true,\n            tags: ['generatedGeometry'],\n            children: [],\n        }\n        const dividerIndex = uiConfig.children?.findIndex((c) => typeof c === 'object' && (c.type === 'divider' || c.type === 'separator')) ?? -1\n        if (dividerIndex >= 0) {\n            uiConfig.children?.splice(dividerIndex, 0, oldUi)\n        } else uiConfig.children?.push(oldUi)\n    }\n    if (geometry.userData.__generationParamsUiType !== geometry.userData.generationParams.type) {\n        oldUi.children = childrenUi()\n        geometry.userData.__generationParamsUiType = geometry.userData.generationParams.type\n        oldUi.uiRefresh?.(true, 'postFrame')\n    }\n}\n\nexport function removeUi(geometry: BufferGeometry) {\n    const uiConfig = (geometry as any).uiConfig as UiObjectConfig\n    if (!uiConfig) return\n    const index = uiConfig.children?.findIndex((c) => typeof c === 'object' && c.tags?.includes('generatedGeometry')) ?? -1\n    if (index >= 0) {\n        uiConfig.children?.splice(index, 1)\n        uiConfig.uiRefresh?.(true, 'postFrame')\n    }\n}\n\n/**\n * Abstract base class for geometry generators.\n *\n * Provides the framework for generating parametric geometries with automatic\n * UI configuration and buffer management. Subclasses implement {@link _generateData}\n * to define the actual vertex/index data for a specific geometry type.\n *\n * @category Plugins\n */\nexport abstract class AGeometryGenerator<Tp extends object=any, Tt extends string = string> implements GeometryGenerator<Tp> {\n    constructor(public type: Tt) {\n    }\n\n    abstract defaultParams: Tp\n\n    defaultMeshClass: ()=>Class<IObject3D> = ()=>Mesh2\n    defaultMaterialClass?: ()=>Class<IMaterial> = ()=>PhysicalMaterial\n    defaultGeometryClass?: ()=>Class<IGeometry> = ()=>BufferGeometry2\n\n    createUiConfig(geometry: IGeometry): UiObjectConfig[] {\n        if (!geometry.userData.generationParams) return []\n        const ui = (generateUiConfig(geometry.userData.generationParams)\n            ?.flatMap(v=>getOrCall(v))\n            .filter(v=>getOrCall(v.property)?.[1] !== 'type') || []) as UiObjectConfig[]\n        ui.forEach(u=> {\n            u.onChange = () => this.generate(geometry)\n        })\n        return ui\n    }\n\n    protected abstract _generateData(params: Tp): {\n        indices?: number[] | BufferAttribute\n        vertices: number[] | BufferAttribute\n        normals?: number[] | BufferAttribute\n        uvs?: number[] | BufferAttribute\n        groups?: {start: number, count: number, materialIndex?: number}[]\n        positions?: number[] // for lines\n    }\n\n    generate(g?: IGeometry, parameters: Partial<Tp> = {}): IGeometry|BufferGeometry2 {\n        const geometry: IGeometry = g ?? new BufferGeometry2()\n        if ((parameters as any).type && (parameters as any).type !== this.type) {\n            console.error('Cannot change type of generated geometry here, use the plugin instead')\n            return geometry\n        }\n        if (!geometry.userData.generationParams) geometry.userData.generationParams = {type: this.type}\n        geometry.userData.generationParams.type = this.type\n        const params = {\n            ...this.defaultParams,\n            ...geometry.userData.generationParams,\n            ...parameters,\n            type: this.type,\n        } as Tp\n\n        const {indices, vertices, normals, uvs, groups, positions} = this._generateData(params)\n\n        if (positions !== undefined && (geometry as LineGeometry2).setPositions) {\n            (geometry as LineGeometry2).setPositions(positions)\n        } else {\n            // console.log(indices, vertices, normals, uvs, groups)\n            indices && updateIndices(geometry, indices)\n            vertices && updateAttribute(geometry, 'position', 3, vertices)\n            normals && updateAttribute(geometry, 'normal', 3, normals)\n            uvs && updateAttribute(geometry, 'uv', 2, uvs)\n        }\n\n        if (groups) {\n            geometry.clearGroups()\n            for (const group of groups) {\n                geometry.addGroup(group.start, group.count, group.materialIndex)\n            }\n        }\n\n        geometry.computeBoundingBox && geometry.computeBoundingBox()\n        geometry.computeBoundingSphere && geometry.computeBoundingSphere()\n\n        // todo clean params with only allowed properties\n        Object.assign(geometry.userData.generationParams, params)\n\n        const childrenUi = ()=>this.createUiConfig(geometry)\n        updateUi(geometry, childrenUi)\n\n        geometry.setDirty()\n        return geometry\n    }\n\n    setDefaultParams(params: Partial<Tp>) {\n        Object.assign(this.defaultParams, params)\n        return this\n    }\n}\n","import {Vector3} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\n\n\nexport interface TorusGeometryGeneratorParams {\n    radius: number,\n    tube: number,\n    radialSegments: number,\n    tubularSegments: number,\n    arc: number\n}\n\nexport class TorusGeometryGenerator extends AGeometryGenerator<TorusGeometryGeneratorParams> {\n\n    constructor(type = 'torus', defaultParams?: Partial<TorusGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: TorusGeometryGeneratorParams = {\n        radius: 1,\n        tube: 0.4,\n        radialSegments: 12,\n        tubularSegments: 48,\n        arc: Math.PI * 2,\n    }\n\n    protected _generateData(params: TorusGeometryGeneratorParams) {\n        const {radius, tube, arc} = params\n        let {radialSegments, tubularSegments} = params\n\n        radialSegments = Math.floor(radialSegments)\n        tubularSegments = Math.floor(tubularSegments)\n\n        // buffers\n\n        const indices = []\n        const vertices = []\n        const normals = []\n        const uvs = []\n\n        // helper variables\n\n        const center = new Vector3()\n        const vertex = new Vector3()\n        const normal = new Vector3()\n\n        // generate vertices, normals and uvs\n\n        for (let j = 0; j <= radialSegments; j++) {\n\n            for (let i = 0; i <= tubularSegments; i++) {\n\n                const u = i / tubularSegments * arc\n                const v = j / radialSegments * Math.PI * 2\n\n                // vertex\n\n                vertex.x = (radius + tube * Math.cos(v)) * Math.cos(u)\n                vertex.y = (radius + tube * Math.cos(v)) * Math.sin(u)\n                vertex.z = tube * Math.sin(v)\n\n                vertices.push(vertex.x, vertex.y, vertex.z)\n\n                // normal\n\n                center.x = radius * Math.cos(u)\n                center.y = radius * Math.sin(u)\n                normal.subVectors(vertex, center).normalize()\n\n                normals.push(normal.x, normal.y, normal.z)\n\n                // uv\n\n                uvs.push(i / tubularSegments)\n                uvs.push(j / radialSegments)\n\n            }\n\n        }\n\n        // generate indices\n\n        for (let j = 1; j <= radialSegments; j++) {\n\n            for (let i = 1; i <= tubularSegments; i++) {\n\n                // indices\n\n                const a = (tubularSegments + 1) * j + i - 1\n                const b = (tubularSegments + 1) * (j - 1) + i - 1\n                const c = (tubularSegments + 1) * (j - 1) + i\n                const d = (tubularSegments + 1) * j + i\n\n                // faces\n\n                indices.push(a, b, d)\n                indices.push(b, c, d)\n\n            }\n\n        }\n\n        return {indices, vertices, normals, uvs}\n    }\n\n}\n","import {Vector2, Vector3} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\n\n\nexport interface CircleGeometryGeneratorParams {\n    radius: number,\n    segments: number,\n    thetaStart: number,\n    thetaLength: number\n}\n\nexport class CircleGeometryGenerator extends AGeometryGenerator<CircleGeometryGeneratorParams> {\n\n    constructor(type = 'circle', defaultParams?: Partial<CircleGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: CircleGeometryGeneratorParams = {\n        radius: 1,\n        segments: 32,\n        thetaStart: 0,\n        thetaLength: Math.PI * 2,\n    }\n\n    protected _generateData(params: CircleGeometryGeneratorParams) {\n        const {radius, thetaStart, thetaLength} = params\n\n        const segments = Math.max(3, params.segments)\n\n        // buffers\n\n        const indices = []\n        const vertices = []\n        const normals = []\n        const uvs = []\n\n        // helper variables\n\n        const vertex = new Vector3()\n        const uv = new Vector2()\n\n        // center point\n\n        vertices.push(0, 0, 0)\n        normals.push(0, 0, 1)\n        uvs.push(0.5, 0.5)\n\n        for (let s = 0, i = 3; s <= segments; s++, i += 3) {\n\n            const segment = thetaStart + s / segments * thetaLength\n\n            // vertex\n\n            vertex.x = radius * Math.cos(segment)\n            vertex.y = radius * Math.sin(segment)\n\n            vertices.push(vertex.x, vertex.y, vertex.z)\n\n            // normal\n\n            normals.push(0, 0, 1)\n\n            // uvs\n\n            uv.x = (vertices[ i ] / radius + 1) / 2\n            uv.y = (vertices[ i + 1 ] / radius + 1) / 2\n\n            uvs.push(uv.x, uv.y)\n\n        }\n\n        // indices\n\n        for (let i = 1; i <= segments; i++) {\n\n            indices.push(i, i + 1, 0)\n\n        }\n\n        return {indices, vertices, normals, uvs}\n    }\n\n}\n","import {Vector3} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\n\n\nexport interface BoxGeometryGeneratorParams {\n    width: number,\n    height: number,\n    depth: number,\n    widthSegments: number,\n    heightSegments: number,\n    depthSegments: number\n}\n\nexport class BoxGeometryGenerator extends AGeometryGenerator<BoxGeometryGeneratorParams> {\n\n    constructor(type = 'box', defaultParams?: Partial<BoxGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: BoxGeometryGeneratorParams = {\n        width: 1,\n        height: 1,\n        depth: 1,\n        widthSegments: 1,\n        heightSegments: 1,\n        depthSegments: 1,\n    }\n\n    // helper variables\n\n    protected _buildPlane(state: any, u: 'x'|'y'|'z', v: 'x'|'y'|'z', w: 'x'|'y'|'z', udir: number, vdir: number, width: number, height: number, depth: number, gridX: number, gridY: number, materialIndex: number) {\n        const {indices, vertices, normals, uvs, numberOfVertices, groupStart, groups} = state\n\n        const segmentWidth = width / gridX\n        const segmentHeight = height / gridY\n\n        const widthHalf = width / 2\n        const heightHalf = height / 2\n        const depthHalf = depth / 2\n\n        const gridX1 = gridX + 1\n        const gridY1 = gridY + 1\n\n        let vertexCounter = 0\n        let groupCount = 0\n\n        const vector = new Vector3()\n\n        // generate vertices, normals and uvs\n        for (let iy = 0; iy < gridY1; iy++) {\n            const y = iy * segmentHeight - heightHalf\n            for (let ix = 0; ix < gridX1; ix++) {\n                const x = ix * segmentWidth - widthHalf\n                // set values to correct vector component\n                vector[ u ] = x * udir\n                vector[ v ] = y * vdir\n                vector[ w ] = depthHalf\n                // now apply vector to vertex buffer\n                vertices.push(vector.x, vector.y, vector.z)\n                // set values to correct vector component\n                vector[ u ] = 0\n                vector[ v ] = 0\n                vector[ w ] = depth > 0 ? 1 : -1\n                // now apply vector to normal buffer\n                normals.push(vector.x, vector.y, vector.z)\n                // uvs\n                uvs.push(ix / gridX)\n                uvs.push(1 - iy / gridY)\n                // counters\n                vertexCounter += 1\n            }\n        }\n        // indices\n        // 1. you need three indices to draw a single face\n        // 2. a single segment consists of two faces\n        // 3. so we need to generate six (2*3) indices per segment\n        for (let iy = 0; iy < gridY; iy++) {\n            for (let ix = 0; ix < gridX; ix++) {\n                const a = numberOfVertices + ix + gridX1 * iy\n                const b = numberOfVertices + ix + gridX1 * (iy + 1)\n                const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1)\n                const d = numberOfVertices + (ix + 1) + gridX1 * iy\n                // faces\n                indices.push(a, b, d)\n                indices.push(b, c, d)\n                // increase counter\n                groupCount += 6\n            }\n        }\n        // add a group to the geometry. this will ensure multi material support\n        groups.push({start: groupStart, count: groupCount, materialIndex})\n        // calculate new start value for groups\n        state.groupStart += groupCount\n        // update total number of vertices\n        state.numberOfVertices += vertexCounter\n    }\n\n    protected _generateData(params: BoxGeometryGeneratorParams) {\n        const {width, height, depth} = params\n        let {widthSegments, heightSegments, depthSegments} = params\n\n        // segments\n        widthSegments = Math.floor(widthSegments)\n        heightSegments = Math.floor(heightSegments)\n        depthSegments = Math.floor(depthSegments)\n\n        // buffers\n\n        const state = {\n            indices: [],\n            vertices: [],\n            normals: [],\n            uvs: [],\n            numberOfVertices: 0,\n            groupStart: 0,\n            groups: [],\n        }\n\n        // build each side of the box geometry\n\n        this._buildPlane(state, 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0) // px\n        this._buildPlane(state, 'z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1) // nx\n        this._buildPlane(state, 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2) // py\n        this._buildPlane(state, 'x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3) // ny\n        this._buildPlane(state, 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4) // pz\n        this._buildPlane(state, 'x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5) // nz\n\n        return state\n    }\n\n}\n","import {Vector3} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\n\nexport interface SphereGeometryGeneratorParams {\n    radius: number,\n    widthSegments: number,\n    heightSegments: number,\n    phiStart: number,\n    phiLength: number,\n    thetaStart: number,\n    thetaLength: number,\n}\n\nexport class SphereGeometryGenerator<Tt extends string= 'sphere'> extends AGeometryGenerator<SphereGeometryGeneratorParams, Tt> {\n\n    constructor(type: Tt = 'sphere' as Tt, defaultParams?: Partial<SphereGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: SphereGeometryGeneratorParams = {\n        radius: 1,\n        widthSegments: 32,\n        heightSegments: 16,\n        phiStart: 0,\n        phiLength: Math.PI * 2,\n        thetaStart: 0,\n        thetaLength: Math.PI,\n    }\n\n    protected _generateData(params: SphereGeometryGeneratorParams) {\n        const {radius, phiStart, phiLength, thetaStart, thetaLength} = params\n        let {widthSegments, heightSegments} = params\n\n        widthSegments = Math.max(3, Math.floor(widthSegments))\n        heightSegments = Math.max(2, Math.floor(heightSegments))\n\n        const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI)\n\n        let index = 0\n        const grid = []\n\n        const vertex = new Vector3()\n        const normal = new Vector3()\n\n        // buffers\n\n        const indices = []\n        const vertices = []\n        const normals = []\n        const uvs = []\n\n        // generate vertices, normals and uvs\n        for (let iy = 0; iy <= heightSegments; iy++) {\n            const verticesRow = []\n            const v = iy / heightSegments\n            // special case for the poles\n            let uOffset = 0\n            if (iy === 0 && thetaStart === 0) {\n                uOffset = 0.5 / widthSegments\n            } else if (iy === heightSegments && thetaEnd === Math.PI) {\n                uOffset = -0.5 / widthSegments\n            }\n            for (let ix = 0; ix <= widthSegments; ix++) {\n                const u = ix / widthSegments\n                // vertex\n                vertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength)\n                vertex.y = radius * Math.cos(thetaStart + v * thetaLength)\n                vertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength)\n                vertices.push(vertex.x, vertex.y, vertex.z)\n                // normal\n                normal.copy(vertex).normalize()\n                normals.push(normal.x, normal.y, normal.z)\n                // uv\n                uvs.push(u + uOffset, 1 - v)\n                verticesRow.push(index++)\n            }\n            grid.push(verticesRow)\n        }\n        // indices\n        for (let iy = 0; iy < heightSegments; iy++) {\n            for (let ix = 0; ix < widthSegments; ix++) {\n                const a = grid[iy][ix + 1]\n                const b = grid[iy][ix]\n                const c = grid[iy + 1][ix]\n                const d = grid[iy + 1][ix + 1]\n                if (iy !== 0 || thetaStart > 0) indices.push(a, b, d)\n                if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d)\n            }\n        }\n        return {indices, vertices, normals, uvs}\n    }\n\n}\n","import {AGeometryGenerator} from '../AGeometryGenerator'\n\n\nexport interface PlaneGeometryGeneratorParams {\n    width: number,\n    height: number,\n    widthSegments: number,\n    heightSegments: number\n}\n\nexport class PlaneGeometryGenerator extends AGeometryGenerator<PlaneGeometryGeneratorParams> {\n\n    constructor(type = 'plane', defaultParams?: Partial<PlaneGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: PlaneGeometryGeneratorParams = {\n        width: 1,\n        height: 1,\n        widthSegments: 2,\n        heightSegments: 2,\n    }\n\n    protected _generateData(params: PlaneGeometryGeneratorParams) {\n        const widthHalf = params.width / 2\n        const heightHalf = params.height / 2\n\n        const gridX = Math.floor(params.widthSegments)\n        const gridY = Math.floor(params.heightSegments)\n\n        const gridX1 = gridX + 1\n        const gridY1 = gridY + 1\n\n        const segmentWidth = params.width / gridX\n        const segmentHeight = params.height / gridY\n\n        const indices = []\n        const vertices = []\n        const normals = []\n        const uvs = []\n\n        for (let iy = 0; iy < gridY1; iy++) {\n            const y = iy * segmentHeight - heightHalf\n            for (let ix = 0; ix < gridX1; ix++) {\n                const x = ix * segmentWidth - widthHalf\n                vertices.push(x, -y, 0)\n                normals.push(0, 0, 1)\n                uvs.push(ix / gridX)\n                uvs.push(1 - iy / gridY)\n            }\n        }\n        for (let iy = 0; iy < gridY; iy++) {\n            for (let ix = 0; ix < gridX; ix++) {\n                const a = ix + gridX1 * iy\n                const b = ix + gridX1 * (iy + 1)\n                const c = ix + 1 + gridX1 * (iy + 1)\n                const d = ix + 1 + gridX1 * iy\n                indices.push(a, b, d)\n                indices.push(b, c, d)\n            }\n        }\n        return {indices, vertices, normals, uvs}\n    }\n\n}\n","import {Vector2, Vector3} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\n\n\nexport interface CylinderGeometryGeneratorParams {\n    radiusTop: number,\n    radiusBottom: number,\n    height: number,\n    radialSegments: number,\n    heightSegments: number,\n    openEnded: boolean,\n    thetaStart: number,\n    thetaLength: number\n}\n\nexport class CylinderGeometryGenerator extends AGeometryGenerator<CylinderGeometryGeneratorParams> {\n\n    constructor(type = 'cylinder', defaultParams?: Partial<CylinderGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: CylinderGeometryGeneratorParams = {\n        radiusTop: 1,\n        radiusBottom: 1,\n        height: 1,\n        radialSegments: 32,\n        heightSegments: 1,\n        openEnded: false,\n        thetaStart: 0,\n        thetaLength: Math.PI * 2,\n    }\n\n    protected _generateTorso(state: any) {\n        const {radiusTop, radiusBottom, height,\n            radialSegments, heightSegments,\n            thetaStart, thetaLength, indexArray, indices, groups,\n            vertices, normals, uvs, groupStart, halfHeight} = state\n\n        const normal = new Vector3()\n        const vertex = new Vector3()\n\n        let groupCount = 0\n\n        // this will be used to calculate the normal\n        const slope = (radiusBottom - radiusTop) / height\n\n        // generate vertices, normals and uvs\n\n        for (let y = 0; y <= heightSegments; y++) {\n            const indexRow = []\n            const v = y / heightSegments\n            // calculate the radius of the current row\n            const radius = v * (radiusBottom - radiusTop) + radiusTop\n            for (let x = 0; x <= radialSegments; x++) {\n                const u = x / radialSegments\n                const theta = u * thetaLength + thetaStart\n                const sinTheta = Math.sin(theta)\n                const cosTheta = Math.cos(theta)\n                // vertex\n                vertex.x = radius * sinTheta\n                vertex.y = -v * height + halfHeight\n                vertex.z = radius * cosTheta\n                vertices.push(vertex.x, vertex.y, vertex.z)\n                // normal\n                normal.set(sinTheta, slope, cosTheta).normalize()\n                normals.push(normal.x, normal.y, normal.z)\n                // uv\n                uvs.push(u, 1 - v)\n                // save index of vertex in respective row\n                indexRow.push(state.index++)\n            }\n            // now save vertices of the row in our index array\n            indexArray.push(indexRow)\n        }\n        // generate indices\n        for (let x = 0; x < radialSegments; x++) {\n            for (let y = 0; y < heightSegments; y++) {\n                // we use the index array to access the correct indices\n                const a = indexArray[ y ][ x ]\n                const b = indexArray[ y + 1 ][ x ]\n                const c = indexArray[ y + 1 ][ x + 1 ]\n                const d = indexArray[ y ][ x + 1 ]\n                // faces\n                indices.push(a, b, d)\n                indices.push(b, c, d)\n                // update group counter\n                groupCount += 6\n            }\n        }\n        // add a group to the geometry. this will ensure multi material support\n        groups.push({start: groupStart, count: groupCount, materialIndex: 0})\n        // calculate new start value for groups\n        state.groupStart += groupCount\n    }\n    protected _generateCap(state: any, top: boolean) {\n        const {radiusTop, radiusBottom,\n            radialSegments,\n            thetaStart, thetaLength, indices, groups,\n            vertices, normals, uvs, groupStart, halfHeight} = state\n        // save the index of the first center vertex\n        const centerIndexStart = state.index\n        const uv = new Vector2()\n        const vertex = new Vector3()\n        let groupCount = 0\n        const radius = top === true ? radiusTop : radiusBottom\n        const sign = top === true ? 1 : -1\n        // first we generate the center vertex data of the cap.\n        // because the geometry needs one set of uvs per face,\n        // we must generate a center vertex per face/segment\n        for (let x = 1; x <= radialSegments; x++) {\n            // vertex\n            vertices.push(0, halfHeight * sign, 0)\n            // normal\n            normals.push(0, sign, 0)\n            // uv\n            uvs.push(0.5, 0.5)\n            // increase index\n            state.index++\n        }\n        // save the index of the last center vertex\n        const centerIndexEnd = state.index\n        // now we generate the surrounding vertices, normals and uvs\n        for (let x = 0; x <= radialSegments; x++) {\n            const u = x / radialSegments\n            const theta = u * thetaLength + thetaStart\n            const cosTheta = Math.cos(theta)\n            const sinTheta = Math.sin(theta)\n            // vertex\n            vertex.x = radius * sinTheta\n            vertex.y = halfHeight * sign\n            vertex.z = radius * cosTheta\n            vertices.push(vertex.x, vertex.y, vertex.z)\n            // normal\n            normals.push(0, sign, 0)\n            // uv\n            uv.x = cosTheta * 0.5 + 0.5\n            uv.y = sinTheta * 0.5 * sign + 0.5\n            uvs.push(uv.x, uv.y)\n            // increase index\n            state.index++\n        }\n        // generate indices\n        for (let x = 0; x < radialSegments; x++) {\n            const c = centerIndexStart + x\n            const i = centerIndexEnd + x\n            if (top === true) {\n                // face top\n                indices.push(i, i + 1, c)\n            } else {\n                // face bottom\n                indices.push(i + 1, i, c)\n            }\n            groupCount += 3\n        }\n        // add a group to the geometry. this will ensure multi material support\n        groups.push({start: groupStart, count: groupCount, materialIndex: top === true ? 1 : 2})\n        // calculate new start value for groups\n        state.groupStart += groupCount\n    }\n\n    protected _generateData(params: CylinderGeometryGeneratorParams) {\n        let {radialSegments, heightSegments} = params\n\n        radialSegments = Math.floor(radialSegments)\n        heightSegments = Math.floor(heightSegments)\n\n        const state = {\n            indices: [],\n            vertices: [],\n            normals: [],\n            uvs: [],\n            numberOfVertices: 0,\n            groupStart: 0,\n            groups: [],\n            index: 0,\n            indexArray: [],\n            halfHeight: params.height / 2,\n            ...params,\n            radialSegments,\n            heightSegments,\n        }\n\n        // generate geometry\n\n        this._generateTorso(state)\n\n        if (params.openEnded === false) {\n\n            if (params.radiusTop > 0) this._generateCap(state, true)\n            if (params.radiusBottom > 0) this._generateCap(state, false)\n\n        }\n\n        return state\n    }\n\n}\n","import {\n    ArcCurve,\n    CatmullRomCurve3,\n    CubicBezierCurve,\n    CubicBezierCurve3,\n    Curve,\n    CurvePath,\n    EllipseCurve,\n    LineCurve,\n    LineCurve3,\n    QuadraticBezierCurve,\n    QuadraticBezierCurve3,\n    SplineCurve,\n    Vector2,\n    Vector3,\n} from 'three'\nimport {generateValueConfig, IUiConfigContainer, UiObjectConfig} from 'uiconfig.js'\nimport {Class} from 'ts-browser-helpers'\nimport {EllipseCurve3D} from '../../../core/geometry/EllipseCurve3D'\nimport {CurvePath3} from '../../../three/utils/curve'\n\nexport type SupportedCurveTypes =\n    | LineCurve\n    | LineCurve3\n    | CubicBezierCurve\n    | CubicBezierCurve3\n    | EllipseCurve\n    | ArcCurve\n    | QuadraticBezierCurve\n    | QuadraticBezierCurve3\n    | CatmullRomCurve3\n    | SplineCurve\n    | CurvePath<Vector2>\n    | CurvePath3\n\nexport interface CurveUiEntry {\n    ctor?: Class<Curve<any>>,\n    getUiConfig: (curve: any) => UiObjectConfig['children']\n    /** Maps semantic property names to actual curve property names, used to copy values when switching curve types */\n    vals: Record<string, string>\n}\n\n/**\n * Registry of curve types with their UI config generators.\n * Used by geometry generators that have curve parameters (TubeGeometryGenerator, LineGeometryGenerator, etc.)\n */\nexport const curveUiConfigs: Record<string, CurveUiEntry> = {}\n\n// ── 2D Curves ──\n\ncurveUiConfigs.LineCurve = {\n    ctor: LineCurve,\n    vals: {start: 'v1', end: 'v2'},\n    getUiConfig: (curve: LineCurve | LineCurve3) => [\n        generateValueConfig(curve, 'v1', 'Start Point'),\n        generateValueConfig(curve, 'v2', 'End Point'),\n    ] as UiObjectConfig['children'],\n}\n\ncurveUiConfigs.CubicBezierCurve = {\n    ctor: CubicBezierCurve,\n    vals: {start: 'v0', end: 'v3', control1: 'v1', control2: 'v2'},\n    getUiConfig: (curve: CubicBezierCurve | CubicBezierCurve3) => [\n        generateValueConfig(curve, 'v0', 'Start Point'),\n        generateValueConfig(curve, 'v1', 'Control Point 1'),\n        generateValueConfig(curve, 'v2', 'Control Point 2'),\n        generateValueConfig(curve, 'v3', 'End Point'),\n    ] as UiObjectConfig['children'],\n}\n\ncurveUiConfigs.QuadraticBezierCurve = {\n    ctor: QuadraticBezierCurve,\n    vals: {start: 'v0', end: 'v2', control1: 'v1'},\n    getUiConfig: (curve: QuadraticBezierCurve | QuadraticBezierCurve3) => [\n        generateValueConfig(curve, 'v0', 'Start Point'),\n        generateValueConfig(curve, 'v1', 'Control Point'),\n        generateValueConfig(curve, 'v2', 'End Point'),\n    ] as UiObjectConfig['children'],\n}\n\ncurveUiConfigs.EllipseCurve = {\n    ctor: EllipseCurve,\n    vals: {centerX: 'aX', centerY: 'aY', radiusX: 'xRadius', radiusY: 'yRadius', startAngle: 'aStartAngle', endAngle: 'aEndAngle', clockwise: 'aClockwise', rotation: 'aRotation'},\n    getUiConfig: (curve: EllipseCurve) => [\n        generateValueConfig(curve, 'aX', 'X Center'),\n        generateValueConfig(curve, 'aY', 'Y Center'),\n        generateValueConfig(curve, 'xRadius', 'X Radius'),\n        generateValueConfig(curve, 'yRadius', 'Y Radius'),\n        generateValueConfig(curve, 'aStartAngle', 'Start Angle'),\n        generateValueConfig(curve, 'aEndAngle', 'End Angle'),\n        generateValueConfig(curve, 'aClockwise', 'Clockwise'),\n        generateValueConfig(curve, 'aRotation', 'Rotation'),\n    ] as UiObjectConfig['children'],\n}\n\ncurveUiConfigs.ArcCurve = {\n    ctor: ArcCurve,\n    vals: {centerX: 'aX', centerY: 'aY', radiusX: 'xRadius', radiusY: 'yRadius', startAngle: 'aStartAngle', endAngle: 'aEndAngle', clockwise: 'aClockwise'},\n    getUiConfig: (curve: ArcCurve) => {\n        const radiusConfig = generateValueConfig(curve, 'xRadius', 'Radius')\n        if (radiusConfig) {\n            const origOnChange = radiusConfig.onChange as ((...args: any[]) => void) | undefined\n            radiusConfig.onChange = (...args: any[]) => {\n                curve.yRadius = curve.xRadius // keep circle (ArcCurve = equal radii)\n                origOnChange?.(...args)\n            }\n        }\n        return [\n            generateValueConfig(curve, 'aX', 'X Center'),\n            generateValueConfig(curve, 'aY', 'Y Center'),\n            radiusConfig,\n            generateValueConfig(curve, 'aStartAngle', 'Start Angle'),\n            generateValueConfig(curve, 'aEndAngle', 'End Angle'),\n            generateValueConfig(curve, 'aClockwise', 'Clockwise'),\n        ] as UiObjectConfig['children']\n    },\n}\n\ncurveUiConfigs.SplineCurve = {\n    ctor: SplineCurve,\n    vals: {points: 'points'},\n    getUiConfig: (curve: SplineCurve) => [\n        () => curve.points.map((_, i) => generateValueConfig(curve.points, i.toString(), `Point ${i}`)),\n        {\n            type: 'button', label: 'Add Point',\n            value: () => {\n                const points = curve.points\n                const prev = points[points.length - 1] || new Vector2(0, 0)\n                const prev2 = points[points.length - 2] || new Vector2(1, 1)\n                points.push(prev.clone().add(prev.clone().sub(prev2)))\n                curve.points = points\n                curve.updateArcLengths()\n                ;(curve as IUiConfigContainer).uiConfig?.uiRefresh?.(true, 'postFrame')\n            },\n        },\n    ] as UiObjectConfig['children'],\n}\n\n// ── 3D Curves ──\n\ncurveUiConfigs.LineCurve3 = {\n    ...curveUiConfigs.LineCurve,\n    ctor: LineCurve3,\n}\n\ncurveUiConfigs.CubicBezierCurve3 = {\n    ...curveUiConfigs.CubicBezierCurve,\n    ctor: CubicBezierCurve3,\n}\n\ncurveUiConfigs.QuadraticBezierCurve3 = {\n    ...curveUiConfigs.QuadraticBezierCurve,\n    ctor: QuadraticBezierCurve3,\n}\n\ncurveUiConfigs.CatmullRomCurve3 = {\n    ctor: CatmullRomCurve3,\n    vals: {points: 'points', closed: 'closed', curveType: 'curveType', tension: 'tension'},\n    getUiConfig: (curve: CatmullRomCurve3) => [\n        () => curve.points.map((_, i) => generateValueConfig(curve.points, i.toString(), `Point ${i}`)),\n        {\n            type: 'button', label: 'Add Point',\n            value: () => {\n                const points = curve.points\n                const prev = points[points.length - 1] || new Vector3(0, 0, 0)\n                const prev2 = points[points.length - 2] || new Vector3(1, 1, 0)\n                points.push(prev.clone().add(prev.clone().sub(prev2)))\n                curve.points = points\n                curve.updateArcLengths()\n                ;(curve as IUiConfigContainer).uiConfig?.uiRefresh?.(true, 'postFrame')\n            },\n        },\n        generateValueConfig(curve, 'closed', 'Closed Loop'),\n        {\n            type: 'dropdown', property: [curve, 'curveType'], label: 'Curve Type',\n            children: ['centripetal', 'chordal', 'catmullrom'].map(value => ({label: value, value})),\n        },\n        generateValueConfig(curve, 'tension', 'Tension'),\n    ] as UiObjectConfig['children'],\n}\n\ncurveUiConfigs.EllipseCurve3D = {\n    ctor: EllipseCurve3D,\n    vals: {centerX: 'aX', centerY: 'aY', radiusX: 'xRadius', radiusY: 'yRadius', startAngle: 'aStartAngle', endAngle: 'aEndAngle', clockwise: 'aClockwise', rotation: 'aRotation'},\n    getUiConfig: curveUiConfigs.EllipseCurve.getUiConfig, // same props as EllipseCurve\n}\n\n// ── CurvePath (composite) ──\n\ncurveUiConfigs.CurvePath = {\n    ctor: CurvePath as any,\n    vals: {},\n    getUiConfig: (curve: CurvePath<Vector2> | CurvePath3) => [\n        () => curve.curves.map((c, i) => {\n            if ((c as IUiConfigContainer).uiConfig) return (c as IUiConfigContainer).uiConfig\n            const type = c.type\n            const uic = curveUiConfigs[type]\n            if (uic) {\n                const children = uic.getUiConfig(c as any) || []\n                const config = {\n                    type: 'folder',\n                    label: type.replace(/([A-Z])/g, ' $1').trim(),\n                    children: [\n                        createCurveTypeDropdown(c as any, (curve1) => {\n                            curve.curves[i] = curve1 as any\n                            curve.updateArcLengths()\n                            ;(curve as IUiConfigContainer).uiConfig?.uiRefresh?.(true, 'postFrame')\n                        }),\n                        ...children,\n                        {\n                            type: 'button', label: 'Remove Curve',\n                            value: () => {\n                                curve.curves.splice(i, 1)\n                                curve.updateArcLengths()\n                                ;(curve as IUiConfigContainer).uiConfig?.uiRefresh?.(true, 'postFrame')\n                                return true\n                            },\n                        },\n                    ],\n                } as UiObjectConfig\n                ;(c as IUiConfigContainer).uiConfig = config\n                return config\n            }\n            return undefined\n        }),\n        {\n            type: 'button', label: 'Add Curve',\n            value: () => {\n                const newCurve = curve.type.endsWith('3')\n                    ? new LineCurve3(new Vector3(0, 0, 0), new Vector3(1, 1, 0))\n                    : new LineCurve(new Vector2(0, 0), new Vector2(1, 1))\n                curve.add(newCurve as any)\n                curve.updateArcLengths()\n                ;(curve as IUiConfigContainer).uiConfig?.uiRefresh?.(true, 'postFrame')\n                return true\n            },\n        },\n    ] as UiObjectConfig['children'],\n}\n\ncurveUiConfigs.CurvePath3 = {\n    ...curveUiConfigs.CurvePath,\n    ctor: CurvePath3 as any,\n}\n\n// ── Public API ──\n\n/**\n * Create a curve type dropdown UI config for selecting between curve types.\n * @param curve Current curve instance\n * @param configs Curve UI config registry to use (defaults to full registry)\n * @param onTypeChange Callback when curve type is changed\n */\nexport function createCurveTypeDropdown(\n    curve: Curve<Vector2 | Vector3>,\n    onTypeChange: (newCurve: Curve<any>) => void,\n    configs: Record<string, CurveUiEntry> = curveUiConfigs,\n): UiObjectConfig {\n    return {\n        type: 'dropdown',\n        label: 'Curve Type',\n        children: Object.keys(configs).map(key => ({\n            label: key.replace(/([A-Z])/g, ' $1').trim(),\n            value: key,\n        })),\n        getValue: () => curve ? (curve as any).type || 'LineCurve3' : 'LineCurve3',\n        setValue: (v1: string) => {\n            const oldSettings = (curve as any).type ? configs[(curve as any).type] : null\n            const settings = configs[v1]\n            if (!(curve && settings && (curve as any).type !== v1)) return true\n            const ctor = settings.ctor\n            if (!ctor) return false\n\n            const newCurve = new ctor()\n            // Initialize empty point arrays for spline/catmull-rom types\n            if (Array.isArray((newCurve as SplineCurve).points) && (newCurve as SplineCurve).points.length === 0) {\n                const p = newCurve.type.endsWith('3') ? new Vector3() : new Vector2()\n                const p2 = newCurve.type.endsWith('3') ? new Vector3(1, 1, 1) : new Vector2(1, 1)\n                ;(newCurve as any).points.push(p, p2)\n            }\n            // Initialize empty curves array for CurvePath types\n            if (Array.isArray((newCurve as CurvePath<any>).curves) && (newCurve as CurvePath<any>).curves.length === 0) {\n                const c = newCurve.type.endsWith('3')\n                    ? new LineCurve3(new Vector3(0, 0, 0), new Vector3(1, 1, 0))\n                    : new LineCurve(new Vector2(0, 0), new Vector2(1, 1))\n                ;(newCurve as any).curves.push(c)\n            }\n\n            // Copy compatible properties from old curve to new one\n            if (oldSettings) {\n                const propsC1 = Object.entries(oldSettings.vals)\n                    .map(([k, v]) => [k, (curve as any)[v], settings.vals[k]])\n                    .filter(([_, v, k2]) => v !== undefined && v !== null && !!k2)\n\n                for (const [, v, k2] of propsC1) {\n                    const prev = (newCurve as any)[k2]\n                    if (prev === undefined) continue\n                    if (typeof prev === 'object' && typeof prev.copy === 'function')\n                        (newCurve as any)[k2].copy(v)\n                    else if (Array.isArray(prev) && Array.isArray(v))\n                        (newCurve as any)[k2] = [...v]\n                    else if (typeof prev === 'object' && typeof v === 'object' && v !== null)\n                        (newCurve as any)[k2] = {...v}\n                    else\n                        (newCurve as any)[k2] = v\n                }\n            }\n\n            onTypeChange(newCurve)\n            return true\n        },\n    }\n}\n\n/**\n * Create UI config entries for editing the properties of a curve.\n */\nexport function createCurvePropertyUi(curve: Curve<Vector2 | Vector3>, configs: Record<string, CurveUiEntry> = curveUiConfigs): UiObjectConfig[] {\n    const type = (curve as any).type as string\n    const entry = configs[type]\n    if (!entry) return []\n\n    const folder: UiObjectConfig = {\n        type: 'folder',\n        label: type.replace(/([A-Z])/g, ' $1').trim(),\n        children: entry.getUiConfig(curve as any) || [],\n    }\n    ;(curve as IUiConfigContainer).uiConfig = folder\n    return [folder]\n}\n","import {Curve, Float32BufferAttribute, TubeGeometry, Vector3} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\nimport {IGeometry} from '../../../core/IGeometry'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {EllipseCurve3D} from '../../../core/geometry/EllipseCurve3D'\nimport {createCurvePropertyUi, createCurveTypeDropdown} from '../helpers/CurveUiHelper'\n\nexport interface TubeGeometryGeneratorParams {\n    path: Curve<Vector3>\n    tubularSegments: number\n    radius: number\n    radialSegments: number\n    closed: boolean\n}\n\n/**\n * Generates a tube geometry with circular cross-section along a 3D curve path.\n * Uses three.js TubeGeometry internally.\n */\nexport class TubeGeometryGenerator extends AGeometryGenerator<TubeGeometryGeneratorParams> {\n\n    constructor(type = 'tube', defaultParams?: Partial<TubeGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: TubeGeometryGeneratorParams = {\n        path: new EllipseCurve3D(0, 0, 1, 1, 0, 2 * Math.PI, false, 0) as any,\n        tubularSegments: 64,\n        radius: 0.1,\n        radialSegments: 8,\n        closed: false,\n    }\n\n    protected _generateData(params: TubeGeometryGeneratorParams) {\n        const tubeGeom = new TubeGeometry(\n            params.path,\n            params.tubularSegments,\n            params.radius,\n            params.radialSegments,\n            params.closed,\n        )\n\n        const positionAttr = tubeGeom.getAttribute('position') as Float32BufferAttribute\n        const normalAttr = tubeGeom.getAttribute('normal') as Float32BufferAttribute\n        const uvAttr = tubeGeom.getAttribute('uv') as Float32BufferAttribute\n        const indexArr = tubeGeom.index ? Array.from(tubeGeom.index.array) : []\n\n        const result = {\n            indices: indexArr,\n            vertices: positionAttr,\n            normals: normalAttr,\n            uvs: uvAttr,\n        }\n\n        tubeGeom.dispose()\n        return result\n    }\n\n    createUiConfig(geometry: IGeometry): UiObjectConfig[] {\n        const params = geometry.userData.generationParams as unknown as TubeGeometryGeneratorParams\n        if (!params) return []\n\n        const scalarUi = super.createUiConfig(geometry)\n        // Remove the auto-generated 'path' folder (not useful for curve objects)\n        const filtered = scalarUi.filter(u => (u.label as any) !== 'path')\n\n        const onTypeChange = (newCurve: Curve<Vector3>) => {\n            params.path = newCurve\n            ;(geometry.userData as any).__generationParamsUiType = ''\n            this.generate(geometry)\n        }\n\n        return [\n            createCurveTypeDropdown(params.path, onTypeChange),\n            ...createCurvePropertyUi(params.path),\n            ...filtered,\n        ]\n    }\n}\n","import {Shape} from 'three'\n\n/**\n * Create a 2D Shape from preset type and scalar parameters.\n * Used by ShapeGeometryGenerator and TubeShapeGeometryGenerator.\n * Shapes are created with CCW winding (standard for three.js ShapeGeometry).\n */\nexport function createShapeFromPreset(shapeType: string, params: {\n    width?: number, height?: number,\n    circleRadius?: number, circleSegments?: number,\n    sides?: number, polygonRadius?: number,\n}): Shape {\n    const shape = new Shape()\n\n    switch (shapeType) {\n    case 'rectangle': {\n        const w = (params.width ?? 1) / 2\n        const h = (params.height ?? 1) / 2\n        shape.moveTo(-w, -h)\n        shape.lineTo(w, -h)\n        shape.lineTo(w, h)\n        shape.lineTo(-w, h)\n        shape.closePath()\n        return shape\n    }\n    case 'circle': {\n        const r = params.circleRadius ?? 1\n        const segments = params.circleSegments ?? 32\n        for (let i = 0; i < segments; i++) {\n            const theta = (i / segments) * Math.PI * 2\n            const x = r * Math.cos(theta)\n            const y = r * Math.sin(theta)\n            if (i === 0) shape.moveTo(x, y)\n            else shape.lineTo(x, y)\n        }\n        shape.closePath()\n        return shape\n    }\n    case 'polygon': {\n        const sides = Math.max(3, params.sides ?? 6)\n        const pr = params.polygonRadius ?? 1\n        for (let i = 0; i < sides; i++) {\n            const theta = (i / sides) * Math.PI * 2 - Math.PI / 2\n            const x = pr * Math.cos(theta)\n            const y = pr * Math.sin(theta)\n            if (i === 0) shape.moveTo(x, y)\n            else shape.lineTo(x, y)\n        }\n        shape.closePath()\n        return shape\n    }\n    default:\n        throw new Error('Unknown shape preset type: ' + shapeType)\n    }\n}\n\n/**\n * Reverse the winding order of a shape's points.\n * TubeShapeGeometry expects CW winding for outward-facing normals,\n * while ShapeGeometry expects CCW. Use this when passing a preset shape to TubeShapeGeometry.\n */\nexport function reverseShapeWinding(shape: Shape): Shape {\n    const points = shape.getPoints()\n    points.reverse()\n    return new Shape(points)\n}\n","import {Float32BufferAttribute, ShapeGeometry} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\nimport {IGeometry} from '../../../core/IGeometry'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {createShapeFromPreset} from '../helpers/ShapePresets'\n\nexport interface ShapeGeometryGeneratorParams {\n    shapeType: 'rectangle' | 'circle' | 'polygon'\n    width: number\n    height: number\n    circleRadius: number\n    circleSegments: number\n    sides: number\n    polygonRadius: number\n    curveSegments: number\n}\n\n/**\n * Generates a flat 2D shape geometry from preset shape types.\n * Uses three.js ShapeGeometry internally.\n */\nexport class ShapeGeometryGenerator extends AGeometryGenerator<ShapeGeometryGeneratorParams> {\n\n    constructor(type = 'shape', defaultParams?: Partial<ShapeGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: ShapeGeometryGeneratorParams = {\n        shapeType: 'rectangle',\n        width: 1,\n        height: 1,\n        circleRadius: 1,\n        circleSegments: 32,\n        sides: 6,\n        polygonRadius: 1,\n        curveSegments: 12,\n    }\n\n    protected _generateData(params: ShapeGeometryGeneratorParams) {\n        const shape = createShapeFromPreset(params.shapeType, params)\n        const shapeGeom = new ShapeGeometry(shape, params.curveSegments)\n\n        shapeGeom.computeVertexNormals()\n\n        const positionAttr = shapeGeom.getAttribute('position') as Float32BufferAttribute\n        const normalAttr = shapeGeom.getAttribute('normal') as Float32BufferAttribute\n        const uvAttr = shapeGeom.getAttribute('uv') as Float32BufferAttribute\n        const indexArr = shapeGeom.index ? Array.from(shapeGeom.index.array) : []\n\n        const result = {\n            indices: indexArr,\n            vertices: positionAttr,\n            normals: normalAttr,\n            uvs: uvAttr,\n        }\n\n        shapeGeom.dispose()\n        return result\n    }\n\n    createUiConfig(geometry: IGeometry): UiObjectConfig[] {\n        const params = geometry.userData.generationParams as unknown as ShapeGeometryGeneratorParams\n        if (!params) return []\n\n        const allUi = super.createUiConfig(geometry)\n\n        // Add visibility callbacks based on shapeType\n        for (const ui of allUi) {\n            const label = ui.label as string\n            if (label === 'width' || label === 'height') {\n                ui.hidden = () => params.shapeType !== 'rectangle'\n            } else if (label === 'circleRadius' || label === 'circleSegments') {\n                ui.hidden = () => params.shapeType !== 'circle'\n            } else if (label === 'sides' || label === 'polygonRadius') {\n                ui.hidden = () => params.shapeType !== 'polygon'\n            }\n        }\n\n        return allUi\n    }\n}\n","import {BufferAttribute, Curve, Float32BufferAttribute, Shape, Vector2, Vector3} from 'three'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\nimport {IGeometry} from '../../../core/IGeometry'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {TubeShapeGeometry} from '../../../core/geometry/TubeShapeGeometry'\nimport {EllipseCurve3D} from '../../../core/geometry/EllipseCurve3D'\nimport {createShapeFromPreset, reverseShapeWinding} from '../helpers/ShapePresets'\nimport {createCurvePropertyUi, createCurveTypeDropdown} from '../helpers/CurveUiHelper'\n\nexport interface TubeShapeGeometryGeneratorParams {\n    // Path\n    path: Curve<Vector3>\n    // Shape cross-section\n    shapeType: 'rectangle' | 'circle' | 'polygon' | 'custom'\n    shape?: Shape\n    width: number\n    height: number\n    circleRadius: number\n    circleSegments: number\n    sides: number\n    polygonRadius: number\n    // Tube params\n    shapeSegments: number\n    tubularSegments: number\n    closed: boolean\n    shapeScaleX: number\n    shapeScaleY: number\n    primary: 'shape' | 'path'\n    materialSplits: string\n}\n\n/**\n * Generates a tube geometry with arbitrary shape cross-section along a 3D curve path.\n * Uses the custom TubeShapeGeometry internally, which supports non-circular cross-sections,\n * shape scaling, and multi-material splits.\n */\nexport class TubeShapeGeometryGenerator extends AGeometryGenerator<TubeShapeGeometryGeneratorParams> {\n\n    constructor(type = 'tubeShape', defaultParams?: Partial<TubeShapeGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: TubeShapeGeometryGeneratorParams = {\n        path: new EllipseCurve3D(0, 0, 2, 2, 0, 2 * Math.PI, false, 0) as any,\n        shapeType: 'rectangle',\n        width: 0.5,\n        height: 0.3,\n        circleRadius: 0.2,\n        circleSegments: 16,\n        sides: 6,\n        polygonRadius: 0.2,\n        shapeSegments: 16,\n        tubularSegments: 64,\n        closed: false,\n        shapeScaleX: 1,\n        shapeScaleY: 1,\n        primary: 'shape',\n        materialSplits: '',\n    }\n\n    protected _generateData(params: TubeShapeGeometryGeneratorParams) {\n        const presetShape = params.shapeType === 'custom' && params.shape\n            ? params.shape\n            : createShapeFromPreset(params.shapeType, params)\n        // TubeShapeGeometry expects CW winding for outward-facing normals\n        const shape = reverseShapeWinding(presetShape)\n\n        const tubeShapeGeom = new TubeShapeGeometry(\n            shape,\n            params.path,\n            params.shapeSegments,\n            params.tubularSegments,\n            params.closed,\n            new Vector2(params.shapeScaleX, params.shapeScaleY),\n            params.primary,\n        )\n\n        // Handle material splits\n        if (params.materialSplits) {\n            const splits = params.materialSplits.split(',').map(s => parseFloat(s.trim())).filter(n => !isNaN(n))\n            if (splits.length > 0) {\n                tubeShapeGeom.createSplits(splits)\n            }\n        }\n\n        const positionAttr = tubeShapeGeom.getAttribute('position') as Float32BufferAttribute\n        const normalAttr = tubeShapeGeom.getAttribute('normal') as Float32BufferAttribute\n        const uvAttr = tubeShapeGeom.getAttribute('uv') as Float32BufferAttribute\n        const indexArr = tubeShapeGeom.index ? Array.from(tubeShapeGeom.index.array) : []\n\n        const result: {\n            indices: number[] | BufferAttribute\n            vertices: Float32BufferAttribute\n            normals: Float32BufferAttribute\n            uvs: Float32BufferAttribute\n            groups?: {start: number, count: number, materialIndex?: number}[]\n        } = {\n            indices: indexArr,\n            vertices: positionAttr,\n            normals: normalAttr,\n            uvs: uvAttr,\n        }\n\n        if (tubeShapeGeom.groups.length > 0) {\n            result.groups = tubeShapeGeom.groups.map(g => ({\n                start: g.start,\n                count: g.count,\n                materialIndex: g.materialIndex,\n            }))\n        }\n\n        tubeShapeGeom.dispose()\n        return result\n    }\n\n    createUiConfig(geometry: IGeometry): UiObjectConfig[] {\n        const params = geometry.userData.generationParams as unknown as TubeShapeGeometryGeneratorParams\n        if (!params) return []\n\n        const allUi = super.createUiConfig(geometry)\n        // Remove auto-generated entries for complex params\n        const filtered = allUi.filter(u => {\n            const label = u.label as string\n            return label !== 'path' && label !== 'shape'\n        })\n\n        // Add visibility callbacks for shape-type-specific params\n        for (const ui of filtered) {\n            const label = ui.label as string\n            if (label === 'width' || label === 'height') {\n                ui.hidden = () => params.shapeType !== 'rectangle'\n            } else if (label === 'circleRadius' || label === 'circleSegments') {\n                ui.hidden = () => params.shapeType !== 'circle'\n            } else if (label === 'sides' || label === 'polygonRadius') {\n                ui.hidden = () => params.shapeType !== 'polygon'\n            }\n        }\n\n        // Curve UI\n        const onTypeChange = (newCurve: Curve<Vector3>) => {\n            params.path = newCurve\n            ;(geometry.userData as any).__generationParamsUiType = ''\n            this.generate(geometry)\n        }\n\n        return [\n            createCurveTypeDropdown(params.path, onTypeChange),\n            ...createCurvePropertyUi(params.path),\n            ...filtered,\n        ]\n    }\n}\n","import {Curve, Line, LineCurve3, Vector2, Vector3} from 'three'\nimport {Class} from 'ts-browser-helpers'\nimport {IUiConfigContainer, UiObjectConfig} from 'uiconfig.js'\nimport {IGeometry} from '../../../core/IGeometry'\nimport {IMaterial} from '../../../core/IMaterial'\nimport {IObject3D} from '../../../core/IObject'\nimport {BufferGeometry2} from '../../../core/geometry/BufferGeometry2'\nimport {LineGeometry2} from '../../../core/geometry/LineGeometry2'\nimport {LineMaterial2} from '../../../core/material/LineMaterial2'\nimport {UnlitLineMaterial} from '../../../core/material/UnlitLineMaterial'\nimport {MeshLine} from '../../../core/object/MeshLine'\nimport {AGeometryGenerator} from '../AGeometryGenerator'\nimport {createCurvePropertyUi, createCurveTypeDropdown, type SupportedCurveTypes} from '../helpers/CurveUiHelper'\n\nexport interface LineGeometryGeneratorParams {\n    curve?: SupportedCurveTypes | Curve<Vector2> | Curve<Vector3>\n    segments?: number\n    closePath?: boolean\n}\n\nexport class LineGeometryGenerator extends AGeometryGenerator<LineGeometryGeneratorParams> {\n\n    constructor(type = 'line', defaultParams?: Partial<LineGeometryGeneratorParams>) {\n        super(type)\n        if (defaultParams) Object.assign(this.defaultParams, defaultParams)\n    }\n\n    defaultParams: LineGeometryGeneratorParams = {\n        curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(1, 1, 0)),\n        segments: 50,\n        closePath: false,\n    }\n\n    static UseMeshLines = true\n\n    defaultMeshClass: ()=>Class<IObject3D> = ()=> LineGeometryGenerator.UseMeshLines ? MeshLine : Line as any\n    defaultMaterialClass: ()=>Class<IMaterial> = ()=> LineGeometryGenerator.UseMeshLines ? LineMaterial2 : UnlitLineMaterial\n    defaultGeometryClass: ()=>Class<IGeometry> = ()=> LineGeometryGenerator.UseMeshLines ? LineGeometry2 : BufferGeometry2\n\n    protected _generateData(params: LineGeometryGeneratorParams) {\n        const positions: number[] = []\n\n        let curve = params.curve\n        if (!curve && this.defaultParams.curve) {\n            curve = this.defaultParams.curve\n        }\n\n        if (!curve) {\n            throw new Error('No curve specified for line generation')\n        }\n\n        const segments = Math.max(2, params.segments || 50)\n        const closePath = params.closePath || false\n\n        curve.updateArcLengths()\n        const points = curve.getSpacedPoints(segments - 1)\n\n        if (points.length !== segments) {\n            console.error(`LineGeometryGenerator: Curve points length (${points.length}) does not match segments (${segments}).`)\n        }\n\n        for (const point of points) {\n            if ('z' in point) {\n                positions.push(point.x, point.y, point.z)\n            } else {\n                positions.push(point.x, point.y, 0)\n            }\n        }\n\n        if (closePath && points.length > 0) {\n            const firstPoint = points[0]\n            if ('z' in firstPoint) {\n                positions.push(firstPoint.x, firstPoint.y, firstPoint.z)\n            } else {\n                positions.push(firstPoint.x, firstPoint.y, 0)\n            }\n        }\n\n        return {\n            vertices: positions,\n            normals: [],\n            uvs: [],\n            positions,\n        }\n    }\n\n    createUiConfig(geometry: IGeometry): UiObjectConfig[] {\n        const ui = super.createUiConfig(geometry)\n        const curveFolder = ui.find(u => (u.label as any) === 'curve' && u.type === 'folder')\n        const curve = (geometry.userData.generationParams as LineGeometryGeneratorParams)?.curve\n        if (!curve) return []\n\n        if ((curve as IUiConfigContainer)?.uiConfig) {\n            const ind = curveFolder ? ui.indexOf(curveFolder) : -1\n            if (ind >= 0) {\n                ui.splice(ind, 1, (curve as IUiConfigContainer).uiConfig!)\n            } else {\n                ui.push((curve as IUiConfigContainer).uiConfig!)\n            }\n        } else if (curveFolder) {\n            const propUi = createCurvePropertyUi(curve)\n            if (propUi.length > 0) {\n                const ind = ui.indexOf(curveFolder)\n                ui.splice(ind, 1, ...propUi)\n            }\n        }\n\n        const onTypeChange = (newCurve: SupportedCurveTypes) => {\n            (geometry.userData.generationParams as LineGeometryGeneratorParams).curve = newCurve\n            ;(geometry.userData as any).__generationParamsUiType = '' // invalidate ui\n            this.generate(geometry)\n        }\n        const curveTypeDropdown = createCurveTypeDropdown(curve, onTypeChange)\n        return [curveTypeDropdown, ...ui]\n    }\n}\n","import {Class, toTitleCase} from 'ts-browser-helpers'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {BufferGeometry2} from '../../core/geometry/BufferGeometry2'\nimport {IGeometry} from '../../core/IGeometry'\nimport {IMaterial} from '../../core/IMaterial'\nimport {IMesh, IObject3D, IObject3DEventMap} from '../../core/IObject'\nimport {ISceneEventMap} from '../../core/IScene'\nimport {Mesh2} from '../../core/object/Mesh2'\nimport {PhysicalMaterial} from '../../core/material/PhysicalMaterial'\nimport type {Object3DGeneratorPlugin} from '../extras/Object3DGeneratorPlugin'\nimport {TorusGeometryGenerator} from './primitives/TorusGeometryGenerator'\nimport {CircleGeometryGenerator} from './primitives/CircleGeometryGenerator'\nimport {BoxGeometryGenerator} from './primitives/BoxGeometryGenerator'\nimport {SphereGeometryGenerator} from './primitives/SphereGeometryGenerator'\nimport {PlaneGeometryGenerator} from './primitives/PlaneGeometryGenerator'\nimport {CylinderGeometryGenerator} from './primitives/CylinderGeometryGenerator'\nimport {TubeGeometryGenerator} from './primitives/TubeGeometryGenerator'\nimport {ShapeGeometryGenerator} from './primitives/ShapeGeometryGenerator'\nimport {TubeShapeGeometryGenerator} from './primitives/TubeShapeGeometryGenerator'\nimport {LineGeometryGenerator} from './primitives/LineGeometryGenerator'\nimport {AGeometryGenerator, removeUi, updateUi} from './AGeometryGenerator'\n\n// for type autocomplete\nexport interface IGeometryGeneratorMap extends Record<string, AGeometryGenerator>{\n    plane: PlaneGeometryGenerator\n    sphere: SphereGeometryGenerator\n    box: BoxGeometryGenerator\n    circle: CircleGeometryGenerator\n    torus: TorusGeometryGenerator\n    cylinder: CylinderGeometryGenerator\n    tube: TubeGeometryGenerator\n    shape: ShapeGeometryGenerator\n    tubeShape: TubeShapeGeometryGenerator\n    line: LineGeometryGenerator\n}\n\n/**\n * GeometryGeneratorPlugin\n *\n * Geometry generator plugin to create updatable parametric objects/geometries.\n * Built-in generators: plane, sphere, box, circle, torus, cylinder, tube, shape, tubeShape, line.\n *\n * Additional generators (text) can be registered at runtime via the `generators` property\n * or by using `GeometryGeneratorExtrasPlugin` from `@threepipe/plugin-geometry-generator`.\n *\n * @category Plugins\n */\nexport class GeometryGeneratorPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'GeometryGeneratorPlugin'\n    enabled = true\n    toJSON: any = undefined\n\n    generators: IGeometryGeneratorMap = {\n        plane: new PlaneGeometryGenerator('plane'),\n        sphere: new SphereGeometryGenerator('sphere'),\n        box: new BoxGeometryGenerator('box'),\n        circle: new CircleGeometryGenerator('circle'),\n        torus: new TorusGeometryGenerator('torus'),\n        cylinder: new CylinderGeometryGenerator('cylinder'),\n        tube: new TubeGeometryGenerator('tube'),\n        shape: new ShapeGeometryGenerator('shape'),\n        tubeShape: new TubeShapeGeometryGenerator('tubeShape'),\n        line: new LineGeometryGenerator('line'),\n    }\n\n    defaultMeshClass: Class<IObject3D> = Mesh2\n    defaultMaterialClass: Class<IMaterial> = PhysicalMaterial\n    defaultGeometryClass: Class<IGeometry> = BufferGeometry2\n\n    generateObject<\n        T extends keyof IGeometryGeneratorMap & string = string,\n        TGeometry extends IGeometry = IGeometry,\n        TMaterial extends IMaterial = IMaterial,\n        TG extends AGeometryGenerator = IGeometryGeneratorMap[T]\n    >(type: T, {mesh, geometry, material, ...params}: Partial<TG['defaultParams']> & {\n        mesh?: IMesh<IObject3DEventMap, TGeometry, TMaterial>,\n        geometry?: TGeometry,\n        material?: TMaterial,\n    } = {}): IMesh<IObject3DEventMap, TGeometry, TMaterial> {\n        const generator = this.generators[type]\n        if (!generator) throw new Error('Unknown generator type: ' + type)\n        let obj = mesh\n        const geometry1 = obj?.geometry || geometry || (generator.defaultGeometryClass ? new (generator.defaultGeometryClass())() : new this.defaultGeometryClass())\n        const material1 = obj?.material || material || (generator.defaultMaterialClass ? new (generator.defaultMaterialClass())() : new this.defaultMaterialClass())\n        obj = obj || (generator.defaultMeshClass ? new (generator.defaultMeshClass())(geometry1, material1) : new this.defaultMeshClass(geometry1, material1)) as any\n        if (!obj) return obj as any\n        if (obj.geometry !== geometry1) obj.geometry = geometry1 as any\n        if (obj.material !== material1) obj.material = material1 as any\n        generator.generate(obj.geometry, params)\n        obj.name = type\n        if (!geometry1.name)\n            geometry1.name = 'Generated ' + toTitleCase(type)\n        if (!material1.name)\n            material1.name = 'Material for ' + geometry1.name\n        return obj\n    }\n    generateGeometry(type: string, params: any, geometry?: IGeometry) {\n        const generator = this.generators[type]\n        if (!generator) throw new Error('Unknown generator type: ' + type)\n        const g = generator.generate(geometry, params)\n        g.name = 'Generated ' + type\n        return g\n    }\n    updateGeometry(geometry: IGeometry, params?: any) {\n        if (!geometry.userData.generationParams?.type) throw new Error('Geometry is not generated')\n        const generator = this.generators[geometry.userData.generationParams.type]\n        if (!generator) throw new Error('Unknown generator type: ' + geometry.userData.generationParams.type)\n        generator.generate(geometry, params)\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.scene.addEventListener('geometryUpdate', this._geometryUpdate)\n\n        viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n        viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n\n        viewer.forPlugin<Object3DGeneratorPlugin>('Object3DGeneratorPlugin', (plugin)=>{\n            plugin.addObject3DGenerators('geometry-', Object.fromEntries(Object.keys(this.generators).map(key=>\n                [key, (params: any) => {\n                    const obj = this.generateObject(key, params)\n                    obj.name = key\n                    return obj\n                }]\n            )))\n        }, (plugin)=>{\n            plugin.removeObject3DGenerators('geometry-')\n        }, this)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.scene.removeEventListener('geometryUpdate', this._geometryUpdate)\n        viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n\n        super.onRemove(viewer)\n    }\n\n    private _objectAdd = (e: {object?: IObject3D})=>{\n        const obj = e.object\n        const type = obj?.geometry?.userData?.generationParams?.type\n        if (!type) return\n        updateUi(obj.geometry!, ()=>{\n            const geom = obj.geometry\n            if (!geom) return []\n            const gen = this.generators[type]\n            return gen?.createUiConfig ? gen.createUiConfig(geom) ?? [] : []\n        })\n    }\n\n    private _objectRemove = (e: {object?: IObject3D})=>{\n        const geom = e.object?.geometry\n        const type = geom?.userData?.generationParams?.type\n        if (!type) return\n        removeUi(geom)\n    }\n\n    // to regenerate call geometry.setDirty({regenerate: true})\n    protected _geometryUpdate = (e: ISceneEventMap['geometryUpdate'])=>{\n        if (e.regenerate && e.geometry?.userData?.generationParams)\n            this.updateGeometry(e.geometry)\n    }\n\n    uiConfig = {\n        type: 'folder',\n        label: 'Generate Geometry',\n        children:\n            [()=>Object.keys(this.generators).map((v) => ({\n                type: 'button',\n                uuid: 'generate_' + v,\n                label: 'Generate ' + v,\n                value: async() => {\n                    const obj = this.generateObject(v)\n                    obj.name = v\n                    this._viewer?.scene.addObject(obj)\n                },\n            }))],\n    }\n\n}\n","import {\n    BufferAttribute,\n    BufferGeometry,\n    InterleavedBufferAttribute,\n    Mesh,\n    Shape,\n    Vector2,\n    Vector3,\n} from 'three'\nimport {uiButton, uiFolderContainer, uiInput, uiSlider, uiToggle} from 'uiconfig.js'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {IMesh, IObject3D} from '../../core/IObject'\nimport {EllipseCurve3D} from '../../core/geometry/EllipseCurve3D'\nimport {PickingPlugin} from '../interaction/PickingPlugin'\nimport {GeometryGeneratorPlugin} from './GeometryGeneratorPlugin'\n\n/**\n * ShapeTubeExtrudePlugin\n *\n * Provides interactive extrusion of flat geometry along a curve path.\n * Takes a selected planar mesh, auto-detects its flat axis, extracts a 2D Shape from\n * the vertices, then extrudes it along a curve using the TubeShape geometry generator.\n *\n * Features:\n * - Extrude any flat geometry along a circle curve\n * - Auto-detect planar axis (X, Y, or Z) and extract 2D shape\n * - Configurable shape/tube segments, shape scale, and material splits\n * - Multi-material support via configurable split positions\n *\n * This could also be used as a sample plugin to create custom interactive geometry plugins.\n * @category Plugins\n */\n@uiFolderContainer('Extrude Tube Shapes')\nexport class ShapeTubeExtrudePlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'ShapeTubeExtrudePlugin'\n    dependencies = [PickingPlugin, GeometryGeneratorPlugin]\n    enabled = true\n    toJSON: any = undefined\n\n    @uiSlider('Shape Segments', [1, 100], 1)\n        shapeSegments = 32\n\n    @uiSlider('Tube Segments', [1, 100], 1)\n        tubularSegments = 32\n\n    @uiSlider('Shape Scale X', [0.01, 10], 0.01)\n        shapeScaleX = 1\n\n    @uiSlider('Shape Scale Y', [0.01, 10], 0.01)\n        shapeScaleY = 1\n\n    @uiInput('Material Splits')\n        materialSplits = '0.3, 0.6'\n\n    @uiToggle('Horizontal Splits')\n        horizontalSplits = true\n\n    @uiButton('Extrude Circle Tube')\n    public extrudeCircleTube = async() => {\n            const picking = this._viewer?.getPlugin(PickingPlugin)\n            const object = picking?.getSelectedObject<IMesh>()\n            if (!object || !object.geometry) return\n\n            const radius = 1\n            const circleCurve = new EllipseCurve3D(0, 0, radius, radius, 0, 2 * Math.PI, false, 0)\n            this.extrudeObject(object as any, circleCurve as any)\n        }\n\n    /**\n     * Extrude a mesh's geometry along a curve path.\n     * The mesh must be a flat/planar geometry (aligned to one axis).\n     */\n    public extrudeObject(\n        object: Mesh,\n        curve: any,\n        shapeSegments = this.shapeSegments,\n        tubularSegments = this.tubularSegments,\n        shapeScaleX = this.shapeScaleX,\n        shapeScaleY = this.shapeScaleY,\n        materialSplits = this.materialSplits,\n        horizontalSplits = this.horizontalSplits,\n    ) {\n        if (!this._viewer) return\n\n        // If the object itself is an extruded result, find its source\n        if (object.userData._extrudeSource) {\n            const src = object.userData._extrudeSource\n            const source = object.parent?.children.find(o => src === o.uuid) as Mesh\n            if (!source) {\n                console.warn('Could not find extrude source with uuid', src)\n                return\n            }\n            object = source\n        }\n\n        // Remove previous extrusion result if any\n        if (object.userData.extrudedObject) {\n            const oldUuid = object.userData.extrudedObject\n            const oldObj = object.parent?.children.find(o => oldUuid === o.uuid) as IObject3D | undefined\n            if (oldObj) {\n                oldObj.dispose?.(true)\n            }\n            delete object.userData.extrudedObject\n        }\n\n        const geometry = object.geometry\n        if (!geometry) {\n            console.warn('ShapeTubeExtrudePlugin: No geometry to extrude')\n            return\n        }\n\n        let shape: Shape\n        try {\n            shape = ShapeTubeExtrudePlugin.ConvertGeometryToFlatShape(geometry)\n        } catch (e: any) {\n            console.warn('ShapeTubeExtrudePlugin:', typeof e === 'string' ? e : e?.message)\n            return\n        }\n\n        const generator = this._viewer.getPlugin(GeometryGeneratorPlugin)\n        if (!generator) return\n\n        const splits = materialSplits ? materialSplits.split(',').map(s => parseFloat(s.trim())).filter(n => !isNaN(n)).join(', ') : ''\n\n        const mesh = generator.generateObject('tubeShape', {\n            path: curve,\n            shapeType: 'custom' as any,\n            shape,\n            shapeSegments,\n            tubularSegments,\n            closed: true,\n            shapeScaleX,\n            shapeScaleY,\n            primary: horizontalSplits ? 'shape' : 'path',\n            materialSplits: splits,\n        })\n\n        mesh.userData._extrudeSource = object.uuid\n        mesh.userData.isExtrudedTube = true\n        mesh.name = object.name + '_extruded'\n\n        object.visible = false\n        object.userData.extrudedObject = mesh.uuid\n\n        if (object.parent) {\n            object.parent.add(mesh)\n        } else {\n            this._viewer.scene.addObject(mesh)\n        }\n    }\n\n    /**\n     * Programmatic helper to extrude a shape along a curve.\n     */\n    static ExtrudeShape(\n        viewer: ThreeViewer,\n        shape: Shape,\n        curve: any,\n        shapeSegments = 32,\n        tubularSegments = 64,\n        shapeScaleX = 1,\n        shapeScaleY = 1,\n        materialSplits = '',\n        horizontalSplits = true,\n    ): IMesh | undefined {\n        const generator = viewer.getPlugin(GeometryGeneratorPlugin)\n        if (!generator) return undefined\n\n        return generator.generateObject('tubeShape', {\n            path: curve,\n            shapeType: 'custom' as any,\n            shape,\n            shapeSegments,\n            tubularSegments,\n            closed: true,\n            shapeScaleX,\n            shapeScaleY,\n            primary: horizontalSplits ? 'shape' : 'path',\n            materialSplits,\n        })\n    }\n\n    /**\n     * Convert a planar 3D geometry to a 2D Shape by auto-detecting the flat axis.\n     * The geometry must be aligned to one of the principal axes (X, Y, or Z bounding box extent near zero).\n     *\n     * @param geometry - The geometry to convert (must be planar/flat)\n     * @param sort - Whether to sort points starting from the leftmost point\n     * @returns A 2D Shape suitable for extrusion\n     * @throws If geometry has no position attribute, is too large (>500 vertices), or is not axis-aligned planar\n     */\n    static ConvertGeometryToFlatShape(geometry: BufferGeometry, sort = true): Shape {\n        if (geometry.userData.__planarShape) return geometry.userData.__planarShape\n\n        const position: BufferAttribute | InterleavedBufferAttribute = geometry.attributes.position as any\n        if (!position) throw new Error('No position attribute')\n        if (position.count > 500) throw new Error('Too many vertices to extrude (max 500)')\n\n        if (!geometry.boundingBox) geometry.computeBoundingBox()\n        const bbox = geometry.boundingBox!.getSize(new Vector3())\n        const axis = bbox.x < 0.001 ? 'x' : bbox.y < 0.001 ? 'y' : bbox.z < 0.001 ? 'z' : null\n        if (!axis) throw new Error('Geometry is not axis-aligned planar')\n\n        let points: Vector2[] = []\n        for (let i = 0; i < position.count; i++) {\n            const v = new Vector2()\n            if (axis === 'x') v.set(position.getY(i), position.getZ(i))\n            else if (axis === 'y') v.set(position.getX(i), position.getZ(i))\n            else v.set(position.getX(i), position.getY(i))\n            points.push(v)\n        }\n\n        if (sort) {\n            let minPoint = 0\n            for (let i = 0; i < points.length; i++) {\n                if (points[i].x < points[minPoint].x) minPoint = i\n                else if (points[i].x === points[minPoint].x && points[i].y < points[minPoint].y) minPoint = i\n            }\n            if (minPoint !== 0) points = points.slice(minPoint).concat(points.slice(0, minPoint))\n        }\n\n        const shape = new Shape(points)\n        geometry.userData.__planarShape = shape\n        return shape\n    }\n}\n","\n#ifdef HDRi_GROUND_PROJ\n// assuming vectors are all normalized\nfloat intersectPlane1(const in vec3 r0, const in vec3 rd, const in vec3 n, const in vec3 p0)\n{\n    float t = dot(p0 - r0, n) / (dot(n, rd)+1e-6);\n    return t < 0. ? 1000. : t;\n}\n// slightly modified version\nfloat intersectSphere1(in vec3 ro, in vec3 rd, in vec3 sph, in float rad) {\n    vec3 oc = ro - sph;\n    float b = dot(oc, rd);\n    float c = dot(oc, oc) - rad*rad;\n    float t = b*b - c;\n    return t < 0.0 ? t : -b + sqrt(t);\n}\n\n#define PI_HALF 1.5707963267948966\nuniform float worldRadius;\nuniform float tripodHeight;\nuniform vec3 originPosition;\n\nvec3 hdriProject(){\n    vec3 p = normalize( vWorldDirection );\n    vec3 camPos = cameraPosition;\n    camPos.y -= tripodHeight;\n    float t = intersectSphere1(camPos, p, originPosition, worldRadius);\n    if(t>0.0) {\n        float t2 = intersectPlane1(camPos, p, vec3(0,-1,0), originPosition + vec3(0.0, -tripodHeight, 0.0));\n        p = (camPos + min(t, t2)*p)/worldRadius;\n        /*\n        if(t2 < t && tripodHeight < 0.001){\n            // float h = dot(p.xz, p.xz);\n            //vertical\n            // p.y = sqrt(1.-h);\n\n            //sterographic // https://math.stackexchange.com/questions/1729012/mapping-the-unit-disc-to-the-hemisphere\n            // p.x = p.x/(h+1.0);\n            // p.z = p.z/(h+1.0);\n            // p.y = (h-1.0)/(h+1.0);\n\n            // polar\n            float phi = atan(p.z, p.x);\n            float p1 = 0.4; // lens projection fix // experimental for hdrihaven\n            float l = length(p.xz);\n            p1 = (1.-p1*l)/(1.-p1);\n            float theta = sin(l*PI_HALF)*PI_HALF; // cancel out projection, map [0,1] to [0, PI/2]\n\n            p.x = sin(theta)*cos(phi)*p1;\n            p.y = -cos(theta);\n            p.z = sin(theta)*sin(phi)*p1;\n        }\n        */\n    }\n    else p = vec3(0.0, 1.0, 0.0);\n    return p;\n}\n#endif\n","import {DataTexture, EquirectangularReflectionMapping, ShaderLib, Vector3} from 'three'\nimport {onChange, serialize} from 'ts-browser-helpers'\nimport hdriGroundProj from './HDRiGroundPlugin.glsl'\nimport {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {shaderReplaceString} from '../../utils'\nimport {uiFolderContainer, uiSlider, uiToggle, uiVector} from 'uiconfig.js'\n\n@uiFolderContainer('HDRi Ground')\nexport class HDRiGroundPlugin extends AViewerPluginSync {\n    static readonly PluginType = 'HDRiGroundPlugin'\n\n    @serialize()\n    @onChange(HDRiGroundPlugin.prototype.setDirty)\n    @uiToggle('Enabled')\n        enabled = false\n\n    @serialize()\n    @onChange(HDRiGroundPlugin.prototype.setDirty)\n    @uiSlider('World Radius', [1, 1000], 0.01)\n        worldRadius = 100\n\n    @serialize()\n    @onChange(HDRiGroundPlugin.prototype.setDirty)\n    @uiSlider('Tripod height', [0, 50], 0.01)\n        tripodHeight = 10\n\n    @serialize()\n    @onChange(HDRiGroundPlugin.prototype.setDirty)\n    @uiVector('Origin Position', undefined, 0.001, (t: HDRiGroundPlugin)=>({\n        onChange: t.setDirty, // this is for x, y, z values.\n    }))\n        originPosition = new Vector3(0, 0, 0)\n\n    @serialize()\n    @onChange(HDRiGroundPlugin.prototype.setDirty)\n        promptOnBackgroundMismatch = true\n\n    // todo\n    // /**\n    //  * Automatically set the origin position based on the ground position in GroundPlugin\n    //  */\n    // @serialize()\n    // @onChange(HDRiGroundPlugin.prototype.setDirty)\n    // @uiToggle('Auto Ground Position')\n    // autoGroundPosition = false\n\n    constructor(enabled = false, promptOnBackgroundMismatch = true) {\n        super()\n        this.setDirty = this.setDirty.bind(this)\n        this.enabled = enabled\n        this.promptOnBackgroundMismatch = promptOnBackgroundMismatch\n\n        this.addEventListener('deserialize', this.setDirty)\n    }\n\n    setDirty() {\n        if (!this._viewer) return\n        const bg = this._viewer.scene.background\n        if (this.enabled && bg !== this._viewer.scene.environment && bg !== 'environment') {\n            if (bg && (bg as any).isDataTexture) (bg as DataTexture).mapping = EquirectangularReflectionMapping\n            else {\n                const change = this.promptOnBackgroundMismatch ? this._viewer.dialog.confirmSync('Background must be same as environment, do you want to change it?') : true\n                if (change) {\n                    // const bgui = this._viewer.getPlugin<SimpleBackgroundEnvUiPlugin>('SimpleBackgroundEnvUiPlugin1')\n                    // if (bgui) {\n                    //     bgui.envmapBg = true\n                    //     bgui.uiConfig.uiRefresh?.(true, 'postFrame')\n                    // } else\n                    this._viewer.scene.background = 'environment'\n                } else this.enabled = false\n            }\n        }\n\n        const cubeMat = this._viewer.renderManager.renderer.background.getBoxMesh2()?.material\n        const unif = cubeMat?.uniforms ?? ShaderLib.backgroundCube.uniforms\n        if (!unif.tripodHeight) unif.tripodHeight = {value: 1.0}\n        if (!unif.worldRadius) unif.worldRadius = {value: 1.0}\n        if (!unif.originPosition) unif.originPosition = {value: new Vector3()}\n        unif.tripodHeight.value = this.tripodHeight\n        unif.worldRadius.value = this.worldRadius\n        unif.originPosition.value.copy(this.originPosition)\n        if (cubeMat) {\n            if (this.isDisabled() && cubeMat.defines.HDRi_GROUND_PROJ)\n                delete cubeMat.defines.HDRi_GROUND_PROJ\n            else if (!this.isDisabled())\n                cubeMat.defines.HDRi_GROUND_PROJ = '1'\n            cubeMat.needsUpdate = true\n        }\n        this._viewer.setDirty()\n        // const m = this._viewer?.scene.modelRoot.children ?? []\n        // for (const m1 of m) {\n        //     m1.position.y = -this.tripodHeight + new Box3B().expandByObject(m1, true, true).getSize(new Vector3()).y / 2\n        // }\n    }\n\n    onAdded(viewer: ThreeViewer): void {\n        super.onAdded(viewer)\n        if (this._viewer?.renderManager.webglRenderer?.background.getBoxMesh())\n            viewer.console.error('HDRi Ground Plugin must be added before setting any cube or env map')\n\n        if (!ShaderLib.backgroundCube.fragmentShader.includes('#ifdef HDRi_GROUND_PROJ')) {\n            const voidMain = 'void main() {'\n            const split = ShaderLib.backgroundCube.fragmentShader.split(voidMain)\n            if (split.length !== 2) {\n                viewer.console.error('HDRi Ground Plugin: Could not parse backgroundCube shader')\n            } else {\n                ShaderLib.backgroundCube.fragmentShader = split[0] + `\n${hdriGroundProj}\n${voidMain}\nvec3 worldDirection = \n#ifdef HDRi_GROUND_PROJ\nhdriProject()\n#else\nvWorldDirection\n#endif\n;\n${shaderReplaceString(split[1], 'vWorldDirection', 'worldDirection', {replaceAll: true})}\n`\n            }\n        }\n\n        viewer.scene.addEventListener('environmentChanged', this.setDirty)\n    }\n\n}\n","import {UiObjectConfig} from 'uiconfig.js'\nimport {Group2, IObject3D, IWidget} from '../../core'\nimport {AViewerPluginSync, type IViewerEvent, IViewerEventTypes, ThreeViewer} from '../../viewer'\nimport {IEvent, onChange} from 'ts-browser-helpers'\nimport {\n    CameraHelper2,\n    DirectionalLightHelper2,\n    LineHelper,\n    PointLightHelper2,\n    SkeletonHelper2,\n    SpotLightHelper2,\n} from '../../three/widgets'\nimport {PartialRecord} from '../../utils'\n\nexport interface IObject3DHelper<T extends IWidget = IWidget>{\n    Create: (o: IObject3D)=>T,\n    Check: (o: IObject3D)=>boolean,\n}\n\n/**\n * Automatically creates and manages helper widgets for lights, cameras, lines, and skeletons.\n * Custom widget types can be registered via the `helpers` array.\n * See https://threepipe.org/notes/widgets-and-helpers for the full widget system documentation.\n * @category Plugins\n */\nexport class Object3DWidgetsPlugin extends AViewerPluginSync {\n    @onChange(Object3DWidgetsPlugin.prototype.setDirty)\n        enabled = true\n    public static readonly PluginType = 'Object3DWidgetsPlugin'\n\n    helpers: IObject3DHelper[] = [\n        DirectionalLightHelper2,\n        SpotLightHelper2,\n        PointLightHelper2,\n        CameraHelper2,\n        LineHelper,\n        SkeletonHelper2,\n        // BoneHelper,\n    ]\n\n    setDirty() {\n        this.widgets?.forEach(w => w.visible = !this.isDisabled())\n        this._viewer?.setDirty()\n    }\n\n    toJSON: any = null\n    inSceneRoot = false\n\n    constructor(enabled = true, inSceneRoot = false) {\n        super()\n        this.enabled = enabled\n        this.inSceneRoot = inSceneRoot\n    }\n\n    private _widgetRoot = new Group2()\n\n    private _modelRoot?: IObject3D\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._widgetRoot.userData.isWidgetRoot = true\n        this._widgetRoot.name = 'Widgets Root'\n        this._modelRoot = this.inSceneRoot ? viewer.scene : viewer.scene.modelRoot\n\n        viewer.scene.addObject(this._widgetRoot, {addToRoot: true, autoScale: false, autoCenter: false})\n\n        viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n        viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n\n    }\n    onRemove(viewer: ThreeViewer) {\n        viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n        this.widgets.forEach(w => w.dispose && w.dispose())\n        this.widgets = []\n        this._widgetRoot.removeFromParent()\n        this._widgetRoot.clear()\n        super.onRemove(viewer)\n    }\n\n    refreshObject = (object?: IObject3D)=>{\n        const r = this._createWidget(object)\n        if (!r) {\n            this._removeWidget(object)\n        }\n    }\n\n    protected _viewerListeners: PartialRecord<IViewerEventTypes, (e: IViewerEvent)=>void> = {\n        preRender: ()=>{\n            this.widgets.forEach(w => w.preRender && w.preRender())\n        },\n    }\n\n    widgets: (IWidget)[] = []\n\n    private _widgetDisposed = (e: IEvent<any>)=> this._unregisterWidget(e.target)\n\n    private _registerWidget(w: IWidget) {\n        this.widgets.push(w)\n        w.addEventListener('dispose', this._widgetDisposed) // todo: maybe unregister when removed from parent, dispose makes little sense.\n    }\n    private _unregisterWidget(w: IWidget) {\n        w.removeEventListener('dispose', this._widgetDisposed)\n        const i = this.widgets.indexOf(w)\n        if (i >= 0) this.widgets.splice(i, 1)\n    }\n\n    private _createWidget(o?: IObject3D) {\n        if (!o || o.assetType === 'widget' || o === this._widgetRoot || o.isWidget) {\n            return false\n        }\n        if (o.userData.disableWidgets) return false\n        let ignored = false\n        let inSceneRoot = false\n        o.traverseAncestors(c=> {\n            ignored = ignored\n                || c === this._widgetRoot || !!c.isWidget || c.assetType === 'widget' // inside a widget\n                || !!c.userData.disableWidgets\n            inSceneRoot = inSceneRoot || c === this._modelRoot\n        })\n        if (ignored) return false\n        if (!inSceneRoot) return false\n\n        const widget = this.widgets.find(w => w.object === o)\n        if (widget) {\n            widget.update && widget.update()\n            return true\n        }\n        const helpers = this.helpers.filter(h => h.Check(o))\n        for (const h of helpers) {\n            const w = h.Create(o)\n            w.visible = !this.isDisabled()\n            this._widgetRoot.add(w)\n            this._registerWidget(w)\n        }\n        return true\n    }\n\n    private _removeWidget(o?: IObject3D) {\n        if (!o) return\n        const widgetsToRemove = this.widgets.filter(w => w.object === o)\n        for (const w of widgetsToRemove) {\n            w.dispose && w.dispose(true)\n            w.parent && w.removeFromParent()\n            this._unregisterWidget(w)\n        }\n    }\n\n    private _objectAdd = (e: {object?: IObject3D})=>{\n        const l = e.object\n        this._createWidget(l)\n    }\n\n    private _objectRemove = (e: {object?: IObject3D})=>{\n        const l = e.object\n        this._removeWidget(l)\n    }\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Widgets',\n        children: [\n            {\n                type: 'checkbox',\n                label: 'Enabled',\n                property: [this, 'enabled'],\n            },\n        ],\n    }\n}\n","import {AViewerPluginSync} from '../../viewer'\nimport {\n    AmbientLight2,\n    DirectionalLight2,\n    Group2,\n    HemisphereLight2,\n    IObject3D, Object3D2,\n    OrthographicCamera2,\n    PerspectiveCamera2,\n    PointLight2,\n    RectAreaLight2,\n    SpotLight2,\n} from '../../core'\nimport {uiButton, uiDropdown, uiPanelContainer} from 'uiconfig.js'\nimport {Vector3} from 'three'\nimport type {UndoManagerPlugin} from '../interaction/UndoManagerPlugin'\n\n/**\n * Adds support for generating different types of lights and camera objects in the viewer, along with UI to do so.\n *\n * Custom generators can be added for more object types, check {@link GeometryGeneratorPlugin} for reference.\n * @category Plugins\n */\n@uiPanelContainer('Generate Scene Objects')\nexport class Object3DGeneratorPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'Object3DGeneratorPlugin'\n    enabled = true\n    toJSON: any = undefined\n\n    @uiDropdown('Type', undefined, (that)=>({\n        children: [()=>Object.keys(that.generators).map(label=>({label}))],\n    }))\n    protected _selectedType = ''\n\n    @uiButton('Generate', {sendArgs: false})\n    generate(type?: string, params?: any, addToScene = true, select = true, trackUndo = true): IObject3D | undefined {\n        if (!this._viewer) throw new Error('No viewer')\n        const obj = this.generators[type ?? this._selectedType]?.(params)\n        if (addToScene && obj) {\n            const cmd = {\n                redo: ()=>this._viewer?.scene.addObject(obj),\n                undo: ()=>obj.dispose ? obj.dispose(true) : obj.removeFromParent(),\n            }\n            if (trackUndo) this._viewer?.getPlugin<UndoManagerPlugin>('UndoManagerPlugin')?.undoManager?.record(cmd)\n            cmd.redo()\n            select && obj.dispatchEvent({type: 'select', value: obj, object: obj, ui: true, bubbleToParent: true, trackUndo: false})\n        }\n        return obj || undefined\n    }\n\n    generators: Record<string, (params?: any)=>IObject3D> = {\n        ['object-empty']: (params: {\n            position?: Vector3,\n            name?: string,\n        } = {})=>{\n            const obj = new Object3D2()\n            params.position ? obj.position.copy(params.position) : obj.position.set(0, 0, 0)\n            obj.name = params.name ?? 'New Object'\n            return obj\n        },\n        ['object-group']: (params: {\n            position?: Vector3,\n            name?: string,\n        } = {})=>{\n            const obj = new Group2()\n            params.position ? obj.position.copy(params.position) : obj.position.set(0, 0, 0)\n            obj.name = params.name ?? 'New Object'\n            return obj\n        },\n        ['camera-perspective']: (params: {\n            controlsMode?: string,\n            autoAspect?: boolean,\n            fov?: number,\n            aspect?: number,\n            position?: Vector3,\n            target?: Vector3,\n            autoLookAtTarget?: boolean,\n            name?: string,\n        } = {})=>{\n            const camera = new PerspectiveCamera2(\n                params.controlsMode ?? '',\n                this._viewer?.canvas,\n                params.autoAspect,\n                params.fov,\n                params.aspect,\n            )\n            params.position ? camera.position.copy(params.position) : camera.position.set(0, 0, 5)\n            params.target ? camera.target.copy(params.target) : camera.target.set(0, 0, 0)\n            camera.autoLookAtTarget = params.autoLookAtTarget ?? true\n            camera.setDirty()\n            camera.name = params.name ?? 'Perspective Camera'\n            return camera\n        },\n        ['camera-orthographic']: (params: {\n            controlsMode?: string,\n            autoAspect?: boolean,\n            frustumSize?: number,\n            position?: Vector3,\n            target?: Vector3,\n            autoLookAtTarget?: boolean,\n            name?: string,\n        } = {})=>{\n            const camera = new OrthographicCamera2(\n                params.controlsMode ?? '',\n                this._viewer?.canvas,\n                params.autoAspect,\n                params.frustumSize,\n            )\n            params.position ? camera.position.copy(params.position) : camera.position.set(0, 0, 5)\n            params.target ? camera.target.copy(params.target) : camera.target.set(0, 0, 0)\n            camera.autoLookAtTarget = params.autoLookAtTarget ?? true\n            camera.setDirty()\n            camera.name = params.name ?? 'Orthographic Camera'\n            return camera\n        },\n        ['light-directional']: (params: {\n            color?: number,\n            intensity?: number,\n            position?: Vector3,\n            target?: Vector3,\n            name?: string,\n        } = {})=>{\n            const light = new DirectionalLight2(params.color ?? 0xff0000, params.intensity ?? 3)\n            params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)\n            light.lookAt(params.target ?? new Vector3(0, 0, 0))\n            light.name = 'Directional Light'\n            return light\n        },\n        ['light-ambient']: (params: {\n            color?: number,\n            intensity?: number,\n            name?: string,\n        } = {})=>{\n            const light = new AmbientLight2(params.color ?? 0xffffff, params.intensity ?? 1)\n            light.name = 'Ambient Light'\n            return light\n        },\n        ['light-point']: (params: {\n            color?: number,\n            intensity?: number,\n            position?: Vector3,\n            name?: string,\n        } = {})=>{\n            const light = new PointLight2(params.color ?? 0xff0000, params.intensity ?? 3)\n            params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)\n            light.name = 'Point Light'\n            return light\n        },\n        ['light-spot']: (params: {\n            color?: number,\n            intensity?: number,\n            position?: Vector3,\n            target?: Vector3,\n            name?: string,\n        } = {})=>{\n            const light = new SpotLight2(params.color ?? 0xff0000, params.intensity ?? 3)\n            params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)\n            light.lookAt(params.target ?? new Vector3(0, 0, 0))\n            light.name = 'Spot Light'\n            return light\n        },\n        ['light-hemisphere']: (params: {\n            color?: number,\n            intensity?: number,\n            name?: string,\n        } = {})=>{\n            const light = new HemisphereLight2(params.color ?? 0xaaaaff, 0x555443, params.intensity ?? 1)\n            light.name = 'Hemisphere Light'\n            return light\n        },\n        ['light-rect-area']: (params: {\n            color?: number,\n            intensity?: number,\n            position?: Vector3,\n            target?: Vector3,\n            name?: string,\n        } = {})=>{\n            const light = new RectAreaLight2(params.color ?? 0x000ff, params.intensity ?? 3, 2, 2)\n            params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)\n            light.lookAt(params.target ?? new Vector3(0, 0, 0))\n            light.name = 'Rect Area Light'\n            return light\n        },\n    }\n\n    constructor() {\n        super()\n        this._selectedType = Object.keys(this.generators)[0]\n    }\n\n    removeObject3DGenerators(prefix: string, refresh = true) {\n        this.generators = Object.fromEntries(Object.entries(this.generators)\n            .filter(([k, _]) => !k.startsWith(prefix))) as any\n        refresh && this.uiConfig?.uiRefresh?.(true)\n        return this\n    }\n\n    removeObject3DGenerator(key: string, refresh = true) {\n        delete this.generators[key]\n        refresh && this.uiConfig?.uiRefresh?.(true)\n        return this\n    }\n\n    addObject3DGenerators(prefix: string, generators: Record<string, (params: any) => IObject3D>, refresh = true) {\n        this.removeObject3DGenerators(prefix, false)\n        Object.entries(generators).forEach(([key, callback])=>{\n            this.generators[prefix + key] = callback\n        })\n        refresh && this.uiConfig?.uiRefresh?.(true)\n    }\n    addObject3DGenerator(key: string, generator: (params: any) => IObject3D, refresh = true) {\n        this.removeObject3DGenerator(key, false)\n        this.generators[key] = generator\n        refresh && this.uiConfig?.uiRefresh?.(true)\n    }\n\n}\n","import {getOrCall, onChange, serialize} from 'ts-browser-helpers'\nimport {\n    BasicDepthPacking,\n    Color,\n    Euler,\n    LinearFilter,\n    MeshDepthMaterial,\n    NoBlending,\n    NoColorSpace,\n    OrthographicCamera,\n    RGBAFormat, Texture,\n    UnsignedByteType,\n    Vector3,\n    WebGLRenderTarget,\n} from 'three'\nimport {BaseGroundPlugin} from '../base/BaseGroundPlugin'\nimport {GBufferRenderPass} from '../../postprocessing'\nimport {ThreeViewer} from '../../viewer'\nimport {IRenderTarget} from '../../rendering'\nimport {uiDropdown, uiPanelContainer, uiSlider, uiToggle} from 'uiconfig.js'\nimport {HVBlurHelper} from '../../three/utils/HVBlurHelper'\nimport {shaderReplaceString} from '../../utils'\nimport {PhysicalMaterial} from '../../core'\n\n@uiPanelContainer('Ground Plane (Contact Shadows)')\nexport class ContactShadowGroundPlugin extends BaseGroundPlugin {\n    static readonly PluginType = 'ContactShadowGroundPlugin'\n\n    @uiToggle('Contact Shadows')\n    @onChange(ContactShadowGroundPlugin.prototype.refresh)\n    @serialize() contactShadows = true\n\n    @uiSlider('Shadow Scale', [0, 2])\n    @serialize()\n    @onChange(ContactShadowGroundPlugin.prototype._refreshShadowCameraFrustum)\n        shadowScale = 1\n\n    @uiSlider('Shadow Height', [0, 20])\n    @serialize()\n    @onChange(ContactShadowGroundPlugin.prototype._refreshShadowCameraFrustum)\n        shadowHeight = 5\n\n    @uiSlider('Blur Amount', [0, 10])\n    @serialize()\n    @onChange(ContactShadowGroundPlugin.prototype._setDirty)\n        blurAmount = 1\n\n    @onChange(ContactShadowGroundPlugin.prototype._refreshMaterial)\n    @uiDropdown('Map Mode', ['aoMap', 'map', 'alphaMap'])\n    @serialize() mapMode: 'aoMap' | 'map' | 'alphaMap' = 'aoMap'\n\n    shadowCamera = new OrthographicCamera(-1, 1, 1, -1, 0.001, this.shadowHeight)\n    private _depthPass?: GBufferRenderPass<'contactShadowGround', WebGLRenderTarget|undefined>\n    private _blurHelper?: HVBlurHelper\n\n    constructor() {\n        super()\n        this._refreshShadowCameraFrustum = this._refreshShadowCameraFrustum.bind(this)\n        this.refresh = this.refresh.bind(this)\n    }\n\n    onAdded(viewer: ThreeViewer): void {\n        const target = viewer.renderManager.createTarget<IRenderTarget & WebGLRenderTarget>({\n            type: UnsignedByteType,\n            format: RGBAFormat,\n            colorSpace: NoColorSpace,\n            size: {width: 512, height: 512},\n            generateMipmaps: false,\n            depthBuffer: true,\n            minFilter: LinearFilter,\n            magFilter: LinearFilter,\n            // samples?\n        })\n        target.texture.name = 'groundContactDepthTexture'\n\n        // https://github.com/mrdoob/three.js/blob/master/examples/webgl_shadow_contact.html\n        const material = new MeshDepthMaterial({\n            // depthPacking: RGBADepthPacking, // todo\n            depthPacking: BasicDepthPacking,\n            transparent: false,\n            blending: NoBlending,\n        })\n        material.opacity = -1. // using opacity uniform to toggle for aomap/alphamap to flip the color in the shader\n        material.onBeforeCompile = (shader) => {\n            shader.fragmentShader = shaderReplaceString(shader.fragmentShader,\n                'gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );',\n                'gl_FragColor = vec4( opacity > 0. ? vec3( 1.0 - fragCoordZ ) : vec3( fragCoordZ ), 1.0 );',\n                // 'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * darkness );',\n            )\n        }\n\n        this._depthPass = new GBufferRenderPass('contactShadowGround', target, material, new Color(1, 1, 1), 1)\n        this._blurHelper = new HVBlurHelper(viewer)\n        super.onAdded(viewer)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        const target = getOrCall(this._depthPass?.target)\n        if (target) this._viewer?.renderManager.disposeTarget(target)\n        this._depthPass?.dispose()\n        this._depthPass = undefined\n        this._blurHelper?.dispose()\n        this._blurHelper = undefined\n        return super.onRemove(viewer)\n    }\n    // todo: dispose target, material, pass and stuff\n\n    protected _postFrame() {\n        super._postFrame()\n        if (!this._viewer) return\n\n    }\n\n    protected _preRender() {\n        super._preRender()\n        if (!this._viewer || !this._depthPass || !this._blurHelper || !this.contactShadows || !this.visible) return\n\n        this._depthPass.scene = this._viewer.scene\n        this._depthPass.camera = this.shadowCamera\n        this._depthPass.render(this._viewer.renderManager.renderer, null)\n\n        const target = getOrCall(this._depthPass.target)\n        if (!target) return\n\n        const blurTarget = this._viewer.renderManager.getTempTarget<IRenderTarget & WebGLRenderTarget>({\n            type: UnsignedByteType,\n            format: RGBAFormat,\n            colorSpace: NoColorSpace,\n            size: {width: 1024, height: 1024},\n            generateMipmaps: false,\n            depthBuffer: false,\n            minFilter: LinearFilter,\n            magFilter: LinearFilter,\n            // isAntialiased: this._viewer.isAntialiased,\n        })\n        this._blurHelper.blur(target.texture, target, blurTarget, this.blurAmount / 256)\n        this._blurHelper.blur(target.texture, target, blurTarget, 0.4 * this.blurAmount / 256)\n        this._viewer.renderManager.releaseTempTarget(blurTarget)\n    }\n\n    protected _refreshTransform() {\n        if (!super._refreshTransform()) return false\n\n        if (!this._mesh) return false\n        if (!this._viewer) return false\n\n        this.shadowCamera.position.copy(this._mesh.getWorldPosition(new Vector3()))\n        this.shadowCamera.setRotationFromEuler(new Euler(Math.PI / 2., 0, 0))\n        this.shadowCamera.updateMatrixWorld()\n        this._refreshShadowCameraFrustum()\n\n        this._mesh.scale.y = -this.size\n        return true\n    }\n\n    private _refreshShadowCameraFrustum() {\n        if (!this.shadowCamera) return\n        this.shadowCamera.left = -this.size / (2 * this.shadowScale)\n        this.shadowCamera.right = this.size / (2 * this.shadowScale)\n        this.shadowCamera.top = this.size / (2 * this.shadowScale)\n        this.shadowCamera.bottom = -this.size / (2 * this.shadowScale)\n        this.shadowCamera.far = this.shadowHeight\n        this.shadowCamera.updateProjectionMatrix()\n        this._setDirty()\n    }\n    private _setDirty() {\n        this._viewer?.setDirty()\n    }\n\n    protected _removeMaterial() {\n        if (!this._material) return\n        this._material.alphaMap = null\n        this._material.aoMap = null\n        this._material.map = null\n        if (this._material.userData.ssaoDisabled) delete this._material.userData.ssaoDisabled\n        if (this._material.userData.ssreflDisabled) delete this._material.userData.ssreflDisabled\n        if (this._material.userData.ssreflNonPhysical) delete this._material.userData.ssreflNonPhysical\n        super._removeMaterial()\n    }\n\n    private _depthTex: Texture|null = null\n    public refresh(): void {\n        if (!this._viewer) return\n        if (!this.contactShadows) {\n            if (this._material?.alphaMap === this._depthTex) {\n                this._material.alphaMap = null\n                this._material.setDirty()\n            }\n            if (this._material?.aoMap === this._depthTex) {\n                this._material.aoMap = null\n                this._material.setDirty()\n            }\n            if (this._material?.map === this._depthTex) {\n                this._material.map = null\n                this._material.setDirty()\n            }\n            if (this._material?.userData.__csgpParamsSet) {\n                delete this._material.userData.__csgpParamsSet\n                delete this._material.userData.ssaoDisabled\n                delete this._material.userData.ssreflDisabled\n                delete this._material.userData.ssreflNonPhysical\n            }\n            this._depthTex = null\n        } else {\n            this._depthTex = getOrCall(this._depthPass?.target)?.texture || null\n        }\n        super.refresh()\n    }\n\n    protected _createMaterial(material?: PhysicalMaterial): PhysicalMaterial {\n        const mat = super._createMaterial(material)\n        mat.roughness = 1\n        mat.metalness = 0\n        mat.color.set(0xffffff)\n        mat.transparent = true\n        // mat.userData.inverseAlphaMap = false // this must be false, if getting inverted colors, check clear color of gbuffer render pass.\n        return mat\n    }\n\n    protected _refreshMaterial() {\n        if (!this._viewer) return false\n        const isNewMaterial = super._refreshMaterial()\n        if (!this._material) return isNewMaterial\n        if (this.contactShadows) {\n            this._material.userData.ssaoDisabled = this.mapMode === 'aoMap'\n            this._material.userData.ssreflDisabled = this.mapMode === 'alphaMap'\n            this._material.userData.ssreflNonPhysical = false\n            this._material.userData.__csgpParamsSet = true\n            if (this._material.alphaMap === this._depthTex) {\n                this._material.alphaMap = null\n            }\n            if (this._material.aoMap === this._depthTex) {\n                this._material.aoMap = null\n            }\n            if (this._material.map === this._depthTex) {\n                this._material.map = null\n            }\n            this._material[this.mapMode] = this._depthTex\n            this._material.setDirty()\n            if (this._depthPass) {\n                this._depthPass.clearColor!.set(this.mapMode === 'aoMap' ? new Color(1, 1, 1) : new Color(0, 0, 0))\n                this._depthPass.clearAlpha = this.mapMode === 'aoMap' ? 1 : 0\n                this._depthPass.overrideMaterial!.opacity = this.mapMode === 'aoMap' ? -1 : 1\n            }\n        }\n        return isNewMaterial\n    }\n\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {PickingPlugin} from '../interaction/PickingPlugin'\nimport {uiButton, uiSlider} from 'uiconfig.js'\nimport {IGeometry, IObject3D} from '../../core'\nimport {ValOrArr} from 'ts-browser-helpers'\nimport {Vector3} from 'three'\n\nexport interface SimplifyOptions{\n    /**\n     * Number of vertices to remove.\n     * Factor is not used when count is set.\n     */\n    count?: number\n    /**\n     * Factor of vertices to remove. eg 0.5 will remove half of the vertices.\n     */\n    factor?: number\n    /**\n     * Replace the geometry with the simplified version in all meshes that use it.\n     */\n    replace?: boolean\n    /**\n     * Displace the simplified geometry in the scene. Only used when replace is true\n     * If set to true, the geometry will be disposed when replaced.\n     * Default is false.\n     * This will automatically be done when disposeOnIdle is not false in the geometry.userData.\n     */\n    disposeOnReplace?: boolean\n}\n\n/**\n * Boilerplate for implementing a plugin for simplifying geometries.\n * This is a base class and cannot be used directly.\n * See {@link MeshOptSimplifyModifierPlugin} the [simplify-modifier-plugin](https://threepipe.org/examples/#simplify-modifier-plugin) example for a sample implementation.\n */\nexport abstract class SimplifyModifierPlugin extends AViewerPluginSync {\n    public static readonly PluginType: string = 'SimplifyModifierPlugin'\n    enabled = true\n    toJSON: any = undefined\n\n    constructor() {\n        super()\n    }\n\n    get initialized() { return true }\n    async initialize() {return}\n\n    private _pickingPlugin?: PickingPlugin\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._pickingPlugin = viewer.getPlugin(PickingPlugin)\n    }\n\n    /**\n     * Factor of vertices to remove. eg 0.5 will remove half of the vertices.\n     * Default is 0.5\n     * This is used when no factor or count is provided in the options to simplifyGeometry or simplifyGeometries.\n     */\n    @uiSlider('Simplify Factor', [0, 1])\n        simplifyFactor = 0.5\n\n    simplifyGeometries(geometry?: ValOrArr<IGeometry>, options?: SimplifyOptions) {\n        if (!geometry) {\n            const selected = this._pickingPlugin?.getSelectedObject<IObject3D>()\n            if (!selected?.isObject3D) return\n            const geom: IGeometry[] = []\n            selected?.traverse((o) => {\n                if (o.geometry && !geom.includes(o.geometry)) geom.push(o.geometry)\n            })\n            geometry = geom\n            if (!geometry || !geometry.length) return\n        }\n        if (!Array.isArray(geometry)) geometry = [geometry]\n        const res: IGeometry[] = []\n        for (const g of geometry) {\n            res.push(this.simplifyGeometry(g, options)!)\n        }\n        return res\n    }\n\n    simplifyGeometry(geometry?: IGeometry, {\n        factor,\n        count,\n        replace = true,\n        disposeOnReplace = false,\n    }: SimplifyOptions = {}): IGeometry|undefined {\n        if (!geometry) {\n            const selected = this._pickingPlugin?.getSelectedObject<IObject3D>()\n            geometry = selected?.geometry\n            if (!geometry) return undefined\n        }\n        if (!geometry.attributes.position) {\n            this._viewer?.console.error('SimplifyModifierPlugin: Geometry does not have position attribute', geometry)\n            return geometry\n        }\n        factor = factor || this.simplifyFactor\n        count = count || geometry.attributes.position.count * factor\n        if (!geometry.boundingBox) geometry.computeBoundingBox()\n        const simplified = this._simplify(geometry, count)\n        simplified.computeBoundingBox()\n        simplified.computeBoundingSphere()\n        simplified.computeVertexNormals()\n        const bbox = simplified.boundingBox\n        const size = bbox!.getSize(new Vector3())\n        if (!isFinite(size.x) || !isFinite(size.y) || !isFinite(size.z)) {\n            this._viewer?.console.error('SimplifyModifierPlugin: Unable to simplify', geometry, simplified, size)\n            return geometry\n        }\n        const oldBB = geometry.boundingBox\n        const oldSize = oldBB!.getSize(new Vector3())\n        const diff = size.clone().sub(oldSize)\n        const diffPerc = diff.clone().divide(oldSize)\n        if (diffPerc.lengthSq() > 0.001) {\n            // todo: add option to skip this\n            console.warn('Simplify', geometry, simplified, bbox, oldBB, size, oldSize, diff, diffPerc)\n        }\n        // simplified.setDirty()\n        if (!replace) return simplified\n\n        // not working?\n        // geometry.copy(simplified)\n        // geometry.setDirty()\n        // simplified.dispose()\n\n        const meshes = geometry.appliedMeshes\n        if (!meshes) {\n            console.error('No meshes found for geometry, cannot replace', geometry)\n            return simplified\n        }\n        for (const mesh of meshes) {\n            mesh.geometry = simplified\n        }\n        if (disposeOnReplace) {\n            geometry.dispose(true)\n        }\n        return simplified\n    }\n\n    /**\n     * Sample for three.js addons SimplifyModifier:\n     * `\n     *     import {SimplifyModifier} from 'three/examples/jsm/modifiers/SimplifyModifier'\n     *     protected _simplify(geometry: IGeometry, count: number): IGeometry {\n     *         const modifier = new SimplifyModifier()\n     *         return modifier.modify(geometry, count) as IGeometry\n     *     }\n     * `\n     * @param geometry\n     * @param count\n     */\n    protected abstract _simplify(geometry: IGeometry, count: number): IGeometry\n\n    @uiButton('Simplify All', {sendArgs: false})\n    async simplifyAll(root?: IObject3D, options?: SimplifyOptions) {\n        if (!root && this._viewer) root = this._viewer.scene.modelRoot\n        if (!root) {\n            console.error('SimplifyModifierPlugin: No root found')\n            return\n        }\n        if (!this.initialized) {\n            await this.initialize()\n            if (!this.initialized) {\n                this._viewer?.console.error('SimplifyModifierPlugin cannot be initialized')\n                return\n            }\n        }\n        const geometries: IGeometry[] = []\n        root.traverse((o) => {\n            if (o.geometry && !geometries.includes(o.geometry)) geometries.push(o.geometry)\n        })\n        if (!geometries.length) {\n            console.error('SimplifyModifierPlugin: No geometries found')\n            return\n        }\n        return this.simplifyGeometries(geometries, options)\n    }\n\n    @uiButton('Simplify Selected')\n    async simplifySelected() {\n        if (!this._viewer) return\n        if (!this.initialized) {\n            await this.initialize()\n            if (!this.initialized) {\n                await this._viewer.dialog.alert('Simplify: SimplifyModifierPlugin cannot be initialized')\n                return\n            }\n        }\n        const selected = this._pickingPlugin?.getSelectedObject<IObject3D>()\n        if (!selected?.isObject3D) {\n            await this._viewer.dialog.alert('Simplify: No Object Selected')\n            return\n        }\n        let doAll = false\n        if (!selected.geometry) doAll = true\n        else if (selected.children.length === 0) doAll = true\n        if (!doAll) {\n            const resp = await this._viewer.dialog.confirm('Simplify: Simplify all in hierarchy?')\n            if (resp) doAll = true\n        }\n        if (doAll) {\n            this.simplifyGeometries()\n        } else {\n            this.simplifyGeometry(selected.geometry)\n        }\n    }\n\n}\n","import {ThreeViewer} from '../../viewer'\nimport {BufferAttribute, BufferGeometry} from 'three'\nimport {IGeometry, iGeometryCommons} from '../../core'\nimport {toIndexedGeometry} from '../../three'\nimport {SimplifyModifierPlugin} from './SimplifyModifierPlugin'\nimport {uiFolderContainer, uiNumber, uiToggle} from 'uiconfig.js'\n\n/**\n * Simplify modifier using [meshoptimizer](https://github.com/zeux/meshoptimizer) library.\n * Loads the library at runtime from a customisable cdn url.\n */\n@uiFolderContainer('Simplify Modifier (meshopt)')\nexport class MeshOptSimplifyModifierPlugin extends SimplifyModifierPlugin {\n    public static readonly PluginType = 'MeshOptSimplifyModifierPlugin'\n\n    constructor(initialize = true, public readonly rootNode = document.head) {\n        super()\n        // todo: check if compatible?\n        if (initialize) this.initialize()\n    }\n\n    get initialized() {\n        return !!window.MeshoptSimplifier\n    }\n\n    /**\n     * Path to the meshopt simplifier library, default uses unpkg cdn\n     */\n    static SIMPLIFIER_URL = 'https://unpkg.com/meshoptimizer@0.20.0/meshopt_simplifier.module.js'\n    // static SIMPLIFIER_URL = 'https://cdn.jsdelivr.net/gh/zeux/meshoptimizer@master/js/meshopt_simplifier.module.js'\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n    }\n\n    protected _initializing?: Promise<void> = undefined\n    protected _script?: HTMLScriptElement\n\n    async initialize() {\n        if (this.initialized) return\n        if (this._initializing) return await this._initializing\n        const s = document.createElement('script')\n        s.type = 'module'\n        const ev = Math.random().toString(36).substring(7)\n        s.innerHTML = `\nimport { MeshoptSimplifier } from ${JSON.stringify(MeshOptSimplifyModifierPlugin.SIMPLIFIER_URL)};\nMeshoptSimplifier.ready.then(() => {\nwindow.MeshoptSimplifier = MeshoptSimplifier;\nwindow.dispatchEvent(new CustomEvent('${ev}'))\n});\n`\n        this._initializing = new Promise<void>((res) => {\n            window.addEventListener(ev, ()=>res(), {once: true})\n            this.rootNode.appendChild(s)\n            this._script = s\n        })\n        return await this._initializing\n    }\n\n    dispose() {\n        if (this._script) {\n            this._script.remove()\n            delete window.MeshoptSimplifier\n        }\n        this._script = undefined\n    }\n\n    @uiNumber()\n        errorThreshold = 0.5\n    @uiToggle()\n        lockBorder = false\n\n    protected _simplify(geometry: BufferGeometry, count: number): IGeometry {\n        if (!this.initialized) throw new Error('MeshOptSimplifyModifierPlugin not initialized')\n        if (!geometry.index) {\n            geometry = toIndexedGeometry(geometry)\n        } else {\n            geometry = geometry.clone()\n        }\n        const srcIndexArray = geometry.index!.array\n        const srcPositionArray = geometry.attributes.position.array\n        const factor = count / geometry.attributes.position.count\n        // console.log(factor)\n        // const targetCount = count * 3\n        const targetCount = 3 * Math.floor(factor * srcIndexArray.length / 3)\n        // console.log('srcCount', srcIndexArray.length / 3, 'targetCount', targetCount / 3)\n        // const errorThresh = 1e-2\n        const [dstIndexArray, error] = window.MeshoptSimplifier.simplify(\n            srcIndexArray,\n            srcPositionArray,\n            3,\n            targetCount,\n            this.errorThreshold,\n            this.lockBorder ? ['LockBorder'] : [],\n        )\n        console.log('srcCount', srcIndexArray.length / 3, 'destCount', dstIndexArray.length / 3)\n        if (error) {\n            console.warn('Simplify error', error)\n            // return geometry // todo\n        }\n        // (geometry.index!.array as Uint32Array).set(dstIndexArray)\n        geometry.setIndex(new BufferAttribute(new Uint32Array(dstIndexArray), 1))\n        // geometry.index!.needsUpdate = true\n        // geometry.setDrawRange(0, dstIndexArray.length)\n        return iGeometryCommons.upgradeGeometry.call(geometry.toNonIndexed())\n    }\n}\n\ndeclare global{\n    interface Window{\n        MeshoptSimplifier?: any\n    }\n}\n","/**\n * Materials variants extension\n * Modified from https://github.com/takahirox/three-gltf-extensions/blob/main/loaders/KHR_materials_variants/KHR_materials_variants.js\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_variants\n */\n\nimport {Material, Mesh, Object3D} from 'three'\nimport {GLTFParser} from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport {IObject3D} from '../../../core'\n\n// export type OnUpdateType = ((arg0: Mesh, arg1: Material, arg2: any) => void) | null\n\n/**\n * KHR_materials_variants specification allows duplicated variant names\n * but it makes handling the extension complex.\n * We ensure tha names and make it easier.\n * If you want to export the extension with the original names\n * you are recommended to write GLTFExporter plugin to restore the names.\n *\n * @param variantNames {Array<string>}\n * @return {Array<string>}\n */\nconst ensureUniqueNames = (variantNames: string[]): string[] => {\n    const uniqueNames = []\n    const knownNames = new Set()\n\n    for (const name of variantNames) {\n        let uniqueName = name\n        let suffix = 0\n        // @TODO: An easy solution.\n        //        O(N^2) in the worst scenario where N is variantNames.length.\n        //        Fix me if needed.\n        while (knownNames.has(uniqueName)) {\n            uniqueName = name + '.' + ++suffix\n        }\n        knownNames.add(uniqueName)\n        uniqueNames.push(uniqueName)\n    }\n\n    return uniqueNames\n}\n\n/**\n * Convert mappings array to table object to make handling the extension easier.\n *\n * @param extensionDef {glTF.meshes[n].primitive.extensions.KHR_materials_variants}\n * @param variantNames {Array<string>} Required to be unique names\n * @return {Object}\n */\nconst mappingsArrayToTable = (extensionDef: any, variantNames: string[]): any => {\n    const table: any = {}\n    for (const mapping of extensionDef.mappings) {\n        for (const variant of mapping.variants) {\n            table[variantNames[variant]] = {\n                material: null,\n                gltfMaterialIndex: mapping.material,\n            }\n        }\n    }\n    return table\n}\n\n/**\n * @param object {THREE.Object3D}\n * @return {boolean}\n */\nconst compatibleObject = (object: Object3D) => {\n    return (object as Mesh).material !== undefined && // easier than (!object.isMesh && !object.isLine && !object.isPoints)\n        object.userData && // just in case\n        object.userData._variantMaterials\n}\n\nexport const khrMaterialsVariantsGLTF = 'KHR_materials_variants'\nexport class GLTFMaterialsVariantsExtensionImport {\n    name = khrMaterialsVariantsGLTF\n\n    constructor(public parser: GLTFParser) {\n    }\n\n    // Note that the following properties will be overridden even if they are pre-defined\n    // - mesh.userData._variantMaterials\n    async afterRoot(gltf: any) {\n        const parser = this.parser\n        const json = parser.json\n\n        if (!json.extensions || !json.extensions[this.name]) return\n\n        const extensionDef = json.extensions[this.name]\n        const variantsDef = extensionDef.variants || []\n        const variants = ensureUniqueNames(variantsDef.map((v: any) => v.name))\n\n        // Save the _variantMaterials data under associated mesh.userData\n        for (const scene of gltf.scenes) {\n            // Save the variants data under associated mesh.userData\n            (scene as IObject3D).traverse(object => {\n                const association = parser.associations.get(object)\n\n                if (!association || association.meshes === undefined || (association as any).primitives === undefined) {\n                    return\n                }\n\n                const meshDef = json.meshes[association.meshes]\n                const primitiveDef = meshDef.primitives[(association as any).primitives]\n                const extensionsDef = primitiveDef.extensions\n\n                if (!extensionsDef || !extensionsDef[this.name]) {\n                    return\n                }\n\n                // object should be Mesh\n                object.userData._variantMaterials = mappingsArrayToTable(extensionsDef[this.name], variants)\n            })\n        }\n\n        // gltf.userData.variants = variants\n\n        /**\n         * @param object {THREE.Mesh}\n         * @return {Promise}\n         */\n        const ensureLoadVariants = async(object: Mesh) => {\n            const currentMaterial = object.material as Material\n            const variantMaterials = object.userData._variantMaterials\n            const pending = []\n            for (const variantName in variantMaterials) {\n                const variantMaterial = variantMaterials[variantName]\n                if (variantMaterial.material) {\n                    continue\n                }\n                const materialIndex = variantMaterial.gltfMaterialIndex\n                pending.push(parser.getDependency('material', materialIndex).then(material => {\n                    object.material = material\n                    parser.assignFinalMaterial(object)\n                    variantMaterials[variantName].material = object.material\n                    // delete variantMaterials[variantName].gltfMaterialIndex // todo;\n                }))\n            }\n            return Promise.all(pending).then(() => {\n                object.material = currentMaterial\n            })\n        }\n\n        await Promise.all(gltf.scenes.map(async(scene: Object3D) => {\n            const pending: Promise<any>[] = []\n            scene.traverse(o => compatibleObject(o) && pending.push(ensureLoadVariants(o as Mesh)))\n            if (!scene.userData.__importData) scene.userData.__importData = {}\n            scene.userData.__importData[khrMaterialsVariantsGLTF] = {\n                names: variants,\n            }\n            return Promise.all(pending)\n        }))\n\n    }\n}\n","/**\n * Materials variants extension\n * Modified from https://github.com/takahirox/three-gltf-extensions/blob/main/exporters/KHR_materials_variants/KHR_materials_variants_exporter.js\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_variants\n */\n\nimport {Material, Mesh, Object3D} from 'three'\nimport {khrMaterialsVariantsGLTF} from './GLTFMaterialsVariantsExtensionImport'\nimport {GLTFWriter2} from '../../../assetmanager'\n\n/**\n * @param object {THREE.Object3D}\n * @return {boolean}\n */\nconst compatibleObject = (object: Object3D) => {\n    return (object as Mesh).material !== undefined && // easier than (!object.isMesh && !object.isLine && !object.isPoints)\n        object.userData && // just in case\n        object.userData._variantMaterials &&\n        !!Object.values(object.userData._variantMaterials).filter(m => compatibleMaterial((m as Mesh)?.material as any))\n}\n\n/**\n * @param material {THREE.Material}\n * @return {boolean}\n */\nconst compatibleMaterial = (material: Material) => {\n    // @TODO: support multi materials?\n    return material && material.isMaterial && !Array.isArray(material)\n}\n\nexport class GLTFExporterMaterialsVariantsExtensionExport {\n    name = khrMaterialsVariantsGLTF\n    variantNames: string[] = []\n\n    constructor(public writer: GLTFWriter2) {\n    }\n\n    beforeParse(objects: Object3D[]) {\n        // Find all variant names and store them to the table\n        const variantNameTable = new Set<string>()\n        for (const object of objects) {\n            object.traverse(o => {\n                if (!compatibleObject(o)) {\n                    return\n                }\n                const variantMaterials = o.userData._variantMaterials\n                for (const variantName in variantMaterials) {\n                    const variantMaterial = variantMaterials[variantName]\n                    // Ignore unloaded variant materials\n                    if (compatibleMaterial(variantMaterial.material)) {\n                        variantNameTable.add(variantName)\n                    }\n                }\n            })\n        }\n        // We may want to sort?\n        variantNameTable.forEach(name => this.variantNames.push(name))\n    }\n\n    writeMesh(mesh: Mesh, meshDef: any) {\n        if (!compatibleObject(mesh)) {\n            return\n        }\n\n        const userData = mesh.userData\n        const variantMaterials = userData._variantMaterials\n        const mappingTable: Record<number, any> = {}\n        for (const variantName in variantMaterials) {\n            const variantMaterialInstance = variantMaterials[variantName].material\n            if (!compatibleMaterial(variantMaterialInstance)) {\n                continue\n            }\n            const variantIndex = this.variantNames.indexOf(variantName) // Shouldn't be -1\n            const materialIndex = this.writer.processMaterial(variantMaterialInstance)!\n            if (!mappingTable[materialIndex]) {\n                mappingTable[materialIndex] = {\n                    material: materialIndex,\n                    variants: [],\n                }\n            }\n            mappingTable[materialIndex].variants.push(variantIndex)\n        }\n\n        const mappingsDef = Object.values(mappingTable)\n            .map(m => {return (m.variants as number[]).sort((a, b) => a - b) && m})\n            .sort((a, b) => a.material - b.material)\n\n        if (mappingsDef.length === 0) {\n            return\n        }\n\n        const originalMaterialIndex = compatibleMaterial(userData._originalMaterial)\n            ? this.writer.processMaterial(userData._originalMaterial) ?? -1 : -1\n\n        for (const primitiveDef of meshDef.primitives) {\n            // Override primitiveDef.material with original material.\n            if (originalMaterialIndex >= 0) {\n                primitiveDef.material = originalMaterialIndex\n            }\n            primitiveDef.extensions = primitiveDef.extensions || {}\n            primitiveDef.extensions[this.name] = {mappings: mappingsDef}\n        }\n    }\n\n    afterParse(_input: any) {\n        if (this.variantNames.length === 0) {\n            return\n        }\n\n        const root = this.writer.json\n        root.extensions = root.extensions || {}\n\n        const variantsDef = this.variantNames.map(n => {return {name: n}})\n        root.extensions[this.name] = {variants: variantsDef}\n        this.writer.extensionsUsed[this.name] = true\n    }\n}\n\nexport function gltfExporterMaterialsVariantsExtensionExport(writer: GLTFWriter2) {\n    return new GLTFExporterMaterialsVariantsExtensionExport(writer)\n}\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {AssetManager} from '../../assetmanager'\nimport {onChange, serialize} from 'ts-browser-helpers'\nimport {IMaterial, IObject3D} from '../../core'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {\n    GLTFMaterialsVariantsExtensionImport,\n    khrMaterialsVariantsGLTF,\n} from './helpers/GLTFMaterialsVariantsExtensionImport'\nimport {gltfExporterMaterialsVariantsExtensionExport} from './helpers/GLTFMaterialsVariantsExtensionExport'\n\n/**\n * GLTF khr_material_variants plugin\n *\n * This plugin allows to import and export gltf files with KHR_materials_variants extension.\n * The material data is stored in the object userData. The plugin also provides a UI to select the variant.\n *\n * @category Plugins\n */\nexport class GLTFKHRMaterialVariantsPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'GLTFKHRMaterialVariantsPlugin'\n    enabled = true\n\n    constructor() {\n        super()\n    }\n\n    onAdded(v: ThreeViewer): void {\n        super.onAdded(v)\n        // v.addEventListener('preRender', this._preRender)\n        // todo use object3dmanager here instead of addSceneObject\n        v.scene.addEventListener('addSceneObject', this._objectAdded)\n        v.assetManager.registerGltfExtension(khrMaterialVariantsGLTFExtension)\n    }\n\n    onRemove(v: ThreeViewer): void {\n        v.scene.removeEventListener('addSceneObject', this._objectAdded)\n        v.assetManager.unregisterGltfExtension(khrMaterialVariantsGLTFExtension.name)\n        this.variants = {}\n        return super.onRemove(v)\n    }\n\n\n    variants: Record<string, IObject3D[]> = {} // dont serialize this\n\n    /**\n     * The selected variant. Changing this will automatically apply the variant to the objects.\n     */\n    @onChange(GLTFKHRMaterialVariantsPlugin.prototype._variantChanged)\n    @serialize()\n        selectedVariant = ''\n\n    /**\n     * If true, the first variant will be applied to the objects when object is added and nothing is selected.\n     */\n    @serialize()\n        applyFirstVariantOnLoad = true\n\n    private _variantChanged() {\n        this.applyVariant(this.selectedVariant || '', true)\n    }\n\n    /**\n     * Apply the variant to objects.\n     * It will also change the `selectedVariant` if `root` is not provided.\n     * @param name\n     * @param force\n     * @param root\n     * @param doTraverse\n     */\n    applyVariant(name: string, force = false, root?: IObject3D[], doTraverse = true) {\n        if (!force && !root && this.selectedVariant === name) return\n        if (!name) return\n        if (!root) this.selectedVariant = name\n        const objects = root ?\n            Array.isArray(root) ? root : [root] :\n            name ? this.variants[name] || [] : Object.values(this.variants).flat()\n        for (const object of objects) {\n            const done = new Set()\n            const apply = (obj: IObject3D)=>{\n                if (!obj.userData._variantMaterials || done.has(obj)) return\n                const va = name ? obj.userData._variantMaterials[name]?.material : obj.userData._originalMaterial\n                if (va) {\n                    if (!obj.userData._originalMaterial) obj.userData._originalMaterial = obj.material\n                    obj.material = va\n                }\n                done.add(obj)\n            }\n            if (doTraverse) object.traverse(apply)\n            else apply(object)\n        }\n    }\n\n    private _objectAdded = (ev: any)=>{\n        const object = ev.object as IObject3D\n        if (!object?.isObject3D) return\n        if (!this._viewer) return\n        object.traverse((obj)=>{\n            if (obj.userData._variantMaterials) {\n                for (const val of Object.values(obj.userData._variantMaterials) as any) {\n                    if (val?.material) val.material = this._viewer?.materialManager.convertToIMaterial(val.material, {}) || val.material\n                }\n            }\n\n            const d = obj.userData?.__importData?.[khrMaterialsVariantsGLTF]\n            if (!d) return\n            const names = d.names || [] as string[]\n            for (const name of names) {\n                if (!this.variants[name]) this.variants[name] = []\n                this.variants[name].push(obj)\n            }\n            delete obj.userData.__importData[khrMaterialsVariantsGLTF]\n        })\n        if (!this.selectedVariant && this.applyFirstVariantOnLoad) {\n            this.selectedVariant = Object.keys(this.variants)[0] || ''\n\n        }\n        this.uiConfig.uiRefresh?.()\n        return\n    }\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'KHR Material Variants',\n        children: [\n            ()=>({\n                children: [null, ...Object.keys(this.variants)].map((label) => !label ? {label: 'none', value: ''} : {label}),\n                type: 'dropdown',\n                label: 'Variant',\n                property: [this, 'selectedVariant'],\n            }),\n        ],\n    }\n\n}\n\ndeclare module './../../core/IObject'{\n    interface IObject3DUserData{\n        /**\n         * Starts with `_` so that its not saved in gltf, but saved in json.\n         */\n        _variantMaterials?: Record<string, {material: IMaterial}>\n        _originalMaterial?: IObject3D['material']\n    }\n}\n\nexport const khrMaterialVariantsGLTFExtension = {\n    name: khrMaterialsVariantsGLTF,\n    import: (p) => new GLTFMaterialsVariantsExtensionImport(p),\n    export: gltfExporterMaterialsVariantsExtensionExport,\n    // textures: undefined,\n} satisfies AssetManager['gltfExtensions'][number]\n","import {AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {uiFolderContainer} from 'uiconfig.js'\n\n/**\n * TailwindCSSCDNPlugin\n *\n * A plugin that dynamically loads Tailwind CSS from a CDN to enable rapid UI development with utility classes.\n * This allows you to use Tailwind CSS classes in your HTML elements without needing a build step.\n *\n * The plugin automatically injects the Tailwind CSS script tag when added to the viewer and removes it when the plugin is removed.\n *\n * @category Plugins\n * @example\n * ```typescript\n * import {ThreeViewer, TailwindCSSCDNPlugin} from 'threepipe'\n *\n * const viewer = new ThreeViewer({canvas: document.getElementById('canvas')})\n * const tailwindPlugin = viewer.addPluginSync(new TailwindCSSCDNPlugin())\n *\n * // Now you can use Tailwind CSS classes in your HTML elements\n * const button = document.createElement('button')\n * button.className = 'absolute top-4 right-4 bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded'\n * button.textContent = 'Click me'\n * viewer.container.appendChild(button)\n * ```\n */\n@uiFolderContainer('Tailwind CSS')\nexport class TailwindCSSCDNPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'TailwindCDNPlugin'\n    enabled = true\n    private _tailwindScript: HTMLScriptElement | null = null\n\n    /**\n     * The CDN URL for Tailwind CSS\n     * @default 'https://cdn.tailwindcss.com'\n     */\n    static CDN_URL = 'https://cdn.tailwindcss.com'\n    toJSON: any = null // do not save plugin state\n\n    async onAdded(viewer: ThreeViewer): Promise<void> {\n        super.onAdded(viewer)\n\n        // Add Tailwind CSS CDN script to head\n        this._tailwindScript = document.createElement('script')\n        this._tailwindScript.src = TailwindCSSCDNPlugin.CDN_URL\n        this._tailwindScript.type = 'text/javascript'\n        document.head.appendChild(this._tailwindScript)\n    }\n\n    onRemove(viewer: ThreeViewer): void {\n        // Remove Tailwind CSS script from head\n        if (this._tailwindScript && this._tailwindScript.parentNode) {\n            this._tailwindScript.parentNode.removeChild(this._tailwindScript)\n            this._tailwindScript = null\n        }\n        super.onRemove(viewer)\n    }\n}\n","import {UiObjectConfig} from 'uiconfig.js'\nimport {AViewerPlugin, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {Class} from 'ts-browser-helpers'\n\n/**\n * A plugin that allows dynamic loading and unloading of other plugins at runtime, with support for hot module replacement (HMR) during development.\n * This plugin provides a simple UI to load and unload plugins by specifying their module paths.\n * It supports both direct path strings and module objects (imported or promises).\n * The loaded plugins are tracked and can be managed through the provided UI.\n *\n * For HMR with vite, see {@link sampleThreepipeViteHmrPlugin}\n * Note: This plugin is primarily intended for development and testing purposes.\n */\nexport class DynamicImportPlugin extends AViewerPluginSync {\n    public static readonly PluginType = 'DynamicImportPlugin'\n    enabled = true\n\n    constructor() {\n        super()\n        // for vite, see sampleThreepipeViteHmrPlugin\n        if ((import.meta as any).hot) {\n            (import.meta as any).hot.on('custom-tp-plugin-update', async(data: any) => {\n                const base = (import.meta as any).hot.ownerPath.split('/').slice(0, -1).join('/') + '/'\n                const path = this.plugins.has(data.id) ? data.id : data.url.replace(base, './')\n                // console.log(base, import.meta.hot, path)\n                if (this.plugins.has(path)) {\n                    await this.unloadPlugin(path)\n                    await this.loadPlugin(path)\n                    this.uiConfig.uiRefresh?.(true, 'postFrame')\n                }\n                // const path = data.path.split('')\n            })\n        }\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n    }\n\n    plugins = new Map<string, Class<AViewerPlugin>>\n\n    /**\n     * Loads and adds a plugin to the viewer.\n     * The plugin can be specified as a path string or as a module object (imported or promise).\n     * If a path string is provided, it should point to a module that exports a default class extending AViewerPlugin.\n     * If a module object is provided, it should either have a default export or a named export that is a class extending AViewerPlugin.\n     * The module can also have a __tpPluginPath property to identify its path.\n     *\n     * Usage examples:\n     * ```ts\n     * // Load plugin from a path\n     * await DynamicImportPlugin.loadPlugin('./path/to/MyPlugin.js');\n     *\n     * // Load plugin from an imported module\n     * import MyPluginModule from './path/to/MyPlugin.js';\n     * await DynamicImportPlugin.loadPlugin(MyPluginModule);\n     *\n     * // Load plugin with dynamic import\n     * await DynamicImportPlugin.loadPlugin(import('./path/to/MyPlugin.js'));\n     * ```\n     *\n     * @returns The instance of the loaded plugin.\n     * @param pathOrModule\n     */\n    async loadPlugin(pathOrModule: string | PluginModule | Promise<PluginModule>) {\n        const viewer = this._viewer\n        if (!viewer) throw new Error('Plugin not added to viewer.')\n        if (typeof pathOrModule === 'object' && typeof pathOrModule.then === 'function') {\n            pathOrModule = await pathOrModule\n        }\n        pathOrModule = pathOrModule as string | PluginModule\n        const path: string = typeof pathOrModule === 'string' ? pathOrModule : pathOrModule.__tpPluginPath || ''\n        if (path?.length && this.plugins.has(path)) throw new Error('Plugin already loaded: ' + path)\n        const mod = typeof pathOrModule === 'object' ? pathOrModule : typeof path === 'string' && path ? await import(\n            /* webpackIgnore: true */\n            /* @vite-ignore */\n            path + '?t=' + Date.now() // prevent caching during development\n        ) : null\n        if (!mod) throw new Error('Could not find/load module: ' + path)\n        const plugin = mod.default || Object.values(mod)[0] as Class<AViewerPlugin>\n        if (!plugin)\n            throw new Error('No plugin found in module: ' + path)\n        if (typeof plugin !== 'function')\n            throw new Error('Plugin is not a class or function in module: ' + pathOrModule)\n        if (!(plugin.prototype && plugin.prototype instanceof AViewerPlugin))\n            throw new Error('Plugin is not a subclass of AViewerPlugin in module: ' + pathOrModule)\n        const pluginType = plugin.PluginType\n        console.log(pluginType)\n        console.log(mod)\n        if (viewer.getPlugin(pluginType))\n            throw new Error('Plugin of type ' + pluginType + ' already added to viewer')\n        if (path?.length) this.plugins.set(path, plugin)\n        const p = await viewer.addPlugin(plugin)\n        return p\n    }\n\n    /**\n     * Unloads and removes a plugin from the viewer by its path.\n     * The path should match the one used when loading the plugin.\n     *\n     * @returns A promise that resolves when the plugin is removed.\n     * @param path\n     */\n    async unloadPlugin(path: string) {\n        const viewer = this._viewer\n        if (!viewer) throw new Error('Plugin not added to viewer.')\n        const pluginC = this.plugins.get(path)\n        if (!pluginC)\n            throw new Error('Plugin not loaded: ' + path)\n        const plugin = viewer.getPlugin(pluginC)\n        if (!plugin)\n            throw new Error('Plugin not found in viewer: ' + path)\n        await viewer.removePlugin(plugin)\n        this.plugins.delete(path)\n    }\n\n    private _path = './TestPlugin.ts'\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: 'Viewer Scripts',\n        expanded: true,\n        children: [\n            {\n                type: 'input',\n                label: 'Path',\n                property: [this, '_path'],\n            },\n            {\n                type: 'button',\n                label: 'Load Plugin',\n                value: async() => {\n                    await this.loadPlugin(this._path)\n                    this.uiConfig.uiRefresh?.(true, 'postFrame')\n                },\n            },\n            {\n                type: 'button',\n                label: 'Unload Plugin',\n                value: async() => {\n                    await this.unloadPlugin(this._path)\n                    this.uiConfig.uiRefresh?.(true, 'postFrame')\n                },\n            },\n            {\n                type: 'button',\n                label: 'Refresh UI',\n                value: async() => {\n                    this.uiConfig.uiRefresh?.(true, 'postFrame')\n                },\n            },\n            {\n                type: 'folder',\n                label: 'Loaded Plugins',\n                expanded: true,\n                children: [\n                    () => {\n                        return [...this.plugins.values()].map(v => {\n                            const p = this._viewer?.getPlugin(v)\n                            return p?.uiConfig\n                        })\n                    },\n                ],\n            },\n        ],\n    }\n}\n\nexport interface PluginModule{\n    __tpPluginPath: string\n    default?: Class<AViewerPlugin>\n    [key: string]: Class<AViewerPlugin> | any\n}\n\n// import type {HotUpdateOptions, ModuleNode} from 'vite'\nexport const sampleThreepipeViteHmrPlugin = {\n    handleHotUpdate({server, modules, timestamp}: /* HotUpdateOptions */ any) {\n        // Invalidate modules manually\n        const invalidatedModules = new Set< /* ModuleNode */ any>()\n        const res = []\n        for (const mod of modules) {\n            console.log(mod.id, mod.url)\n            if (!mod.url.endsWith('.plugin.ts')) res.push(mod)\n            else {\n                server.moduleGraph.invalidateModule(\n                    mod as any,\n                    invalidatedModules,\n                    timestamp,\n                    true,\n                )\n                server.ws.send({\n                    type: 'custom',\n                    event: 'custom-tp-plugin-update',\n                    data: {\n                        url: mod.url,\n                        id: mod.id,\n                    },\n                })\n            }\n        }\n        return res\n    },\n    transform(code: string, id: string) {\n        if (id.endsWith('.plugin.ts')) {\n            const pathExport = `\\nexport const __tpPluginPath = \"${id}\";\\n`\n            return code + pathExport\n        }\n    },\n}\n","import {IObject3D, IObject3DEventMap} from '../../../core'\nimport {Euler, Matrix4, Quaternion, Vector3} from 'three'\n\nexport interface ConstraintPropsTypes {\n    // https://docs.blender.org/manual/en/latest/animation/constraints/transform/index.html\n    copy_position: {\n        axis?: ('x' | 'y' | 'z')[],\n        invert?: ('x' | 'y' | 'z')[],\n        // offset: boolean,\n        // targetSpace?: 'world' | 'local',\n        // ownerSpace?: 'world' | 'local',\n    },\n\n    copy_rotation: {\n        axis?: ('x' | 'y' | 'z')[],\n        invert?: ('x' | 'y' | 'z')[],\n        order?: 'XYZ' | 'XZY' | 'YXZ' | 'YZX' | 'ZXY' | 'ZYX',\n        // targetSpace?: 'world' | 'local',\n        // ownerSpace?: 'world' | 'local',\n    }\n\n    copy_scale: {\n        axis?: ('x' | 'y' | 'z')[],\n        uniform?: boolean,\n    }\n\n    copy_transforms: {\n        // No additional props, only influence which is now in ObjectConstraint\n    }\n\n    follow_path: {\n        offset?: number, // 0-1 value representing position along the path\n        followCurve?: boolean, // Whether to orient the object along the path direction\n    }\n\n    look_at: {\n        // trackAxis?: 'x' | '-x' | 'y' | '-y' | 'z' | '-z', // Which axis points toward the target\n        upAxis?: 'x' | '-x' | 'y' | '-y' | 'z' | '-z', // Which axis represents \"up\"\n        // targetSpace?: 'world' | 'local',\n        // ownerSpace?: 'world' | 'local',\n    }\n\n}\nexport type TConstraintPropsType = keyof ConstraintPropsTypes\n\nexport type ConstraintPropsType<T extends TConstraintPropsType = TConstraintPropsType> = ConstraintPropsTypes[T] & {\n    [key: string]: any // Allow additional properties\n}\n\nexport const basicObjectConstraints: Record<TConstraintPropsType, {\n    defaultProps: ConstraintPropsType,\n    update: (obj: IObject3D, target: IObject3D | undefined, props: ConstraintPropsType, influence: number) => {\n        changed: boolean,\n        end?: boolean,\n        change?: string\n    },\n    setDirty?: (e: IObject3DEventMap['objectUpdate'], isTarget?: boolean) => boolean\n}> = {\n    copy_position: {\n        defaultProps: {\n            axis: ['x', 'y', 'z'],\n            invert: [],\n            // offset: false,\n            // targetSpace: 'world',\n            // ownerSpace: 'world',\n        },\n        update: (obj: IObject3D, target: IObject3D | undefined, props: ConstraintPropsTypes['copy_position'], influence: number) => {\n            if (!target) return {changed: false}\n            const {\n                axis = ['x', 'y', 'z'],\n                invert = [],\n                // offset = false,\n                // targetSpace = 'world',\n                // ownerSpace = 'world',\n            } = props\n            const pos = target.getWorldPosition(new Vector3())\n            let changed = false\n            let isEnd = true\n            axis.forEach((a) => {\n                if (invert.includes(a)) {\n                    pos[a] *= -1\n                }\n                const last = obj.position[a]\n                obj.position[a] = pos[a] * influence + last * (1 - influence)\n                changed = changed || Math.abs(obj.position[a] - last) > 0.00001\n                isEnd = isEnd && Math.abs(obj.position[a] - last) < 0.00001\n            })\n\n            return {changed, end: isEnd, change: 'position'}\n        },\n\n        setDirty(e: IObject3DEventMap['objectUpdate'], _isTarget?: boolean) {\n            const key = e.change || e.key\n            return !key || key === 'position' || key === 'transform'\n        },\n    },\n    copy_rotation: {\n        defaultProps: {\n            axis: ['x', 'y', 'z'],\n            invert: [],\n            order: undefined, // Use existing order if not specified\n            // targetSpace: 'world',\n            // ownerSpace: 'world',\n        },\n        update: (obj: IObject3D, target: IObject3D | undefined, props: ConstraintPropsTypes['copy_rotation'], influence: number) => {\n            if (!target) return {changed: false}\n            const {\n                axis = ['x', 'y', 'z'],\n                invert = [],\n                // targetSpace = 'world',\n                // ownerSpace = 'world',\n            } = props\n\n            let order = props.order\n\n            // Store original rotation for blending\n            const originalEuler = new Euler().copy(obj.rotation)\n            if (!order) order = originalEuler.order // Use existing order if not specified\n            originalEuler.order = order\n\n            // Get target's world rotation as euler angles\n            const targetQuaternion = new Quaternion()\n            target.getWorldQuaternion(targetQuaternion)\n            const targetEuler = new Euler().setFromQuaternion(targetQuaternion, order)\n\n            let changed = false\n            let isEnd = true\n\n            // Apply rotation on specified axes with inversion and influence\n            axis.forEach((a) => {\n                let targetRotation = targetEuler[a]\n                if (invert.includes(a)) {\n                    targetRotation *= -1\n                }\n\n                const last = obj.rotation[a]\n                const newRotation = targetRotation * influence + last * (1 - influence)\n                originalEuler[a] = newRotation\n                changed = changed || Math.abs(newRotation - last) > 0.00001\n                isEnd = isEnd && Math.abs(newRotation - last) < 0.00001\n            })\n\n            obj.rotation.copy(originalEuler)\n\n            return {changed, end: isEnd, change: 'rotation'}\n        },\n\n        setDirty(e: IObject3DEventMap['objectUpdate'], _isTarget?: boolean) {\n            const key = e.change || e.key\n            return !key || key === 'rotation' || key === 'quaternion' || key === 'transform'\n        },\n\n    },\n    copy_scale: {\n        defaultProps: {\n            axis: ['x', 'y', 'z'],\n        },\n        update: (obj: IObject3D, target: IObject3D | undefined, props: ConstraintPropsTypes['copy_scale'], influence: number) => {\n            if (!target) return {changed: false}\n            const {\n                axis = ['x', 'y', 'z'],\n                uniform = false,\n            } = props\n\n            // Get target's world scale\n            const targetScale = new Vector3()\n            target.getWorldScale(targetScale)\n\n            const last = obj.scale.clone()\n\n            let uniformSum = 0\n            // Apply scale on specified axes with influence\n            axis.forEach((a) => {\n                const newScale = targetScale[a] * influence + last[a] * (1 - influence)\n                obj.scale[a] = newScale\n                uniformSum = uniformSum + newScale\n            })\n\n            if (uniform) {\n                const uniformScale = uniformSum / axis.length\n                obj.scale.set(uniformScale, uniformScale, uniformScale)\n            }\n\n            const changed = !last.equals(obj.scale)\n            const isEnd = last.distanceTo(obj.scale) < 0.00001\n\n            return {changed, end: isEnd, change: 'scale'}\n        },\n\n        setDirty(e: IObject3DEventMap['objectUpdate'], _isTarget?: boolean) {\n            const key = e.change || e.key\n            return !key || key === 'scale' || key === 'transform'\n        },\n    },\n    copy_transforms: {\n        defaultProps: {\n            // No additional props, only influence which is now in ObjectConstraint\n        },\n        update: (obj: IObject3D, target: IObject3D | undefined, _props: ConstraintPropsTypes['copy_transforms'], influence: number) => {\n            if (!target) return {changed: false}\n\n            // Get target's world matrix\n            const targetMatrix = new Matrix4()\n            target.updateMatrixWorld()\n            targetMatrix.copy(target.matrixWorld)\n\n            // Store original transform for blending\n            const originalPos = new Vector3().copy(obj.position)\n            const originalQuat = new Quaternion().copy(obj.quaternion)\n            const originalScale = new Vector3().copy(obj.scale)\n\n            // Decompose target matrix\n            const targetPos = new Vector3()\n            const targetQuat = new Quaternion()\n            const targetScale = new Vector3()\n            targetMatrix.decompose(targetPos, targetQuat, targetScale)\n\n            // Blend transforms with influence\n            obj.position.lerpVectors(originalPos, targetPos, influence)\n            obj.quaternion.slerpQuaternions(originalQuat, targetQuat, influence)\n            obj.scale.lerpVectors(originalScale, targetScale, influence)\n\n            // Check if anything changed\n            const changed = !originalPos.equals(obj.position) ||\n                !originalQuat.equals(obj.quaternion) ||\n                !originalScale.equals(obj.scale)\n            const isEnd = originalPos.distanceTo(obj.position) < 0.00001 &&\n                originalQuat.angleTo(obj.quaternion) < 0.00001 &&\n                originalScale.distanceTo(obj.scale) < 0.00001\n\n            return {changed, end: isEnd, change: 'transform'}\n        },\n\n        setDirty(e: IObject3DEventMap['objectUpdate'], _isTarget?: boolean) {\n            const key = e.change || e.key\n            return !key || key === 'position' || key === 'rotation' || key === 'quaternion' || key === 'scale' || key === 'transform'\n        },\n    },\n    follow_path: {\n        defaultProps: {\n            offset: 0, // 0-1 value representing position along the path\n            followCurve: false, // Whether to orient the object along the path direction\n        },\n        // target here has to be a Line or Line2 etc\n        update: (obj: IObject3D, target: IObject3D | undefined, props: ConstraintPropsTypes['follow_path'], influence: number) => {\n            if (!target) return {changed: false}\n            const {\n                offset = 0,\n                followCurve = false,\n            } = props\n\n            // Check if target has geometry\n            if (!target.geometry) {\n                return {changed: false}\n            }\n\n            // todo use geometry.userData.generationParams.curve if available as it would be smooth\n\n            // Support both regular Line objects and Line2/LineSegments2\n            const geometry = target.geometry as any\n            const positions = geometry.getPositions ? geometry.getPositions() : geometry.attributes?.position?.array\n\n            const res = getPos(positions, offset)\n            if (!res) return {changed: false}\n\n            const {targetPos, direction} = res\n\n            const worldTarget = target.localToWorld(targetPos.clone())\n            const worldDirection = direction?.lengthSq() > 0 ? target.localToWorld(direction.clone().add(targetPos)).sub(worldTarget).normalize() : null\n\n            const originalPos = new Vector3().copy(obj.position)\n            const originalRotation = new Quaternion().copy(obj.quaternion)\n\n            // todo set world position\n            obj.position.copy(worldTarget)\n\n            let rotationChanged = false\n\n            // Handle curve following (orientation)\n            if (followCurve) {\n                // Calculate direction along the curve\n                if (worldDirection) {\n\n                    const lookAtPos = worldTarget.clone().add(worldDirection)\n\n                    obj.lookAt(lookAtPos)\n\n                    if (influence !== 1) {\n                        const targetRotation = obj.quaternion.clone()\n                        // obj.quaternion.copy(tempQuaternion)\n                        obj.quaternion.slerpQuaternions(originalRotation, targetRotation, influence)\n                    }\n\n                    rotationChanged = !originalRotation.equals(obj.quaternion)\n                }\n\n            }\n\n            // after followCurve because of lookAt\n            if (influence !== 1)\n                obj.position.lerpVectors(originalPos, worldTarget, influence)\n\n            const positionChanged = !originalPos.equals(obj.position)\n            const changed = positionChanged || rotationChanged\n            const isEnd = originalPos.distanceTo(obj.position) < 0.00001 &&\n                (!rotationChanged || originalRotation.angleTo(obj.quaternion) < 0.00001)\n\n            return {\n                changed,\n                end: isEnd,\n                change: rotationChanged ? 'transform' : 'position',\n            }\n        },\n\n        setDirty(e: IObject3DEventMap['objectUpdate'], _isTarget?: boolean) {\n            const key = e.change || e.key\n            return !key || key === 'position' || key === 'transform' || key === 'geometry'\n        },\n    },\n    // what?\n    look_at: {\n        defaultProps: {\n            // trackAxis: 'z', // Which axis points toward the target\n            upAxis: 'y', // Which axis represents \"up\"\n            // targetSpace: 'world',\n            // ownerSpace: 'world',\n        },\n        update: (obj: IObject3D, target: IObject3D | undefined, props: ConstraintPropsTypes['look_at'], influence: number) => {\n            if (!target) return {changed: false}\n            const {\n                // trackAxis = 'z',\n                upAxis = 'y',\n                // targetSpace = 'world',\n                // ownerSpace = 'world',\n            } = props\n\n            // Get target's world position\n            const targetPos = target.getWorldPosition(new Vector3())\n\n            // Calculate direction to target\n            const dir = targetPos.clone().sub(obj.position).normalize()\n\n            // Calculate up direction\n            const up = new Vector3(0, 1, 0) // Default up is world up\n            if (upAxis === 'x') up.set(1, 0, 0)\n            else if (upAxis === '-x') up.set(-1, 0, 0)\n            else if (upAxis === 'y') up.set(0, 1, 0)\n            else if (upAxis === '-y') up.set(0, -1, 0)\n            else if (upAxis === 'z') up.set(0, 0, 1)\n            else if (upAxis === '-z') up.set(0, 0, -1)\n\n            // Calculate right direction\n            const right = new Vector3().crossVectors(up, dir).normalize()\n\n            // Recalculate up direction as it may have changed\n            up.crossVectors(dir, right).normalize()\n\n            // Create a rotation matrix\n            const m = new Matrix4()\n            m.makeBasis(right, up, dir)\n\n            // Extract the rotation from the matrix\n            const q = new Quaternion().setFromRotationMatrix(m)\n\n            // Apply the rotation to the object\n            obj.quaternion.slerp(q, influence)\n\n            const changed = !obj.quaternion.equals(q)\n            const isEnd = obj.quaternion.angleTo(q) < 0.00001\n\n            return {changed, end: isEnd, change: 'rotation'}\n        },\n\n        setDirty(e: IObject3DEventMap['objectUpdate'], _isTarget?: boolean) {\n            const key = e.change || e.key\n            return !key || key === 'position' || key === 'rotation' || key === 'quaternion' || key === 'scale' || key === 'transform'\n        },\n    },\n}\n\nfunction getPos(positions: number[], offset: number) {\n\n    if (!positions) {\n        return null\n    }\n\n    const vertexCount = positions.length / 3\n\n    if (vertexCount < 2) return null\n\n    // Calculate total path length and segment lengths\n    const segmentLengths: number[] = []\n    let totalLength = 0\n\n    for (let i = 0; i < vertexCount - 1; i++) {\n        const x1 = positions[i * 3]\n        const y1 = positions[i * 3 + 1]\n        const z1 = positions[i * 3 + 2]\n        const x2 = positions[(i + 1) * 3]\n        const y2 = positions[(i + 1) * 3 + 1]\n        const z2 = positions[(i + 1) * 3 + 2]\n\n        const segmentLength = Math.sqrt(\n            (x2 - x1) ** 2 + (y2 - y1) ** 2 + (z2 - z1) ** 2\n        )\n        segmentLengths.push(segmentLength)\n        totalLength += segmentLength\n    }\n\n    if (totalLength === 0) return null\n\n    // Clamp offset to 0-1 range\n    const clampedOffset = Math.max(0, Math.min(1, offset))\n    const targetDistance = clampedOffset * totalLength\n\n    // Find which segment contains the target distance\n    let currentDistance = 0\n    let segmentIndex = 0\n    let segmentT = 0\n\n    for (let i = 0; i < segmentLengths.length; i++) {\n        if (currentDistance + segmentLengths[i] >= targetDistance) {\n            segmentIndex = i\n            segmentT = (targetDistance - currentDistance) / segmentLengths[i]\n            break\n        }\n        currentDistance += segmentLengths[i]\n    }\n\n    // Interpolate position along the segment\n    const i1 = segmentIndex * 3\n    const i2 = (segmentIndex + 1) * 3\n\n    const x1 = positions[i1]\n    const y1 = positions[i1 + 1]\n    const z1 = positions[i1 + 2]\n    const x2 = positions[i2]\n    const y2 = positions[i2 + 1]\n    const z2 = positions[i2 + 2]\n\n    // Linear interpolation\n    const targetPos = new Vector3(\n        x1 + (x2 - x1) * segmentT,\n        y1 + (y2 - y1) * segmentT,\n        z1 + (z2 - z1) * segmentT\n    )\n    const direction = new Vector3(x2 - x1, y2 - y1, z2 - z1)\n    direction.normalize()\n    return {targetPos, direction}\n}\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {IMaterial, IObject3D, IObject3DEventMap} from '../../core'\nimport {basicObjectConstraints, ConstraintPropsType, TConstraintPropsType} from './helpers/BasicObjectConstraints'\nimport {getOrCall, onChange, serializable, serialize} from 'ts-browser-helpers'\nimport {generateUiConfig, uiDropdown, uiFolderContainer, uiInput, UiObjectConfig, uiSlider, uiToggle} from 'uiconfig.js'\nimport {generateUUID} from '../../three'\nimport type {AnimationObjectPlugin} from '../animation/AnimationObjectPlugin'\n\nexport type ObjectConstraintsPluginEventMap = AViewerPluginEventMap\n\n/**\n * Object Constraints Plugin\n *\n * Create sophisticated object relationships and behaviors using simple constraint-based animation system inspired by Blender's constraints.\n *\n * The ObjectConstraintsPlugin provides a powerful constraint system that allows objects to automatically follow, copy, or respond to other objects' transformations and properties. This enables complex animations and interactive behaviors without manual keyframe animation.\n */\n@uiFolderContainer('Object Constraints')\nexport class ObjectConstraintsPlugin extends AViewerPluginSync<ObjectConstraintsPluginEventMap> {\n    public static readonly PluginType = 'ObjectConstraintsPlugin'\n\n    @uiToggle()\n    @serialize()\n        enabled = true\n\n    dependencies = []\n\n    constructor(enabled = true) {\n        super()\n        this.enabled = enabled\n    }\n\n    addConstraint<T extends TConstraintPropsType = TConstraintPropsType>(obj: IObject3D, constraintOrType?: ObjectConstraint<T> | T, target?: string | IObject3D) {\n        const constraint = typeof constraintOrType === 'string' ?\n            new ObjectConstraint<T>(constraintOrType) :\n            constraintOrType || new ObjectConstraint<T>()\n        if (!obj.userData.constraints) {\n            obj.userData.constraints = []\n        }\n        if (target) {\n            if (typeof target === 'string') constraint.target = target\n            else constraint.target = target.uuid\n        }\n        if (!obj.userData.constraints.includes(constraint)) {\n            obj.userData.constraints.push(constraint)\n            this._registerConstraint(constraint, obj)\n            obj.setDirty && obj.setDirty({change: 'userData.constraints', source: 'ObjectConstraintsPlugin.addConstraint'})\n        }\n\n        return constraint\n    }\n\n    removeConstraint(obj: IObject3D, constraint: ObjectConstraint) {\n        if (!obj.userData.constraints) return\n        const index = obj.userData.constraints.indexOf(constraint)\n        if (index !== -1) {\n            obj.userData.constraints.splice(index, 1)\n            this._unregisterConstraint(constraint, obj)\n            obj.setDirty && obj.setDirty({change: 'userData.constraints', source: 'ObjectConstraintsPlugin.addConstraint'})\n        }\n    }\n\n    private _objectAdd = (e: {object?: IObject3D})=>{\n        const obj = e.object\n        if (!obj) return\n        if (obj.isWidget) return\n        if (Array.isArray(obj.userData.constraints)) {\n            obj.userData.constraints.forEach(ao=> this._registerConstraint(ao, obj))\n        }\n        this._setupUiConfig(obj)\n        // refresh target refs for all registered constraints that have target == obj.uuid\n        this._constraints.keys().forEach(c=>{\n            if (c?.target === obj.uuid) this._refreshConstraint(c, obj)\n        })\n\n    }\n\n    private _objectRemove = (e: {object?: IObject3D})=>{\n        const obj = e.object\n        if (!obj) return\n        if (Array.isArray(obj.userData.constraints)) {\n            obj.userData.constraints.forEach(ao=> this._unregisterConstraint(ao, obj))\n        }\n        this._cleanUpUiConfig(obj)\n        // remove target obj references from constraints\n        this._constraintTargets.get(obj)?.forEach(c=>this._refreshConstraint(c, null))\n    }\n\n    private _constraints: Map<ObjectConstraint, {\n        obj: IObject3D,\n        target?: IObject3D\n    }> = new Map()\n\n    private _constraintTargets: Map<IObject3D, Set<ObjectConstraint>> = new Map()\n    private _constraintObjects: Map<IObject3D, Set<ObjectConstraint>> = new Map()\n\n    private _objectUpdate = (e: IObject3DEventMap['objectUpdate'])=>{\n        this._constraintTargets.get(e.object)?.forEach(constraint => {\n            constraint.setDirty(e, true)\n        })\n        this._constraintObjects.get(e.object)?.forEach(constraint => {\n            constraint.setDirty(e, false)\n        })\n    }\n\n    private _refreshConstraint(constraint: ObjectConstraint, targetObj?: IObject3D | null) {\n        const data = this._constraints.get(constraint)\n        if (!data) return\n        const target = targetObj !== undefined ? targetObj ?? undefined : this._viewer?.object3dManager.findObject(constraint.target)\n        const lastTarget = data.target\n        if (target !== lastTarget) {\n            this._removeTarget(lastTarget, constraint)\n            this._addTarget(target, constraint)\n        }\n        data.target = target\n    }\n\n    private _registerConstraint(constraint: ObjectConstraint, obj: IObject3D) {\n        if (this._constraints.has(constraint)) {\n            this._refreshConstraint(constraint)\n            return\n        }\n        this._constraints.set(constraint, {obj})\n        if (!this._constraintObjects.has(obj)) {\n            this._constraintObjects.set(obj, new Set())\n            // obj.addEventListener('objectUpdate', this._constraintObjectUpdate)\n        }\n        this._constraintObjects.get(obj)!.add(constraint)\n        this._refreshConstraint(constraint)\n        constraint.refresh = ()=>this._refreshConstraint(constraint)\n        constraint.remove = ()=>{\n            this.removeConstraint(obj, constraint)\n            return ()=>{\n                // undo function\n                this.addConstraint(obj, constraint)\n            }\n        }\n\n        const uiConfig = constraint.uiConfig\n        const constraintIndex = obj.userData.constraints?.indexOf(constraint) ?? -1\n        if (uiConfig && constraintIndex >= 0) {\n            const animObjectPlugin = this._viewer?.getPlugin<AnimationObjectPlugin>('AnimationObjectPlugin')\n            if (animObjectPlugin) {\n                const components = this._animatableComponents(constraint)\n                // todo support uuid based deep access, and serialize constraint uuid\n                // animObjectPlugin.setupUiConfigButtons(obj, components, 'userData.constraints.' + constraint.uuid + '.props.')\n\n                // direct index for now\n                if (components.length)\n                    components.forEach(c=>animObjectPlugin.setupUiConfigButton(obj, c, 'userData.constraints.' + constraintIndex.toString() + '.props.')) // todo check if component is in props, right now its fine as only offset is used\n            }\n        }\n    }\n    private _unregisterConstraint(constraint: ObjectConstraint, obj: IObject3D) {\n        if (!this._constraints.has(constraint)) return\n        const data = this._constraints.get(constraint)\n        if (data?.obj === obj) {\n            this._removeTarget(data.target, constraint)\n            const set = this._constraintObjects.get(obj)\n            if (set) {\n                set.delete(constraint)\n                if (set.size === 0) {\n                    this._constraintObjects.delete(obj)\n                    // obj.removeEventListener('objectUpdate', this._constraintObjectUpdate)\n                }\n            }\n            this._constraints.delete(constraint)\n            constraint.refresh = undefined\n            const uiConfig = constraint.uiConfig\n            if (uiConfig) {\n                const animObjectPlugin = this._viewer?.getPlugin<AnimationObjectPlugin>('AnimationObjectPlugin')\n                if (animObjectPlugin) {\n                    this._animatableComponents(constraint).forEach(c=>animObjectPlugin.cleanupUiConfigButton(c))\n                }\n            }\n\n            // todo cleanupUiConfigButtons\n            // todo remove any associated UI config\n        }\n    }\n\n\n    private _animatableComponents(constraint: ObjectConstraint) {\n        // only props.offset right now. todo add more\n        return constraint?.uiConfig?.children?.flatMap(c=>getOrCall(c))\n            .filter(c=>{\n                return typeof c === 'object' && c.type === 'number' && c.property[1] === 'offset' && c.property[0] === constraint.props\n            }) || []\n    }\n\n    private _addTarget(target: IObject3D | undefined, constraint: ObjectConstraint) {\n        if (!target) return\n        if (!this._constraintTargets.has(target)) {\n            // target.addEventListener('objectUpdate', this._constraintTargetUpdate)\n            this._constraintTargets.set(target, new Set())\n        }\n        const set = this._constraintTargets.get(target)\n        if (!set!.has(constraint)) {\n            set!.add(constraint)\n            constraint.setDirty()\n        }\n    }\n\n    private _removeTarget(lastTarget: IObject3D | undefined, constraint: ObjectConstraint) {\n        if (!lastTarget) return\n        const set = this._constraintTargets.get(lastTarget)\n        if (!set) return\n        if (set.has(constraint)) {\n            set.delete(constraint)\n            constraint.setDirty()\n        }\n        if (set.size === 0) {\n            this._constraintTargets.delete(lastTarget)\n            // lastTarget.removeEventListener('objectUpdate', this._constraintTargetUpdate)\n        }\n    }\n\n    private _setupUiConfig(obj: IObject3D | IMaterial) {\n        const type = (obj as IObject3D).isObject3D ? 'objects' : (obj as IMaterial).isMaterial ? 'materials' : undefined\n        if (!type) return\n        if (!obj.uiConfig) return\n        const existing = obj.uiConfig?.children?.find(c => typeof c === 'object' && c.tags?.includes(ObjectConstraintsPlugin.PluginType))\n        if (existing) return // todo regenerate?\n        obj.uiConfig?.children?.push({\n            type: 'folder',\n            label: 'Constraints',\n            tags: ['constraints', ObjectConstraintsPlugin.PluginType],\n            children: [\n                ()=>obj.userData.constraints?.map(c=>c.uiConfig),\n                {\n                    type: 'button',\n                    label: 'Add Constraint',\n                    icon: 'plus',\n                    tags: ['context-menu', 'header-action'],\n                    onClick: () => {\n                        const c = this.addConstraint(obj as any)\n                        return ()=> this.removeConstraint(obj as any, c) // undo function\n                    },\n                },\n            ],\n        })\n    }\n\n    private _cleanUpUiConfig(obj: IObject3D | IMaterial) {\n        if (!obj.uiConfig) return\n        const existing = obj.uiConfig?.children?.findIndex(c => typeof c === 'object' && c.tags?.includes(ObjectConstraintsPlugin.PluginType))\n        if (existing !== undefined && existing >= 0) {\n            obj.uiConfig.children?.splice(existing, 1)\n        }\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n\n        viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n        viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n        viewer.scene.addEventListener('objectUpdate', this._objectUpdate) // all events bubble to the scene\n\n        // this._setupUiConfig(viewer.scene)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n\n        viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n        viewer.scene.removeEventListener('objectUpdate', this._objectUpdate)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n\n        super.onRemove(viewer)\n        // this._cleanUpUiConfig(viewer.scene)\n    }\n\n    protected _viewerListeners = {\n        preFrame: ()=>{\n            if (this.isDisabled()) return\n            // todo use time, deltaTime to see if we should progress\n            // const delta = this._viewer?.timeline.delta || 0\n            // console.log(delta, this._viewer?.timeline.running)\n            if (this._viewer?.timeline.running && this._viewer.timeline.delta === 0) return\n\n            const updated = this._constraints.keys().filter(c=>c.needsUpdate)\n            let hasUpdate = false\n            updated.forEach(u=>{\n                const data = this._constraints.get(u)\n                if (!data) return\n                const res = u.update(data)\n                hasUpdate = hasUpdate || res\n            })\n            if (hasUpdate) {\n                // this.dispatchEvent({\n                //     type: '',\n                // })\n                // console.log('constraints updated')\n            }\n        },\n    }\n\n    static ConstraintTypes = basicObjectConstraints\n\n}\n\n\n@serializable('ObjectConstraint')\n// @uiFolderContainer('Constraint')\nexport class ObjectConstraint<T extends TConstraintPropsType = TConstraintPropsType> {\n    uuid = generateUUID()\n\n    @serialize()\n    @uiToggle()\n        enabled = true\n\n    @serialize()\n    @onChange('typeChanged')\n    @uiDropdown(undefined, Object.keys(basicObjectConstraints).map(label => ({label})))\n        type: T\n\n    @serialize()\n    @onChange('refresh2')\n    @uiInput()\n        target = ''\n\n    @serialize()\n    @uiSlider(undefined, [0, 1], 0.01)\n        influence = 1\n\n    @serialize()\n        props: ConstraintPropsType<T> = {}\n\n    constructor(type?: T) {\n        this.type = type ?? 'copy_position' as T\n        this.props = basicObjectConstraints[this.type]?.defaultProps || {}\n        if (!this.props) {\n            // console.warn(`No default props defined for constraint type: ${this.type}`)\n            this.props = {}\n        }\n    }\n\n    update(data: {obj: IObject3D, target?: IObject3D}) {\n        const tp = basicObjectConstraints[this.type as keyof typeof basicObjectConstraints]\n        const res = tp?.update(data.obj, data.target, this.props, this.influence)\n        if (res?.changed && res.change) {\n            data.obj.setDirty && data.obj.setDirty({change: res.change, source: this.uuid})\n        }\n        this.needsUpdate = !(res.end ?? true)\n        return res?.changed || false\n    }\n\n    needsUpdate = false\n    setDirty = (e?: IObject3DEventMap['objectUpdate'], isTarget?: boolean) => {\n        if (this.needsUpdate || e?.source === this.uuid) return\n        // console.warn(e?.key)\n        if (typeof e !== 'object') e = undefined\n        if (e) {\n            const tp = basicObjectConstraints[this.type as keyof typeof basicObjectConstraints]\n            if (e.key && /.props\\..+$/.test(e.key)) // if some prop is updated. this check is specifically for AnimationObject right now.\n                this._propsUi.forEach(p=>p?.uiRefresh?.())\n            else if (tp?.setDirty) {\n                if (!tp.setDirty(e, isTarget)) return false\n            }\n        }\n        this.needsUpdate = true\n        return true\n    }\n\n    /**\n     * Refreshes the constraint, re-evaluating its target and properties.\n     */\n    refresh?: () => void\n\n    /**\n     * Removes this constraint from the object it is attached to.\n     * @return A function that can be called to undo the removal of the constraint.\n     */\n    remove?: () => void\n\n    /**\n     * Refresh the constraint and mark it as dirty.\n     * @internal\n     */\n    refresh2 = () => {\n        this.refresh && this.refresh()\n        this.setDirty()\n    }\n\n    typeChanged() {\n        const oldProps = this.props\n        this.props = basicObjectConstraints[this.type]?.defaultProps || {}\n        // todo improve merge. like it wont work with vectors right now. For that we need to check if primitive type is the same and/or call the .copy() function\n        for (const key of Object.keys(this.props)) {\n            if (oldProps[key] !== undefined) {\n                const type1 = typeof this.props[key]\n                const type2 = typeof oldProps[key]\n                if (type1 === type2 && (typeof type1 !== 'object' || (type1 as any)?.type && (type1 as any).type === (type2 as any)?.type)) {\n                    this.props[key] = oldProps[key]\n                }\n            }\n        }\n        this._propsUi = []\n        this.setDirty()\n        this.uiConfig?.uiRefresh?.(true, 'postFrame', 1)\n    }\n\n    private _propsUi: any[] = []\n\n    uiConfig: UiObjectConfig = {\n        type: 'folder',\n        label: () => this.type || 'Constraint',\n        tags: ['constraint', ObjectConstraintsPlugin.PluginType],\n        onChange: this.setDirty,\n        children: [\n            ...generateUiConfig(this),\n            () => {\n                if (this._propsUi.length) {\n                    this._propsUi.forEach(p=>p.uiRefresh?.(true))\n                    return this._propsUi\n                }\n                const c = generateUiConfig(this.props)\n                    .map(c1 => getOrCall(c1))\n                this._propsUi = c\n                return c\n            },\n            {\n                type: 'button',\n                tags: ['context-menu'],\n                label: 'Remove Constraint',\n                icon: 'cross',\n                property: [this, 'remove'],\n            },\n        ],\n    }\n}\n\ndeclare module '../../assetmanager/IAssetImporter'{\n    export interface IImportResultUserData{\n        constraints?: ObjectConstraint[]\n    }\n}\n","import {IViewerPlugin, ThreeViewer} from '../../../viewer'\nimport type {EntityComponentPlugin} from '../EntityComponentPlugin'\nimport {Class} from 'ts-browser-helpers'\nimport {TypedType} from './typeSystem'\nimport {UiObjectConfig} from 'uiconfig.js'\n\nexport interface ComponentCtx {\n    viewer: ThreeViewer\n    ecp: EntityComponentPlugin\n    // object: IObject3D\n    // throws error if the plugin is not found instead of returning undefined\n    plugin: <T extends IViewerPlugin>(type: Class<T> | string) => T\n    // component: <T extends TObject3DComponent>(type: T | string) => InstanceType<T>\n}\n\n// export class CtxProxy {\n//     isCtxProxy = true\n//     // todo when env is set, loop through all properties and set env if they are EnvProxy too\n//     ctx?: ComponentCtx\n//     constructor(ctx?: ComponentCtx) {\n//         this.ctx = ctx\n//     }\n// }\n\nexport interface StatePropConfig<T = any> {\n    key: string\n    label?: string\n    type?: TypedType\n    default?: T\n    uiConfig?: Partial<UiObjectConfig>\n    // description?: string\n}\n\nexport interface ComponentDefn {ComponentType: string, StateProperties?: (string|StatePropConfig)[]}\n\nexport interface ComponentJSON{\n    type: string\n    state: Record<string, any>\n}\n\n/**\n * Sample usage -\n * ```typescript\n * export const physicsBodyType = ['static', 'dynamic', 'kinematic'] as const\n * export type PhysicsBodyType = typeof physicsBodyType[number]\n * export class PhysicsComponent extends Object3DComponent {\n *     static ComponentType = 'PhysicsComponent'\n *     static StateProperties: ComponentDefn['StateProperties'] = ['mass', {\n *         key: 'type',\n *         type: literalStrings(physicsBodyType),\n *     }]\n *     // ...\n * }\n * ```\n * @param type\n */\nexport function literalStrings<T extends string|number|boolean = string|number|boolean>(type: T[] | readonly T[]) {\n    return {oneOf: type.map(t=>typeof t === 'number' || typeof t === 'boolean' ? `${t}` : `\"${t}\"`) as (`\"${T}\"`)[], type: 'Union'} as const\n}\n","import {Class, Serialization} from 'ts-browser-helpers'\n\nconst jsPropTypes = {\n    string: (typeof '') as 'string',\n    number: (typeof 0) as 'number',\n    boolean: (typeof true) as 'boolean',\n    // undefined: (typeof undefined) as 'undefined',\n    object: (typeof {}) as 'object',\n    // function: (typeof (()=>{return})) as 'function',\n    // symbol: (typeof Symbol()) as 'symbol',\n    // bigint: (typeof 1n) as 'bigint',\n} as const\n\n// StatePropTypes = \"string\" | \"number\" | \"boolean\" | \"object\" | `\"${string}\"` | `${number}` | \"true\" | \"false\"\nexport type JSPropTypes = (typeof jsPropTypes[keyof typeof jsPropTypes])\n    | `\"${string}\"` // string literal type\n    | `${number}` // number literal type\n    | `${boolean}` // boolean literal type\n\ntype KeyofPropType = string/* | number | boolean*/\ntype ClassName = string\ninterface PropTypeArray {arrayOf: TypedType, type: 'Array'}\ninterface PropTypeObject {recordOf: Map<KeyofPropType, TypedType>, type: 'Object'}\ninterface PropTypeUnion {oneOf: Set<TypedType>, type: 'Union'}\nexport type TypedType = JSPropTypes | ClassName\n    | 'null'\n    | 'Object'\n    | PropTypeUnion\n    | PropTypeArray\n    | PropTypeObject\n    | {type: ClassName}\n\nexport interface TypedClass<T = any>{\n    key: ClassName\n    getId: (obj: any)=>string\n    ctor: Class<T>\n    getLabel?: (obj?: T)=>string|any\n    getIcon?: (obj?: T)=>string|any\n    setName?: (obj: T, name: string)=>void\n}\n\nexport class TypeSystem {\n    static Classes = new Map</* PropType*/ ClassName, TypedClass>()\n\n    static AddClass(def: TypedClass) {\n        const sid = def.ctor.prototype.serializableClassId\n        if (!sid) {\n            console.error('Non Serializable class cannot be added to TypeSystem', def)\n            return\n        }\n        if (sid !== def.key) {\n            console.warn(`TypeSystem: class serializableClassId \"${sid}\" does not match registered className \"${def.key}\"`)\n        }\n        this.Classes.set(def.key, def)\n    }\n\n    static GetClass(type: TypedType) {\n        const typeStr = typeof type === 'string' ? type : type.type\n        return this.Classes.get(typeStr)\n    }\n\n    static GetClassType(ctor: Class<any>): ClassName|undefined {\n        for (const [type, def] of this.Classes) {\n            if (def.ctor === ctor) return type\n        }\n        return undefined\n    }\n\n    // todo cache res in weakmap?\n    static GetType(v: any, allowSerializable = true): TypedType | false {\n        if (v === undefined) return false // not serializable\n        if (v === null) return 'null'\n        if (typeof v === 'function') return false\n        if (typeof v === 'number') return `${v}`\n        if (typeof v === 'string') return `${JSON.stringify(v)}`\n        if (typeof v === 'boolean') return `${v}`\n        if (Array.isArray(v)) {\n            const types = new Set<TypedType>()\n            for (const item of v) {\n                const typ = this.GetType(item)\n                if (!typ) return false\n                types.add(typ)\n            }\n            const typ: TypedType = types.size === 1 ? types.values().next().value : {oneOf: types, type: 'Union'}\n            return {arrayOf: typ, type: 'Array'}\n        }\n        if (typeof v === 'object') {\n            const cons = v.constructor\n            if (cons) {\n                if (cons !== Object) {\n                    // if ((v as CtxProxy).isCtxProxy) {\n                    //     (v as CtxProxy).ctx = ctx\n                    //     // return true // any subclass has to be in SerializableClasses\n                    // }\n                    const typeName = this.GetClassType(cons)\n                    if (typeName) return typeName\n\n                    if (allowSerializable) {\n                        if (v.type && Serialization.SerializableClasses.has(v.type)) return v.type\n                        if (v.serializableClassId && Serialization.SerializableClasses.has(v.serializableClassId)) return v.serializableClassId\n                        const custom = Serialization.GetSerializer(v)\n                        // @ts-expect-error type in next version\n                        if (custom && typeof custom.type === 'string' && !custom.type.startsWith('_')) return custom.type\n                        return false\n                    }\n                }\n            }\n            const map = new Map<KeyofPropType, TypedType>()\n            for (const k in v) {\n                const val = v[k]\n                if (typeof val === 'function') continue\n                const typ = this.GetType(val)\n                if (!typ) return false\n                map.set(k, typ)\n            }\n            return {recordOf: map, type: 'Object'}\n        }\n        return false\n    }\n\n    static NonLiteral(type: TypedType): TypedType {\n        if (typeof type !== 'string') return type\n        if (/^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(type)) return 'string'\n        if (/^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(type)) return 'number'\n        if (type === 'true' || type === 'false') return 'boolean'\n        if (type === 'Infinity' || type === '-Infinity' || type === 'NaN') return 'number'\n        return type\n    }\n\n    static TypeToString(type: TypedType): string {\n        if (typeof type === 'string') return type\n        if ('oneOf' in type) {\n            return `(${Array.from(type.oneOf).map(t=>this.TypeToString(t)).join('|')})`\n        }\n        if ('arrayOf' in type) {\n            return `Array<${this.TypeToString(type.arrayOf)}>`\n        }\n        if ('recordOf' in type) {\n            const entries = Array.from(type.recordOf.entries()).map(([k, v])=>`${k}: ${this.TypeToString(v)}`)\n            return `{ ${entries.join('; ')} }`\n        }\n        return type.type\n    }\n    /**\n     * Returns true if `tar = src` is valid\n     * @param src\n     * @param tar\n     * @constructor\n     */\n    static CanAssign(src: TypedType, tar: TypedType): boolean {\n        if (src === tar) return true\n        const srcClass = this.GetClass(src)\n        const tarClass = this.GetClass(tar)\n        if (srcClass && srcClass === tarClass) return true\n        if (typeof tar === 'string') {\n            if (typeof src === 'string') {\n                const nonLiteralSrc = this.NonLiteral(src)\n                if (nonLiteralSrc === tar) return true\n                // console.log('mismatch', tar, src, nonLiteralSrc)\n                return false\n            }\n            if ('oneOf' in src) {\n                const union = src.oneOf\n                for (const u of union) {\n                    if (!this.CanAssign(u, tar)) return false\n                }\n                return true\n            }\n            if ('arrayOf' in src) {\n                // return tar === 'Array'\n                return false\n            }\n            if ('recordOf' in src) {\n                // return tar === 'Object'\n                return false\n            }\n            return false\n        }\n        if ('oneOf' in tar) {\n            const union = tar.oneOf\n            for (const u of union) {\n                if (this.CanAssign(src, u)) return true\n            }\n            return false\n        }\n        if ('arrayOf' in tar) {\n            if (typeof src !== 'string' && 'arrayOf' in src) {\n                return this.CanAssign(src.arrayOf, tar.arrayOf)\n            }\n            return false\n        }\n        if ('recordOf' in tar) {\n            if (typeof src !== 'string' && 'recordOf' in src) {\n                for (const [k, v] of tar.recordOf) {\n                    const srcV = src.recordOf.get(k)\n                    if (!srcV || !this.CanAssign(srcV, v)) return false\n                }\n                return true\n            }\n            return false\n        }\n        return false\n    }\n}\n","import {SerializationMetaType, ThreeSerialization} from '../../../utils'\n\n// not exported\nclass ItemRef {\n    readonly isItemRef = true\n    id: string\n    constructor(id?: string) {\n        this.id = id || ''\n    }\n    toJSON(meta?: SerializationMetaType) {\n        if (!this.id) return {}\n        if (meta) {\n            if (!meta.typed) meta.typed = {}\n            if (!meta.typed[this.id]) {\n                const item = ReferenceManager.Get(this)\n                if (item) {\n                    if (item.__rootPath) {\n                        meta.typed[this.id] = {\n                            external: true,\n                            rootPath: item.__rootPath,\n                            rootPathOptions: item.__rootPathOptions,\n                        }\n                    } else {\n                        meta.typed[this.id] = ThreeSerialization.Serialize(item, meta)\n                    }\n                }\n            }\n        }\n        return {id: this.id}\n    }\n\n    ['_itemObject']: any\n\n    fromJSON(data: any, meta?: SerializationMetaType) {\n        if (data && typeof data.id === 'string') {\n            this.id = data.id\n            if (meta?.typed) {\n                const itemData = meta.typed[this.id]\n                const isLoaded = meta.__isLoadedResources\n                const itemObject = isLoaded && itemData ? itemData : ThreeSerialization.Deserialize(itemData, meta)\n                if (itemObject?.external && itemObject.rootPath) {\n                    console.warn('ReferenceManager - External resources is expected to be loaded already in ImportMeta phase:', itemObject)\n                } else {\n                    this._itemObject = itemObject\n                    if (isLoaded) meta.typed[this.id] = itemObject // cache the deserialized object, isLoaded is also true when resources are being loaded in ImportMeta\n                }\n            }\n        }\n        return this\n    }\n}\n\ninterface Item{\n    id: string;\n    refs: Map<any, Set<ItemRef>>;\n    object: any\n}\n\nexport class ReferenceManager {\n    static {\n        ThreeSerialization.MakeSerializable(ItemRef as any, 'ItemRef')\n    }\n\n    static Objects: Map<string, Item> = new Map()\n\n    static Get(ref: ItemRef) {\n        const item = this.Objects.get(ref.id)\n        return item ? item.object : null\n    }\n\n    static Add(id: string, object: any, refOwner: any) {\n        let item = this.Objects.get(id)\n        if (!item) {\n            item = {\n                id,\n                refs: new Map<any, Set<ItemRef>>(),\n                object,\n            }\n            this.Objects.set(id, item)\n        }\n        // const count = item.refs.get(refOwner) || 0\n        // item.refs.set(refOwner, count + 1)\n        let refSet = item.refs.get(refOwner)\n        if (!refSet) {\n            refSet = new Set<ItemRef>()\n            item.refs.set(refOwner, refSet)\n        }\n        const ref = new ItemRef(id)\n        refSet.add(ref)\n        return ref\n    }\n\n    static Remove(id: string, refOwner: any, ref: ItemRef) {\n        const item = this.Objects.get(id)\n        if (item) {\n            const refs = item.refs.get(refOwner)\n            if (refs && refs.has(ref)) {\n                refs.delete(ref)\n                if (refs.size === 0) {\n                    item.refs.delete(refOwner)\n                    if (item.refs.size === 0) {\n                        this.Objects.delete(id)\n                    }\n                }\n            }\n        }\n    }\n\n    static Delete(object: any) {\n        if (object) {\n            for (const [id, item] of [...this.Objects]) {\n                // object references\n                item.refs.delete(object)\n                if (item.refs.size === 0) {\n                    this.Objects.delete(id)\n                }\n                // refs to object\n                if (item.object === object) {\n                    this.Objects.delete(id)\n                }\n            }\n        } else {\n            // this.Objects.clear()\n        }\n    }\n\n    static RemoveOp(val: ItemRef | any, refOwner: any) {\n        if (val !== undefined && (val as ItemRef).isItemRef) {\n            const ref = val as ItemRef\n            ReferenceManager.Remove(ref.id, refOwner, ref)\n        }\n    }\n\n    static GetOp(val: ItemRef | any, warn = true) {\n        if ((val as ItemRef).isItemRef) {\n            const value = ReferenceManager.Get(val as ItemRef)\n            if (!value) {\n                if (warn) console.error('Object3DComponent: Reference not found', val)\n                return null // todo we should not return null, should be special error object or something\n            }\n            return value\n        }\n        return undefined\n    }\n\n    static GetCached(valRaw: ItemRef | any) {\n        if (valRaw && (valRaw as ItemRef).isItemRef && (valRaw as ItemRef)._itemObject) {\n            const val = (valRaw as ItemRef)._itemObject\n            ;(valRaw as ItemRef)._itemObject = undefined\n            return val\n        }\n        return undefined\n    }\n\n}\n","import {Object3DComponent} from './Object3DComponent'\nimport {TypedType, TypeSystem} from './typeSystem'\nimport {objectHasOwn} from 'ts-browser-helpers'\nimport {generateUiConfig, generateValueConfig, UiObjectConfig} from 'uiconfig.js'\nimport {ReferenceManager} from './ReferenceManager'\nimport {ComponentCtx, StatePropConfig} from './componentTypes'\n\nexport interface PropMeta {\n    config: StatePropConfig;\n    propType: TypedType;\n    defaultValue: any;\n    defaultValueType: TypedType;\n    propKey: keyof Object3DComponent;\n}\n\n// const compType = /* @__PURE__ */ new WeakMap<typeof Object3DComponent, Set<string>>()\nexport function getComponentTypes(comp: typeof Object3DComponent) {\n    // const cache = compType.get(comp)\n    // if (cache) return cache\n    const types = new Set<string>()\n    let base = comp\n    while (base && base !== Object3DComponent && base !== Function.prototype) {\n        if (base.ComponentType) types.add(base.ComponentType)\n        base = Object.getPrototypeOf(base)\n    }\n    // compType.set(comp, types)\n    return types\n}\n\nexport function setupComponent(comp: Object3DComponent, ctx: ComponentCtx) {\n    if (!comp.isObject3DComponent) throw new Error('EntityComponentPlugin: invalid component instance')\n    comp.ctx = ctx\n    const props = getComponentStateProperties(comp.constructor)\n\n    const uiConfig = comp.uiConfig ?? {\n        type: 'folder',\n        label: ()=>comp._sType ? `Missing (${comp._sType})` : comp.constructor.ComponentType,\n        expanded: false,\n        children: generateUiConfig(comp),\n    }\n    const uiChildren = uiConfig.children as UiObjectConfig['children'] | undefined\n\n    const propsMeta: PropMeta[] = []\n\n    props.forEach(stateProp=>{\n        const propKey: keyof typeof comp = stateProp.key as any\n        if (!objectHasOwn(comp, propKey)) {\n            console.error('Object3DComponent: state property not found on component', stateProp, comp)\n            return\n        }\n        const defaultValue = stateProp.default ?? comp[propKey]\n        if (defaultValue === undefined) {\n            console.error('Object3DComponent: state property default value must be set', stateProp, comp)\n            return\n        }\n        const defaultValueType = TypeSystem.GetType(defaultValue)\n        if (!defaultValueType) {\n            console.error('Object3DComponent: unsupported type for state property', stateProp, defaultValue)\n            return\n        }\n        const propType = stateProp.type ?? TypeSystem.NonLiteral(defaultValueType)\n        if (!TypeSystem.CanAssign(defaultValueType, propType)) {\n            console.error('Object3DComponent: default value type is not compatible with state property type', stateProp, defaultValue, defaultValueType, propType)\n            return\n        }\n        // console.log('[Object3DComponent] setup state property', stateProp.key, 'type:', propType, 'default:', defaultValue)\n\n        // const refDef = TypeSystem.GetClass(defaultValueType)\n        // if (refDef) {\n        //     const id = refDef.getId(defaultValue)\n        //     if (!id) {\n        //         console.error('Object3DComponent: cannot get reference id for default value of state property', stateProp, defaultValue, id)\n        //     } else {\n        //         ReferenceManager.Add(id, defaultValue, comp) // ignore ret value\n        //     }\n        // }\n\n        delete comp[propKey]\n\n        Object.defineProperty(comp, propKey, {\n            get: ()=>{\n                return getStateProperty(comp, propKey, defaultValue)\n            },\n            set: (v)=>{\n                setStateProperty(v, comp, propKey, propType, defaultValue)\n                // todo set dirty on object?\n            },\n            enumerable: true,\n            configurable: true,\n        })\n\n        assignVal(defaultValueType, defaultValue, defaultValue, comp, propKey)\n\n        const prop = {\n            config: stateProp, propType, defaultValue, defaultValueType, propKey,\n        }\n        propsMeta.push(prop)\n\n        if (uiChildren) {\n            const uiC = generateComponentPropertyUi(comp, prop)\n            if (uiC?.length) uiChildren.push(...uiC)\n        }\n    })\n\n    ComponentCache.InstanceProperties.set(comp, propsMeta)\n\n    uiChildren?.push({\n        type: 'button',\n        label: 'Reset to Default',\n        uuid: 'reset_to_default',\n        tags: ['context-menu'],\n        value: () => {\n            const lastState = {} as any\n            propsMeta.forEach(({propKey, defaultValue}) => {\n                // @ts-expect-error todo fix ts\n                comp[propKey] = defaultValue\n                lastState[propKey] = comp[propKey]\n            })\n            return ()=>{\n                // undo\n                propsMeta.forEach(({propKey}) => {\n                    // @ts-expect-error todo fix ts\n                    comp[propKey] = lastState[propKey]\n                })\n            }\n        },\n    }, {\n        type: 'button',\n        label: 'Remove Component',\n        uuid: 'remove_component',\n        tags: ['context-menu'],\n        value: () => {\n            return ctx.ecp.removeComponent(comp.object, comp.uuid)\n        },\n    })\n    // todo sort children based on props order\n    comp.uiConfig = uiConfig\n}\n\nexport function refreshAllStateProperties(comp: Object3DComponent, lastState: Object3DComponent['stateRef']) {\n    if (!comp.isObject3DComponent) throw new Error('EntityComponentPlugin: invalid component instance')\n    const props = ComponentCache.InstanceProperties.get(comp)\n    if (!props) return\n\n    for (const {propKey, defaultValue, propType} of props) {\n        // console.log('[Object3DComponent] refresh state property', propKey)\n        const oldValueRaw = lastState ? lastState[propKey] : undefined\n\n        const valRaw = comp.stateRef[propKey]\n\n        let val\n        const cc = ReferenceManager.GetCached(valRaw)\n        if (cc !== undefined) val = cc\n        else val = getStateProperty(comp, propKey, defaultValue, valRaw, false)\n\n        setStateProperty(val, comp, propKey, propType, defaultValue, oldValueRaw)\n\n    }\n}\n\nexport function teardownComponent(comp: Object3DComponent) {\n    if (!comp.isObject3DComponent) throw new Error('EntityComponentPlugin: invalid component instance')\n    // const props = getComponentStateProperties(comp.constructor)\n    // props.forEach(p=>{\n    // })\n    ReferenceManager.Delete(comp)\n    ComponentCache.InstanceProperties.delete(comp)\n}\n\n\nclass ComponentCache {\n    static TypeProperties: WeakMap<typeof Object3DComponent, StatePropConfig[]> = new Map()\n    static InstanceProperties: WeakMap<Object3DComponent, PropMeta[]> = new Map()\n}\n\nfunction getComponentStateProperties(comp: typeof Object3DComponent) {\n    const cache = ComponentCache.TypeProperties.get(comp)\n    if (cache) return cache\n\n    const stateProps : Map<string, [StatePropConfig, any, number]> = new Map()\n    let base = comp\n    let order = 0\n    while (base && base !== Function.prototype) {\n        if (base.StateProperties) {\n            for (const p of base.StateProperties) {\n                const key = typeof p === 'string' ? p : p.key\n                const exis = stateProps.get(key)\n                if (exis) {\n                    const cons = exis[1]\n                    if (cons === base) {\n                        // same class property duplicate\n                        console.error('Object3DComponent: duplicate state property in class', {key, base})\n                    } else {\n                        // derived class property overrides base class property\n                        console.warn('Object3DComponent: state property overridden in derived class', {key, base, constructor: cons})\n                    }\n                    continue\n                }\n                // todo check order in prop config also\n                stateProps.set(key, [typeof p === 'string' ? {key: p} : p, base, order])\n                order += 0.001\n            }\n        }\n        if (base === Object3DComponent) break\n        base = Object.getPrototypeOf(base)\n        order -= 1\n    }\n    return Array.from(stateProps.values())\n        .sort((a, b)=>a[2] - b[2])\n        .map(v=>v[0])\n}\n\nfunction getStateProperty(comp: Object3DComponent, propKey: keyof typeof comp, defaultValue: any, val?: any, warn = true) {\n    val = val ?? comp.stateRef[propKey]\n\n    if (val === undefined) return defaultValue\n\n    const resolved = ReferenceManager.GetOp(val, warn)\n    if (resolved !== undefined) return resolved\n\n    return val\n}\n\nfunction setStateProperty(v: any, comp: Object3DComponent, propKey: keyof typeof comp, propType: TypedType, defaultValue: any, oldValueRaw?: any) {\n    if (v === undefined) {\n        console.error('Object3DComponent: state property cannot be set to undefined', propKey, v)\n        return\n    }\n    const oldValue = oldValueRaw !== undefined ? getStateProperty(comp, propKey, defaultValue, oldValueRaw) : comp[propKey]\n    if (oldValue === v) return\n    const valType = TypeSystem.GetType(v)\n    if (!valType) {\n        console.error('Object3DComponent: unsupported type for state property', propKey, v)\n        return\n    }\n    // todo skip type checking when running in production\n    if (!TypeSystem.CanAssign(valType, propType)) {\n        console.error('Object3DComponent: assigned value type is not compatible with state property type', propKey, v, valType, propType)\n        return\n    }\n    if (oldValueRaw === undefined)\n        oldValueRaw = comp.stateRef[propKey]\n\n    ReferenceManager.RemoveOp(oldValueRaw, comp)\n\n    assignVal(valType, v, defaultValue, comp, propKey)\n\n    if (oldValue !== undefined && oldValue !== v) {\n        comp.stateChangeHandlers[propKey]?.forEach(fn => fn(v, oldValue, propKey))\n    }\n}\n\nfunction assignVal(valType: TypedType, v: any, defaultValue: any, comp: Object3DComponent, propKey: keyof typeof comp) {\n    let res\n    const refDefNew = TypeSystem.GetClass(valType)\n    if (refDefNew) {\n        const newRefId = refDefNew.getId(v)\n        if (!newRefId) {\n            console.error('Object3DComponent: cannot get reference id for value of state property', propKey, v)\n            return\n        } else {\n            res = ReferenceManager.Add(newRefId, v, comp)\n        }\n    } else {\n        // if it's not a class instance and same as default value, we can just delete it from stateRef to save space\n        if (v === defaultValue) {\n            res = undefined\n        } else {\n            res = v\n        }\n    }\n    if (res === undefined) delete comp.stateRef[propKey]\n    else comp.stateRef[propKey] = res\n}\n\nfunction generateComponentPropertyUi(comp: Object3DComponent, prop: PropMeta) {\n    const {config: stateProp, propType, defaultValue, propKey} = prop\n\n    // todo flatten nested union types\n    const types = typeof propType === 'string' ? [propType] : 'oneOf' in propType ? Array.from(propType.oneOf) : ['unknown']\n\n    const canBeNull = types.includes('null')/* || types.includes('undefined')*/\n    const classTypes = types.map(t=>TypeSystem.GetClass(t)).filter(t=>t !== undefined)\n\n    const res: UiObjectConfig[] = []\n    // only class types or null\n    if (classTypes.length === types.length && !canBeNull\n        || classTypes.length === types.length - 1 && canBeNull\n    ) {\n        const newConfig: UiObjectConfig = {\n            type: 'reference' as const,\n            label: stateProp.label ?? propKey + '',\n            property: [comp, propKey],\n            classTypes: classTypes,\n            allowNull: canBeNull,\n            defaultValue: defaultValue,\n            // todo onchange refresh parent\n        }\n        res.push(newConfig)\n    }\n\n    // filter only the types that are literal types\n    const literalTypes = types.map(t=>typeof t === 'string' ?\n        t.startsWith('\"') && t.endsWith('\"') ? JSON.parse(t) :\n            !isNaN(Number(t)) ? Number(t) :\n                t === 'true' ? true : t === 'false' ? false :\n                    typeof t === 'number' || typeof t === 'boolean' ? t : undefined // just in case\n        : undefined).filter(t=>t !== undefined)\n\n    const uiC = ()=> {\n        // should we bind to stateRef? but it could be changed, also it could be deleted when default value is set\n        const config = generateValueConfig(comp, propKey, stateProp.label, undefined, false)\n        // todo use other metadata like description, hooks\n        if (config) {\n            if (typeof config === 'object') {\n                config.uuid = propKey // similar to react key\n                config.dispatchMode = 'immediate' // todo make this the default in uiconfig/uiconfig-react\n                // config.multiline = true\n            }\n\n            // all types are literal types, can be a dropdown. we can do more advanced type analysis later\n            if (literalTypes.length > 0 && literalTypes.length === types.length) {\n                if (config.type === 'input' || config.type === 'number' || config.type === 'string') {\n                    config.type = 'dropdown'\n                    config.children = literalTypes.map(t => {\n                        const label = typeof t === 'string' ? t : typeof t === 'number' ? t.toString() : typeof t === 'boolean' ? t ? 'true' : 'false' : t + ''\n                        return {label: label, value: t}\n                    })\n                }\n            }\n\n            if (prop.config.uiConfig) {\n                Object.assign(config, prop.config.uiConfig)\n            }\n\n            return config\n        }\n        return undefined\n    }\n    res.push(uiC)\n\n    return res\n}\n\n","import {IObject3D} from '../../../core'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {ComponentCtx, ComponentDefn, ComponentJSON} from './componentTypes'\nimport {refreshAllStateProperties} from './setupComponent'\nimport {EntityComponentPlugin} from '../EntityComponentPlugin'\nimport {ViewerEventMap} from '../../../viewer/ThreeViewer'\n\nexport type TObject3DComponent = typeof Object3DComponent\n\nexport class Object3DComponent {\n    declare ['constructor']: TObject3DComponent & ComponentDefn\n\n    // enabled = true\n    static StateProperties: ComponentDefn['StateProperties'] = [/* 'enabled'*/]\n    static ComponentType = 'Object3DComponent'\n    readonly isObject3DComponent = true\n\n    protected _object: IObject3D | null = null\n    get object() {\n        if (!this._object) {\n            throw new Error('Cannot access object at this point.')\n        }\n        return this._object\n    }\n    set object(_: IObject3D) {\n        console.error('Object3DComponent: object is read-only')\n    }\n\n    // name: string\n\n    // uuid = generateUUID()\n    uuid = Math.random().toString(32).slice(2, 10)\n    declare uiConfig?: UiObjectConfig\n    declare state: never // so that this name can never be used\n    protected _state: ComponentJSON['state']\n    get stateRef() {\n        return this._state\n    }\n    // getState() {\n    //     return {...this._state}\n    // }\n    setState(state: ComponentJSON['state']) {\n        const oldState = this._state\n        if (state === oldState) return\n        if (state && typeof state === 'object') {\n            this._state = state\n        } else {\n            this._state = {}\n        }\n        for (const key in oldState) {\n            if (!(key in this._state)) {\n                this._state[key] = oldState[key]\n            }\n        }\n        refreshAllStateProperties(this, oldState)\n        return this\n    }\n\n    declare ctx: ComponentCtx\n\n    constructor() {\n        this._state = {\n            // ...stateFuncs,\n        }\n\n        // todo this has to be done after the subclass constructor, not before. move to the plugin\n        // this.name = this.type\n    }\n\n    // hooks\n\n    start() {\n        // called when component is added to an object, usually when the scene is played\n    }\n\n    stop() {\n        // called when scene is stopped or component is removed from an object when scene is playing\n    }\n\n    update(_e: ViewerEventMap['preFrame']): boolean|void {\n        // called every frame\n    }\n\n    preFrame(_e: ViewerEventMap['preFrame']): boolean|void {\n        // called every frame, before update, even when not running(paused/edit mode)\n    }\n\n    init(object: IObject3D, state: ComponentJSON['state']) {\n        if (!object) throw new Error('Object3DComponent: no object')\n        this._object = object\n        this.setState(state)\n    }\n\n    destroy() {\n        this._object = null as any\n        this.stateChangeHandlers = {}\n        const state = this._state\n        this._state = {}\n        return state\n    }\n\n    stateChangeHandlers: Record<string, ((value: any, oldValue: any, key?: string) => void)[]> = {}\n    onStateChange<K extends keyof this & string>(\n        key: K,\n        fn: (value: this[K], oldValue: this[K], key?: K) => void\n    ) {\n        if (!this.stateChangeHandlers[key]) this.stateChangeHandlers[key] = []\n        this.stateChangeHandlers[key].push(fn)\n    }\n\n\n    /**\n     * @internal\n     */\n    ['_sType']?: string\n\n    getComponent<T extends TObject3DComponent>(type: T | string, self = false) {\n        const obj = this._object\n        if (!obj) return self ? null : this.ctx.ecp.getComponentOfType(type)\n        if (self) return EntityComponentPlugin.GetComponent(obj, type)\n        return EntityComponentPlugin.GetComponentInParent(obj, type) ||\n            this.ctx.ecp.getComponentOfType(type)\n    }\n}\n","import {Object3DComponent} from './Object3DComponent'\nimport {Vector3} from 'three'\nimport {uiButton} from 'uiconfig.js'\nimport {timeout} from 'ts-browser-helpers'\nimport {ViewerEventMap} from '../../../viewer/ThreeViewer'\n/**\n * Sample component that simulates a basic rigid body with forces, impulses, and velocity\n */\nexport class SampleBodyComponent extends Object3DComponent {\n    static StateProperties = ['running', 'mass', 'damping']\n    static ComponentType = 'SampleBodyComponent'\n\n    running = true\n    mass = 1\n    damping = 0.98 // small damping to prevent infinite motion\n\n    velocity = new Vector3()\n    acceleration = new Vector3()\n\n    update({deltaTime}: ViewerEventMap['preFrame']) {\n        if (!this.object || !this.running) return\n\n        const dt = (deltaTime ?? 16) / 1000 // ~60fps fallback\n\n        // Integrate acceleration -> velocity (acceleration is sum of forces / mass for this frame)\n        this.velocity.x += this.acceleration.x * dt\n        this.velocity.y += this.acceleration.y * dt\n        this.velocity.z += this.acceleration.z * dt\n\n        // Apply damping\n        this.velocity.multiplyScalar(this.damping)\n\n        // Reset acceleration so forces must be re-applied next frame\n        this.acceleration.set(0, 0, 0)\n\n        // Check if velocity is effectively non-zero using sum of absolute values\n        const speedSum = Math.abs(this.velocity.x) + Math.abs(this.velocity.y) + Math.abs(this.velocity.z)\n        if (speedSum <= 1e-6) return false\n\n        // Integrate velocity -> position\n        this.object.position.x += this.velocity.x * dt\n        this.object.position.y += this.velocity.y * dt\n        this.object.position.z += this.velocity.z * dt\n        return true\n    }\n\n    addForce(force: {x?: number; y?: number; z?: number}) {\n        // F = m * a => a = F / m\n        if (force.x !== undefined) this.acceleration.x += force.x / this.mass\n        if (force.y !== undefined) this.acceleration.y += force.y / this.mass\n        if (force.z !== undefined) this.acceleration.z += force.z / this.mass\n    }\n\n    applyImpulse(impulse: {x?: number, y?: number, z?: number}) {\n        // Impulse = Δv * m → Δv = Impulse / m\n        if (impulse.x !== undefined) this.velocity.x += impulse.x / this.mass\n        if (impulse.y !== undefined) this.velocity.y += impulse.y / this.mass\n        if (impulse.z !== undefined) this.velocity.z += impulse.z / this.mass\n    }\n\n    setVelocity(velocity: {x: number; y: number; z: number}) {\n        this.velocity.copy(velocity)\n    }\n\n    stop() {\n        this.reset()\n    }\n\n    start() {\n        this.reset()\n    }\n\n    reset() {\n        this.velocity.set(0, 0, 0)\n        this.acceleration.set(0, 0, 0)\n    }\n\n    // Sample functions\n\n    @uiButton()\n        MoveLeft = () => {\n            this.applyImpulse({x: -5})\n        }\n    @uiButton()\n        MoveRight = () => {\n            this.applyImpulse({x: 5})\n        }\n\n    @uiButton()\n        PushForward = async() => {\n            for (let i = 0; i < 200; i++) {\n                this.addForce({z: 10})\n                await timeout(32)\n            }\n        }\n\n    @uiButton()\n        PushBackward = async() => {\n            for (let i = 0; i < 200; i++) {\n                this.addForce({z: -10})\n                await timeout(32)\n            }\n        }\n}\n","import {AViewerPluginEventMap, AViewerPluginSync, ThreeViewer} from '../../viewer'\nimport {IObject3D} from '../../core'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {\n    ComponentCtx,\n    ComponentJSON,\n    getComponentTypes,\n    Object3DComponent,\n    setupComponent,\n    TObject3DComponent,\n} from './components'\nimport {ViewerEventMap} from '../../viewer/ThreeViewer'\nimport {teardownComponent} from './components/setupComponent'\n\nexport type FunctionPropertyNames<T> = {\n    [K in keyof T]: T[K] extends (((...args: any[]) => any)|undefined) ? K : never;\n}[keyof T] & string\n\nexport interface EntityComponentPluginEventMap extends AViewerPluginEventMap{\n    registerComponent: {component: Object3DComponent, object: IObject3D}\n    unregisterComponent: {component: Object3DComponent, object: IObject3D}\n    addComponentType: {cls: TObject3DComponent}\n    removeComponentType: {cls: TObject3DComponent}\n}\n\n/**\n * Entity Component Framework plugin for threepipe.\n * Allows attaching reusable components to IObject3D instances.\n * Components can have their own serializable/runtime state, lifecycle methods, and update logic.\n * Components are defined as classes extending Object3DComponent.\n *\n * This system is not documented at the moment.\n */\nexport class EntityComponentPlugin extends AViewerPluginSync<EntityComponentPluginEventMap> {\n    public static readonly PluginType = 'EntityComponentPlugin'\n\n    enabled = true\n    protected _running: boolean\n    get running() {\n        return this._running\n    }\n\n    start() {\n        if (this._running) return\n        this._running = true\n        for (const comp of this._components.values()) {\n            try {\n                comp.start()\n            } catch (e) {\n                console.error('EntityComponentPlugin: Error starting component', comp)\n                console.error(e)\n            }\n        }\n        if (this._viewer && this._components.size) this._viewer.setDirty(this)\n    }\n    stop() {\n        if (!this._running) return\n        this._running = false\n        for (const comp of this._components.values()) {\n            try {\n                comp.stop()\n            } catch (e) {\n                console.error('EntityComponentPlugin: Error stopping component', comp)\n                console.error(e)\n            }\n        }\n        if (this._viewer && this._components.size) this._viewer.setDirty(this)\n    }\n\n    componentsDispatch<T extends FunctionPropertyNames<Object3DComponent>>(\n        type: T, ...args: Parameters<NonNullable<Object3DComponent[T]>>\n    ) {\n        return EntityComponentPlugin.ComponentsDispatch([...this._components.values()], type as any, args)\n    }\n\n    private readonly _components: Map<string, Object3DComponent> = new Map() // key = object.uuid + component.uuid\n    private _typeToComponents: Map<string, Set<Object3DComponent>> = new Map() // key = component type\n    readonly componentTypes: Map<string, TObject3DComponent> = new Map() // key = component type\n\n    static readonly ObjectToComponents: WeakMap<IObject3D, Object3DComponent[]> = new Map() // key = object\n\n    static ObjectDispatch<T extends FunctionPropertyNames<Object3DComponent>>(\n        object: IObject3D,\n        type: T,\n        ...args: Parameters<NonNullable<Object3DComponent[T]>>\n    ) {\n        const comps = EntityComponentPlugin.ObjectToComponents.get(object)\n        if (comps) {\n            return EntityComponentPlugin.ComponentsDispatch(comps, type, args)\n        }\n        return []\n    }\n\n    static ComponentsDispatch<T extends FunctionPropertyNames<Object3DComponent>>(\n        comps: Object3DComponent[],\n        type: T,\n        args: Parameters<NonNullable<Object3DComponent[T]>>,\n    ) {\n        const res = []\n        for (const comp of comps) {\n            const l = comp[type]\n            if (typeof l === 'function') {\n                try {\n                    res.push([comp, l.apply(comp, args)])\n                } catch (err) {\n                    console.error(`EntityComponentPlugin: Error in component ${comp.constructor.ComponentType} handling ${type}`, comp, err)\n                }\n            }\n        }\n        return res\n    }\n\n    static UserDataKey = EntityComponentPlugin.PluginType\n\n    constructor(running = true) {\n        super()\n        this.componentTypes.set(Object3DComponent.ComponentType, Object3DComponent)\n        this._running = running\n    }\n\n    addComponentType(type: TObject3DComponent) {\n        if (!type || typeof type !== 'function') {\n            throw new Error('EntityComponentPlugin: invalid component type')\n        }\n        if (!type.ComponentType || typeof type.ComponentType !== 'string') {\n            throw new Error('EntityComponentPlugin: component type must have a valid string \"ComponentType\" property')\n        }\n        if (this.componentTypes.has(type.ComponentType)) {\n            console.warn(`EntityComponentPlugin: component type \"${type.ComponentType}\" already registered`)\n            return false\n        }\n        this.componentTypes.set(type.ComponentType, type)\n        this.dispatchEvent({type: 'addComponentType', cls:type})\n        // loop through objects\n        this._viewer?.object3dManager.getObjects().forEach(object=>this._objectAdd({object, componentType: type.ComponentType}))\n        return true\n    }\n\n    removeComponentType(type: TObject3DComponent) {\n        if (!type || typeof type !== 'function') {\n            throw new Error('EntityComponentPlugin: invalid component type')\n        }\n        if (!type.ComponentType || typeof type.ComponentType !== 'string') {\n            throw new Error('EntityComponentPlugin: component type must have a valid string \"ComponentType\" property')\n        }\n        if (!this.componentTypes.has(type.ComponentType)) {\n            console.warn(`EntityComponentPlugin: component type \"${type.ComponentType}\" not registered`)\n            return false\n        }\n        this.dispatchEvent({type: 'removeComponentType', cls:type})\n        // loop through objects\n        this._viewer?.object3dManager.getObjects().forEach(object=>this._objectRemove({object, componentType: type.ComponentType}))\n        this.componentTypes.delete(type.ComponentType)\n        return true\n    }\n\n    hasComponentType(type: TObject3DComponent | string) {\n        const typeStr = typeof type === 'string' ? type : type.ComponentType\n        return this.componentTypes.has(typeStr)\n    }\n\n    private _onRemove: (()=>void)[] = []\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n        viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n        viewer.scene.addEventListener('objectUpdate', this._objectUpdate)\n        const offUpdate = viewer.on('preFrame', {\n            order: 1,\n            callback: this._preFrame,\n        })\n        if (offUpdate) this._onRemove.push(offUpdate)\n    }\n\n    private _preFrame = (e: ViewerEventMap['preFrame'])=>{\n        if (this.isDisabled() || !this._viewer?.renderEnabled || e.deltaTime <= 0) return\n        const args = [e] as const\n        let dirty = false\n        // todo component exec sort order?\n        let res = this.componentsDispatch('preFrame', ...args)\n        if (!dirty && res.find(a=>!!a[1])) dirty = true\n        if (this._running && e.timeline.delta > 0) { // todo might be better to subscribe to timeline update event directly for this\n            // todo component exec sort order?\n            res = this.componentsDispatch('update', ...args)\n            if (!dirty && res.find(a=>!!a[1])) dirty = true\n        }\n        if (dirty) this._viewer?.setDirty(this)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n        viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n        viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n        viewer.scene.removeEventListener('objectUpdate', this._objectUpdate)\n        this._onRemove.forEach(f=>f())\n        super.onRemove(viewer)\n    }\n\n    static GetObjectData(obj: IObject3D) {\n        let data = obj.userData[EntityComponentPlugin.UserDataKey] as Record<string, ComponentJSON>|undefined\n        if (data) {\n            if (typeof data !== 'object') {\n                console.warn(`EntityComponentPlugin: userData.${EntityComponentPlugin.UserDataKey} is not an object`, obj)\n                data = {}\n                obj.userData[EntityComponentPlugin.UserDataKey] = data\n            }\n        }\n        return data || null\n    }\n\n    /**\n     * Add a component to an object\n     * @param obj - Target object\n     * @param stateOrType - Component state json or type string or component class\n     * @param id - Optional component id, if not provided a random uuid will be generated\n     * @returns Undo/redo action, added component is in action.component\n     */\n    addComponent<T extends TObject3DComponent = TObject3DComponent>(obj: IObject3D, stateOrType: ComponentJSON|string|T, id?: string) {\n        if (!this._viewer) throw new Error('EntityComponentPlugin: no viewer')\n        const state = !stateOrType ?\n            {type: 'Object3DComponent', state: {}} :\n            typeof stateOrType === 'string' ? {type: stateOrType, state: {}} :\n                (stateOrType as TObject3DComponent).ComponentType ? {type: (stateOrType as TObject3DComponent).ComponentType, state: {}} :\n                    stateOrType && typeof (stateOrType as ComponentJSON).type === 'string' && (stateOrType as ComponentJSON).state ? (stateOrType as ComponentJSON) :\n                        {type: 'Object3DComponent', state: {}}\n\n        if ((stateOrType as TObject3DComponent).ComponentType) {\n            if (!this.hasComponentType((stateOrType as TObject3DComponent))) {\n                this.addComponentType(stateOrType as TObject3DComponent)\n            }\n        }\n\n        const comp = this.registerComponent(obj, state, id) as InstanceType<T>\n        if (!comp) throw new Error('EntityComponentPlugin: cannot create component of type ' + state.type)\n        let data = EntityComponentPlugin.GetObjectData(obj)\n        if (!data) {\n            data = {}\n            obj.userData[EntityComponentPlugin.UserDataKey] = data\n        }\n        if (!data[comp.uuid]) {\n            data[comp.uuid] = {state: comp.stateRef, type: comp.constructor.ComponentType}\n        } else {\n            data[comp.uuid].type = comp.constructor.ComponentType\n            data[comp.uuid].state = comp.stateRef\n        }\n        obj.setDirty && obj.setDirty({change: `userData.${EntityComponentPlugin.UserDataKey}`, source: 'EntityComponentPlugin.addComponent', refreshUi: true})\n        // undo/redo action\n        const action = {\n            undo: ()=>{\n                const r = this.removeComponent(obj, action.component.uuid)\n                if (r) action.redo = r.undo\n            },\n            redo: ()=>{\n                this.addComponent(obj, stateOrType)\n            },\n            component: comp,\n        }\n        return action\n    }\n\n    /**\n     * Remove a component from an object\n     * @param obj\n     * @param id\n     */\n    removeComponent(obj: IObject3D, id: string) {\n        if (!this._viewer) return\n        const comp = this._components.get(obj.uuid + id)\n        if (!comp) return\n        const type = comp.constructor.ComponentType\n        const state = this.unregisterComponent(comp)\n        const data = EntityComponentPlugin.GetObjectData(obj)\n        if (data) {\n            delete data[id]\n            if (Object.keys(data).length === 0) {\n                delete obj.userData[EntityComponentPlugin.UserDataKey]\n            }\n            obj.setDirty && obj.setDirty({change: `userData.${EntityComponentPlugin.UserDataKey}`, source: 'EntityComponentPlugin.removeComponent', refreshUi: true})\n        }\n        const action = {\n            state: state,\n            undo: ()=>{\n                if (action.state) this.addComponent(obj, {type, state: action.state}, id)\n            },\n            redo: ()=>{\n                this.removeComponent(obj, id)\n            },\n        }\n        return action\n    }\n\n    static GetComponentData<T extends TObject3DComponent = TObject3DComponent>(obj: IObject3D, type: string|T) {\n        if (!obj) return null\n        const data = EntityComponentPlugin.GetObjectData(obj)\n        if (!data) return null\n        const typeTarget = typeof type === 'string' ? [type] : [...getComponentTypes(type)]\n        for (const [k, v] of Object.entries(data)) {\n            for (const t of typeTarget) {\n                if (v.type === t) return {id: k, ...v} as {id: string} & ComponentJSON\n            }\n        }\n        const c = EntityComponentPlugin.GetComponent(obj, type)\n        if (c) return {id: c.uuid, type: c.constructor.ComponentType, state: c.stateRef} as {id: string} & ComponentJSON\n        return null\n    }\n\n    static GetComponents<T extends TObject3DComponent = TObject3DComponent>(obj: IObject3D, type?: string|T) {\n        if (!obj) return []\n        const comps = EntityComponentPlugin.ObjectToComponents.get(obj) || []\n        if (!type) return comps as InstanceType<T>[]\n        const typeTarget = typeof type === 'string' ? [type] : [...getComponentTypes(type)]\n        return comps.filter(c=>{\n            const types = getComponentTypes(c.constructor)\n            return typeTarget.some(t=>types.has(t))\n        }) as InstanceType<T>[]\n    }\n\n    static GetComponent<T extends TObject3DComponent = TObject3DComponent>(obj: IObject3D, type: string|T) {\n        if (!obj) return null\n        const comps = EntityComponentPlugin.ObjectToComponents.get(obj) || []\n        const typeTarget = typeof type === 'string' ? [type] : [...getComponentTypes(type)]\n        for (const c of comps) {\n            const types = getComponentTypes(c.constructor)\n            for (const t of typeTarget) {\n                if (types.has(t)) return c as InstanceType<T>\n            }\n        }\n        return null\n    }\n\n    static GetComponentInParent<T extends TObject3DComponent = TObject3DComponent>(object: IObject3D, type: string|T) {\n        if (!object) return null\n        let obj: IObject3D|null = object\n        let comp: InstanceType<T> | null = null\n        while (!comp && obj) {\n            comp = EntityComponentPlugin.GetComponent(obj, type)\n            obj = obj.parent\n        }\n        return comp\n    }\n\n    static GetComponentsInParent<T extends TObject3DComponent = TObject3DComponent>(object: IObject3D, type: string|T) {\n        if (!object) return []\n        let obj: IObject3D|null = object\n        const comps: InstanceType<T>[] = []\n        while (obj) {\n            comps.push(...EntityComponentPlugin.GetComponents(obj, type))\n            obj = obj.parent\n        }\n        return comps\n    }\n\n    /**\n     * Get all components of a specific type from the plugin instance\n     * @param type - The component type (string or class)\n     * @returns Array of components matching the specified type\n     */\n    getComponentsOfType<T extends TObject3DComponent = TObject3DComponent>(type: string|T): InstanceType<T>[] {\n        const typeStr = typeof type === 'string' ? type : type.ComponentType\n        const compSet = this._typeToComponents.get(typeStr)\n        if (!compSet) return []\n        return [...compSet] as InstanceType<T>[]\n    }\n\n    /**\n     * Get the first component of a specific type from the plugin instance\n     * @param type - The component type (string or class)\n     * @returns The first component matching the specified type, or null if not found\n     */\n    getComponentOfType<T extends TObject3DComponent = TObject3DComponent>(type: string|T): InstanceType<T> | null {\n        const typeStr = typeof type === 'string' ? type : type.ComponentType\n        const compSet = this._typeToComponents.get(typeStr)\n        if (!compSet || compSet.size === 0) return null\n        return compSet.values().next().value as InstanceType<T>\n    }\n\n    registerComponent(obj: IObject3D, state: ComponentJSON, id?: string) {\n        if (!this._viewer) throw new Error('EntityComponentPlugin: no viewer')\n        if (!obj) throw new Error('EntityComponentPlugin: no object')\n        if (!state || typeof state !== 'object') {\n            console.warn('EntityComponentPlugin: invalid component state', state, obj)\n            state = {type: 'Object3DComponent', state: {}}\n        }\n        if (id) {\n            const comp = this._components.get(obj.uuid + id)\n            if (comp) {\n                if (comp.object !== obj) {\n                    console.error(`EntityComponentPlugin: component with id ${id} already exists on a different object`)\n                    comp.object = obj\n                }\n                if (comp.constructor.ComponentType !== state.type) {\n                    console.warn(`EntityComponentPlugin: component with id ${id} type mismatch (${comp.constructor.ComponentType} != ${state.type}), removing previous component and creating new one`)\n                    this.unregisterComponent(comp)\n                    // continue to create new component\n                } else {\n                    comp.setState(state.state)\n                }\n                return comp\n            }\n        }\n        const cls = this.componentTypes.get(state.type)\n\n        // todo why making a new one for every component?\n        const ctx: ComponentCtx = {\n            viewer: this._viewer,\n            ecp: this,\n            // object: obj,\n            plugin: (p)=>{\n                const i = ctx.viewer?.getPlugin(p)\n                if (!i) {\n                    throw new Error(`EntityComponentPlugin: cannot find plugin ${typeof p === 'string' ? p : p.name}`)\n                }\n                return i\n            },\n            // component(c) {\n            //     const comp = EntityComponentPlugin.GetComponent(ctx.object, c)\n            //     if (!comp) {\n            //         throw new Error(`EntityComponentPlugin: cannot find component ${typeof c === 'string' ? c : c.name} on object`)\n            //     }\n            //     return comp\n            // },\n        }\n        let comp\n        try {\n            // todo when cls doesnt exist, and a component type is registered, it needs to be recreated\n            comp = cls ? new cls() : new Object3DComponent()\n            if (!cls) {\n                console.error('EntityComponentPlugin: unknown component type ' + state.type, obj)\n                comp._sType = state.type\n            }\n\n            if (id) comp.uuid = id\n            setupComponent(comp, ctx)\n        } catch (e) {\n            console.error('EntityComponentPlugin: Error creating component of type ' + state.type)\n            console.error(e)\n            return null\n        }\n        this._components.set(obj.uuid + comp.uuid, comp)\n        EntityComponentPlugin.ObjectToComponents.set(obj, [...EntityComponentPlugin.ObjectToComponents.get(obj) || [], comp])\n\n        const typeSet = this._typeToComponents.get(comp.constructor.ComponentType) || new Set()\n        typeSet.add(comp)\n        this._typeToComponents.set(comp.constructor.ComponentType, typeSet)\n\n        try {\n            comp.init(obj, state.state)\n        } catch (e) {\n            console.error('EntityComponentPlugin: Error initializing component', comp)\n            console.error(e)\n        }\n        this.dispatchEvent({type: 'registerComponent', component: comp, object: obj})\n        try {\n            if (this.running) comp.start()\n        } catch (e) {\n            console.error('EntityComponentPlugin: Error starting component', comp)\n            console.error(e)\n        }\n        return comp\n    }\n\n    unregisterComponent(comp: Object3DComponent) {\n        if (!comp) return\n        const obj = comp.object\n        let state: Record<string, any>|null = null\n        if (!obj) {\n            console.warn('EntityComponentPlugin: component already destroyed', comp)\n        } else {\n            try {\n                if (this.running) comp.stop()\n            } catch (e) {\n                console.error('EntityComponentPlugin: Error stopping component', comp)\n                console.error(e)\n            }\n            // this.dispatchEvent({type: 'unregisterComponent', component: comp, object: obj})\n            try {\n                state = comp.destroy()\n            } catch (e) {\n                console.error('EntityComponentPlugin: Error destroying component', comp)\n                console.error(e)\n            }\n        }\n        this._components.delete(obj.uuid + comp.uuid)\n\n        const typeSet = this._typeToComponents.get(comp.constructor.ComponentType)\n        if (typeSet) {\n            typeSet.delete(comp)\n            if (typeSet.size === 0) {\n                this._typeToComponents.delete(comp.constructor.ComponentType)\n            }\n        }\n\n        teardownComponent(comp)\n        const comps = EntityComponentPlugin.ObjectToComponents.get(obj) || []\n        const index = comps.indexOf(comp)\n        if (index !== -1) {\n            comps.splice(index, 1)\n            if (comps.length === 0) {\n                EntityComponentPlugin.ObjectToComponents.delete(obj)\n            }\n        }\n        if (obj) this.dispatchEvent({type: 'unregisterComponent', component: comp, object: obj})\n        return state\n    }\n\n    static AddObjectUiConfig = true\n\n    private _objectAdd = (e: {object?: IObject3D, componentType?: string})=>{\n        const obj = e.object\n        if (!obj) return\n        if (obj.isWidget) return\n\n        // Add getComponent method to object\n        if (!obj.getComponent) {\n            obj.getComponent = <T extends TObject3DComponent>(type: T | string, self = false) => {\n                if (self) return EntityComponentPlugin.GetComponent(obj, type)\n                return EntityComponentPlugin.GetComponentInParent(obj, type) ||\n                    this.getComponentOfType(type)\n            }\n        }\n\n        if (!(obj as any)._compUiInit && obj.uiConfig?.children && EntityComponentPlugin.AddObjectUiConfig) {\n            (obj as any)._compUiInit = true\n            const dropdown = {\n                type: 'dropdown',\n                label: 'Add Component',\n                value: '',\n                children: [{\n                    label: 'Select component type',\n                    value: '',\n                }, ()=>{\n                    return [...this.componentTypes.values()].map(v=>({\n                        label: v.ComponentType,\n                        value: v.ComponentType,\n                    }))\n                }],\n            }\n            obj.uiConfig.children.push({\n                type: 'folder',\n                label: 'Components',\n                tags: [EntityComponentPlugin.PluginType],\n                children: [\n                    dropdown,\n                    {\n                        type: 'button',\n                        label: 'Add Component',\n                        // disabled: ()=>!dropdown.value,\n                        onClick: () => {\n                            if (!dropdown.value) return\n                            return this.addComponent(obj, dropdown.value)\n                        },\n                    },\n                    ()=>{\n                        const data = EntityComponentPlugin.GetObjectData(obj)\n                        const children = !data ? [] : Object.keys(data).map((k)=>{\n                            const comp = this._components.get(obj.uuid + k)\n                            return comp?.uiConfig\n                        }).filter(c=>!!c) as UiObjectConfig[]\n                        return children\n                    },\n                ]})\n        }\n\n        const data = EntityComponentPlugin.GetObjectData(obj)\n        if (!data) return\n        Object.entries(data).forEach(([k, v])=>{\n            if (e.componentType && v.type !== e.componentType) return\n            const comp = this.registerComponent(obj, v, k)\n            if (comp) data[k].state = comp.stateRef\n        })\n\n    }\n\n    private _objectRemove = (e: {object?: IObject3D, componentType?: string})=>{\n        const obj = e.object\n        if (!obj) return\n        const data = EntityComponentPlugin.GetObjectData(obj)\n\n        // Remove getComponent method from object\n        if (obj.getComponent) {\n            delete obj.getComponent\n        }\n\n        // remove ui config by tags\n        if ((obj as any)._compUiInit && obj.uiConfig?.children) {\n            (obj as any)._compUiInit = false\n            obj.uiConfig.children = obj.uiConfig.children.filter(c=>{\n                if (typeof c === 'object' && c.tags && Array.isArray(c.tags) && c.tags.includes(EntityComponentPlugin.PluginType)) {\n                    return false\n                }\n            })\n        }\n\n        if (!data) return\n        Object.entries(data).forEach(([k, v])=>{\n            if (e.componentType && v.type !== e.componentType) return\n            const comp = this._components.get(obj.uuid + k)\n            if (comp) {\n                if (comp.object !== obj) {\n                    console.warn(`EntityComponentPlugin: component with id ${k} exists on a different object`)\n                    return\n                }\n                const r = this.unregisterComponent(comp)\n                if (r) v.state = r\n            } else if (v) {\n                // console.warn(`EntityComponentPlugin: component with id ${k} not found`, obj)\n                // data[k] = v\n            }\n        })\n    }\n\n    private _objectUpdate = (e: {object?: IObject3D, change?: string})=>{\n        if (e.change === 'deserialize') {\n            const obj = e.object\n            if (!obj) return\n            this._objectAdd(e)\n        }\n    }\n}\n\nexport const ECS = EntityComponentPlugin\n\n// Augment IObject3D interface to include getComponent method\ndeclare module '../../core/IObject' {\n    interface IObject3D {\n        /**\n         * Get a component attached to this object or in its parent hierarchy, or get a component of the specified type from the global registry.\n         * This method is added by EntityComponentPlugin when the object is added to the scene.\n         * @param type - The component type (string or class)\n         * @param self - If true, only search this object; if false, search parents and global registry\n         * @returns The component instance if found, or null\n         */\n        getComponent?<T extends TObject3DComponent>(type: T | string, self?: boolean): InstanceType<T> | null\n    }\n}\n","// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function _testFinish(): void {\n    window.dispatchEvent(new Event('threepipe-test-finished'))\n    document.body.classList.add('_testFinish')\n}\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function _testStart(): void {\n    window.dispatchEvent(new Event('threepipe-test-started'))\n    document.body.classList.add('_testStarted')\n}\n","import {Object3D} from 'three'\nimport {iObjectCommons} from '../../core'\n\n/**\n * @deprecated use {@link IObject3D.autoCenter} instead, or {@link iObjectCommons.autoCenter}\n * @param obj\n */\nexport function autoCenterObject3D(obj: Object3D) {\n    return iObjectCommons.autoCenter.call(obj)\n}\n\n/**\n * @deprecated use {@link IObject3D.autoScale} instead, or {@link iObjectCommons.autoScale}\n * @param obj\n * @param autoScaleRadius\n * @param isCentered\n * @param setDirty\n */\nexport function autoScaleObject3D(obj: Object3D, autoScaleRadius?: number, isCentered?: boolean, setDirty?: boolean) {\n    return iObjectCommons.autoScale.call(obj, autoScaleRadius, isCentered, setDirty)\n}\n"],"names":["MOUSE","TOUCH","CullFaceNone","CullFaceBack","CullFaceFront","PCFShadowMap","PCFSoftShadowMap","VSMShadowMap","FrontSide","BackSide","DoubleSide","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","ConstantColorFactor","OneMinusConstantColorFactor","ConstantAlphaFactor","OneMinusConstantAlphaFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","CineonToneMapping","ACESFilmicToneMapping","CustomToneMapping","AgXToneMapping","NeutralToneMapping","AttachedBindMode","DetachedBindMode","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","LinearMipMapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedInt248Type","UnsignedInt5999Type","AlphaFormat","RGBFormat","RGBAFormat","LuminanceFormat","LuminanceAlphaFormat","DepthFormat","DepthStencilFormat","RedFormat","RedIntegerFormat","RGFormat","RGIntegerFormat","RGBAIntegerFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGBA_ETC2_EAC_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","RGBA_BPTC_Format","RGB_BPTC_SIGNED_Format","RGB_BPTC_UNSIGNED_Format","RED_RGTC1_Format","SIGNED_RED_RGTC1_Format","RED_GREEN_RGTC2_Format","SIGNED_RED_GREEN_RGTC2_Format","LoopOnce","LoopRepeat","LoopPingPong","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","NormalAnimationBlendMode","AdditiveAnimationBlendMode","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","BasicDepthPacking","RGBADepthPacking","TangentSpaceNormalMap","ObjectSpaceNormalMap","NoColorSpace","SRGBColorSpace","LinearSRGBColorSpace","DisplayP3ColorSpace","LinearDisplayP3ColorSpace","RGBM16ColorSpace","LinearTransfer","SRGBTransfer","Rec709Primaries","P3Primaries","KeepStencilOp","AlwaysStencilFunc","NeverCompare","LessCompare","EqualCompare","LessEqualCompare","GreaterCompare","NotEqualCompare","GreaterEqualCompare","AlwaysCompare","StaticDrawUsage","GLSL1","GLSL3","WebGLCoordinateSystem","WebGPUCoordinateSystem","LinearEncoding","sRGBEncoding","EventDispatcher","type","listener","listeners","listenerArray","index","event","array","i","l","_lut","_seed","DEG2RAD","RAD2DEG","generateUUID","d0","d1","d2","d3","clamp","value","min","max","euclideanModulo","n","m","mapLinear","x","a1","a2","b1","b2","inverseLerp","y","lerp","damp","lambda","dt","pingpong","length","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","seededRandom","t","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","floorPowerOfTwo","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","denormalize","normalize","MathUtils","Vector2","scalar","v","s","e","minVal","maxVal","denominator","theta","dx","dy","alpha","v1","v2","offset","attribute","center","angle","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","te","me","xAxis","yAxis","zAxis","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","d","f","g","h","t11","t12","t13","det","detInv","tmp","matrix4","r","tx","ty","sx","sy","rotation","cx","cy","_m3","matrix","arrayNeedsUint32","TYPED_ARRAYS","getTypedArray","buffer","createElementNS","name","createCanvasElement","canvas","_cache","warnOnce","message","LINEAR_SRGB_TO_LINEAR_DISPLAY_P3","LINEAR_DISPLAY_P3_TO_LINEAR_SRGB","COLOR_SPACES","color","SUPPORTED_WORKING_COLOR_SPACES","ColorManagement","colorSpace","sourceColorSpace","targetColorSpace","sourceToReference","targetFromReference","SRGBToLinear","LinearToSRGB","_canvas","ImageUtils","image","forcePng","context","imageData","data","_sourceId","Source","meta","isRootObject","output","url","serializeImage","_textureId","Texture","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","source","copyTextureUserData","uv","encoding","iTextureIgnoredUserData","dest","key","Vector4","z","w","m11","m12","m13","m21","m22","m23","m31","m32","m33","xx","yy","zz","xy","xz","yz","RenderTarget","width","height","options","texture","count","depth","il","WebGLRenderTarget","DataArrayTexture","WebGLArrayRenderTarget","Data3DTexture","WebGL3DRenderTarget","Quaternion","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","len","tDir","quaternion","euler","update","c1","c3","s1","s3","axis","halfAngle","trace","vFrom","vTo","step","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","qa","theta1","theta2","r1","r2","callback","Vector3","_quaternion$4","vx","vy","vz","qx","qy","qz","qw","tz","camera","ax","ay","az","bx","by","bz","planeNormal","_vector$c","normal","dz","radius","phi","sinPhiRadius","sz","u","Box3","_vector$b","points","size","halfSize","object","precise","box","target","point","vector","geometry","positionAttribute","_box$4","children","sphere","plane","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","_points","_testAxis","v0","extents","j","p0","p1","p2","_box$3","_v1$6","_v2$3","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","lengthSq","delta","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","directionDistance","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","tca","radius2","thc","t0","t1","distToPoint","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","backfaceCulling","DdN","sign","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","scaleX","_v1$5","scaleY","scaleZ","af","bf","ce","cf","de","df","ac","ad","bc","bd","_zero","_one","eye","up","_z","_x","_y","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","yx","zx","zy","position","scale","x2","y2","z2","wx","wy","wz","_m1$4","invSX","invSY","invSZ","left","right","top","bottom","near","far","coordinateSystem","p","zInv","_matrix$2","_quaternion$3","Euler","newOrder","Layers","channel","layers","_object3DId","_v1$4","_q1","_m1$3","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","_childaddedEvent","_childremovedEvent","Object3D","onRotationChange","onQuaternionChange","renderer","scene","material","group","distance","parent","id","result","force","child","updateParents","updateChildren","bound","serialize","library","element","parameters","shapes","shape","uuids","animation","geometries","extractFromCache","materials","textures","images","skeletons","animations","nodes","cache","values","recursive","_v0$1","_v1$3","_v2$2","_v3$2","_vab","_vac","_vbc","_vap","_vbp","_vcp","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","p3","v3","i0","i1","i2","d4","vc","d5","d6","vb","va","_colorKeywords","_hslA","_hslB","hue2rgb","Color","hex","style","handleAlpha","string","components","_color","hue","saturation","lightness","color1","color2","_materialId","Material","newValue","currentValue","srcPlanes","dstPlanes","copyMaterialUserData","src","skipClone","MeshBasicMaterial","_tables","_generateTables","floatView","uint32View","baseTable","shiftTable","mantissaTable","exponentTable","offsetTable","toHalfFloat","val","fromHalfFloat","DataUtils","_vector$9","_vector2$1","BufferAttribute","itemSize","normalized","start","index1","index2","component","Int8BufferAttribute","Uint8BufferAttribute","Uint8ClampedBufferAttribute","Int16BufferAttribute","Uint16BufferAttribute","Int32BufferAttribute","Uint32BufferAttribute","Float16BufferAttribute","Float32BufferAttribute","_id$2","_m1$2","_obj","_offset","_box$2","_boxMorphTargets","_vector$8","BufferGeometry","materialIndex","normalMatrix","tangent","targetOffset","morphAttributesPosition","morphAttribute","morphTargetsRelative","jl","attributes","normalAttribute","uvAttribute","tangentAttribute","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","groups","tmp2","n2","handleVertex","pA","pB","pC","nA","nB","nC","cb","ab","normals","convertBufferAttribute","indices","array2","geometry2","newAttribute","morphAttributes","morphArray","hasMorphAttributes","attributeArray","boundingSphere","boundingBox","_inverseMatrix$3","_ray$3","_sphere$6","_sphereHitAt","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_uvA$1","_uvB$1","_uvC$1","_normalA","_normalB","_normalC","_intersectionPoint","_intersectionPointWorld","Mesh","keys","ml","morphPosition","morphInfluences","influence","raycaster","intersects","matrixWorld","rayLocalSpace","intersection","uv1","drawRange","groupMaterial","end","checkGeometryIntersection","checkIntersection","intersect","face","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","uvs","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","iy","ix","cloneUniforms","property","mergeUniforms","uniforms","merged","cloneUniformsGroups","getUnlitUniformColorSpace","currentRenderTarget","UniformsUtils","default_vertex","default_fragment","ShaderMaterial","extensions","Camera","_v3$1","_minTarget","_maxTarget","PerspectiveCamera","fov","aspect","focalLength","vExtentSlope","minTarget","maxTarget","fullWidth","fullHeight","view","skew","CubeCamera","renderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","cameras","activeMipmapLevel","currentActiveCubeFace","currentActiveMipmapLevel","currentXrEnabled","generateMipmaps","CubeTexture","WebGLCubeRenderTarget","shader","mesh","currentMinFilter","stencil","_vector1","_vector2","_normalMatrix","Plane","constant","inverseNormalLength","line","startSign","endSign","optionalNormalMatrix","referencePoint","_sphere$5","_vector$7","Frustum","p4","p5","planes","frustum","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","sprite","negRadius","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","time","frame","WebGLAttributes","gl","buffers","createBuffer","bufferType","usage","updateBuffer","updateRange","updateRanges","get","remove","cached","PlaneGeometry","width_half","height_half","segment_width","segment_height","alphahash_fragment","alphahash_pars_fragment","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","batching_pars_vertex","batching_vertex","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","colorspace_fragment","colorspace_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","envmap_physical_pars_fragment","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphinstance_vertex","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","opaque_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","worldpos_vertex","vertex$h","fragment$h","vertex$g","fragment$g","vertex$f","fragment$f","vertex$e","fragment$e","vertex$d","fragment$d","vertex$c","fragment$c","vertex$b","fragment$b","vertex$a","fragment$a","vertex$9","fragment$9","vertex$8","fragment$8","vertex$7","fragment$7","vertex$6","fragment$6","vertex$5","fragment$5","vertex$4","fragment$4","vertex$3","fragment$3","vertex$2","fragment$2","vertex$1","fragment$1","ShaderChunk","UniformsLib","ShaderLib","_rgb","_e1$1","_m1$1","_m2","WebGLBackground","cubemaps","cubeuvmaps","state","objects","premultipliedAlpha","clearColor","clearAlpha","planeMesh","boxMesh","currentBackground","currentBackgroundVersion","currentTonemapping","render","renderList","forceClear","background","backgroundColor","isEnvironment","setClear","environmentBlendMode","backgroundVersion","WebGLBindingStates","maxVertexAttributes","bindingStates","defaultState","createBindingState","currentState","forceUpdate","setup","program","updateBuffers","getBindingState","bindVertexArrayObject","needsUpdate","saveCache","setupVertexAttributes","createVertexArrayObject","vao","deleteVertexArrayObject","wireframe","programMap","stateMap","newAttributes","enabledAttributes","attributeDivisors","cachedAttributes","geometryAttributes","attributesNum","programAttributes","cachedAttribute","geometryAttribute","initAttributes","enableAttribute","enableAttributeAndDivisor","meshPerAttribute","disableUnusedAttributes","vertexAttribPointer","stride","integer","materialDefaultAttributeValues","programAttribute","bytesPerElement","dispose","reset","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","resetDefaultState","WebGLBufferRenderer","info","mode","setMode","renderInstances","primcount","renderMultiDraw","starts","counts","drawCount","extension","elementCount","WebGLCapabilities","maxAnisotropy","getMaxAnisotropy","getMaxPrecision","precision","maxPrecision","logarithmicDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","maxSamples","WebGLClipping","properties","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","enableLocalClipping","enabled","projectPlanes","useCache","clipIntersection","clipShadows","materialProperties","resetGlobalState","nGlobal","lGlobal","dstArray","skipTransform","nPlanes","flatSize","viewMatrix","i4","WebGLCubeMaps","mapTextureMapping","cubemap","onTextureDispose","OrthographicCamera","scaleW","scaleH","LOD_MIN","EXTRA_LOD_SIGMA","MAX_SAMPLES","_flatCamera","_clearColor","_oldTarget","_oldActiveCubeFace","_oldActiveMipmapLevel","_oldXrEnabled","PHI","INV_PHI","_axisDirections","PMREMGenerator","sigma","cubeUVRenderTarget","equirectangular","_getCubemapMaterial","_getEquirectMaterial","cubeSize","outputTarget","_setViewport","params","_createRenderTarget","_lodMax","_createPlanes","_getBlurShader","tmpMesh","cubeCamera","upSign","forwardSign","originalAutoClear","toneMapping","backgroundMaterial","backgroundBox","useSolidColor","col","isCubeTexture","autoClear","poleAxis","lodIn","lodOut","pingPongRenderTarget","targetIn","targetOut","sigmaRadians","blurMaterial","STANDARD_DEVIATIONS","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","samples","weights","sum","weight","outputSize","lodMax","lodPlanes","sizeLods","sigmas","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","faceIndex","coordinates","fill","_getCommonVertexShader","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","isEquirectMap","isCubeMap","currentPMREMVersion","isCubeTextureComplete","cubemapUV","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryIndex","geometryPosition","version","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","setIndex","WebGLInfo","memory","instanceCount","WebGLMorphtargets","capabilities","morphTextures","morph","objectInfluences","morphTargetsCount","entry","disposeTexture","hasMorphPosition","hasMorphNormals","hasMorphColors","morphTargets","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphTarget","morphNormal","morphColor","morphInfluencesSum","morphBaseInfluence","WebGLObjects","updateMap","buffergeometry","onInstancedMeshDispose","skeleton","instancedMesh","DepthTexture","emptyTexture","emptyShadowTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","copyArray","allocTexUnits","setValueV1f","setValueV2f","setValueV3f","setValueV4f","setValueM2","elements","setValueM3","setValueM4","setValueV1i","setValueV2i","setValueV3i","setValueV4i","setValueV1ui","setValueV2ui","setValueV3ui","setValueV4ui","setValueT1","unit","emptyTexture2D","setValueT3D1","setValueT6","setValueT2DArray1","getSingularSetter","setValueV1fArray","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","getPureArraySetter","SingleUniform","activeInfo","addr","PureArrayUniform","StructuredUniform","seq","RePathPart","addUniform","container","uniformObject","parseUniform","path","pathLength","match","matchEnd","idIsIndex","subscript","next","WebGLUniforms","WebGLShader","COMPLETION_STATUS_KHR","programIdCount","handleSource","errorLine","lines","lines2","from","to","getEncodingComponents","workingPrimaries","encodingPrimaries","gamutMapping","getShaderErrors","status","errors","errorMatches","getTexelDecodingFunction","functionName","fn","getTexelEncodingFunction","getToneMappingFunction","toneMappingName","generateVertexExtensions","filterEmptyLine","generateDefines","defines","chunks","fetchAttributeLocations","locationSize","replaceLightNums","numSpotLightCoords","replaceClippingPlaneNums","includePattern","resolveIncludes","includeReplacer","shaderChunkMap","include","newInclude","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","generateShadowMapTypeDefine","shadowMapTypeDefine","generateEnvMapTypeDefine","envMapTypeDefine","generateEnvMapModeDefine","envMapModeDefine","generateEnvMapBlendingDefine","envMapBlendingDefine","generateCubeUVSize","imageHeight","maxMip","texelHeight","WebGLProgram","cacheKey","vertexShader","fragmentShader","envMapCubeUVSize","customVertexExtensions","customDefines","prefixVertex","prefixFragment","versionString","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","onFirstUse","self","programLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","cachedUniforms","programReady","_id$1","WebGLShaderCache","vertexShaderStage","fragmentShaderStage","materialShaders","shaderStage","set","code","stage","WebGLShaderStage","WebGLPrograms","clipping","_programLayers","_customShaders","_activeChannels","programs","SUPPORTS_VERTEX_TEXTURES","shaderIDs","getChannel","getParameters","lights","shadows","fog","environment","envMap","envMapCubeUVHeight","shaderID","morphTextureStride","customVertexShaderID","customFragmentShaderID","transmissionRenderTarget","IS_INSTANCEDMESH","IS_BATCHEDMESH","HAS_MAP","HAS_MATCAP","HAS_ENVMAP","HAS_AOMAP","HAS_LIGHTMAP","HAS_BUMPMAP","HAS_NORMALMAP","HAS_DISPLACEMENTMAP","HAS_EMISSIVEMAP","HAS_METALNESSMAP","HAS_ROUGHNESSMAP","HAS_ANISOTROPY","HAS_CLEARCOAT","HAS_IRIDESCENCE","HAS_SHEEN","HAS_TRANSMISSION","HAS_ANISOTROPYMAP","HAS_CLEARCOATMAP","HAS_CLEARCOAT_NORMALMAP","HAS_CLEARCOAT_ROUGHNESSMAP","HAS_IRIDESCENCEMAP","HAS_IRIDESCENCE_THICKNESSMAP","HAS_SHEEN_COLORMAP","HAS_SHEEN_ROUGHNESSMAP","HAS_SPECULARMAP","HAS_SPECULAR_COLORMAP","HAS_SPECULAR_INTENSITYMAP","HAS_TRANSMISSIONMAP","HAS_THICKNESSMAP","HAS_GRADIENTMAP","HAS_ALPHAMAP","HAS_ALPHATEST","HAS_ALPHAHASH","HAS_EXTENSIONS","getProgramCacheKey","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","getUniforms","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","map","painterSortStable","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","transmissive","transparent","init","getNextRenderItem","groupOrder","renderItem","push","unshift","sort","customOpaqueSort","customTransparentSort","finish","WebGLRenderLists","lists","renderCallDepth","listArray","list","UniformsCache","light","ShadowUniformsCache","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","vector3","matrix42","useLegacyLights","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","numSpotShadowsWithMaps","numLightProbes","scaleFactor","intensity","shadowMap","shadow","shadowUniforms","hash","setupView","WebGLRenderState","lightsArray","shadowsArray","pushLight","pushShadow","shadowLight","setupLights","setupLightsView","WebGLRenderStates","renderStates","renderStateArray","renderState","MeshDepthMaterial","MeshDistanceMaterial","vertex","fragment","WebGLShadowMap","_renderer","_objects","_capabilities","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowSide","shadowMaterialVertical","shadowMaterialHorizontal","fullScreenTri","fullScreenMesh","_previousType","activeCubeFace","_state","toVSM","fromVSM","shadowFrameExtents","pars","viewportCount","vp","viewport","renderObject","VSMPass","getDepthMaterial","customMaterial","keyA","keyB","materialsForVariant","cachedMaterial","onMaterialDispose","shadowCamera","k","kl","depthMaterial","uuid","WebGLState","ColorBuffer","locked","currentColorMask","currentColorClear","colorMask","lock","DepthBuffer","currentDepthMask","currentDepthFunc","currentDepthClear","depthTest","enable","disable","depthMask","depthFunc","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","stencilFunc","stencilRef","stencilFail","stencilZFail","stencilZPass","colorBuffer","depthBuffer","stencilBuffer","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentBlendColor","currentBlendAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","dimensions","emptyTextures","setFlipSided","setCullFace","setBlending","bindFramebuffer","framebuffer","drawBuffers","useProgram","equationToGL","factorToGL","blending","blendEquation","blendSrc","blendDst","blendEquationAlpha","blendSrcAlpha","blendDstAlpha","blendColor","blendAlpha","setMaterial","frontFaceCW","flipSided","stencilWrite","setPolygonOffset","cullFace","setLineWidth","polygonOffset","factor","setScissorTest","scissorTest","activeTexture","webglSlot","bindTexture","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","error","compressedTexImage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","texStorage2D","texStorage3D","texImage2D","texImage3D","scissor","updateUBOMapping","uniformsGroup","blockIndex","uniformBlockBinding","WebGLTextures","_gl","utils","multisampledRTTExt","supportsInvalidateFramebuffer","_imageDimensions","_videoTextures","_sources","useOffscreenCanvas","createCanvas","resizeImage","needsNewCanvas","maxSize","getDimensions","textureNeedsGenerateMipmaps","generateMipmap","getInternalFormat","internalFormatName","glFormat","glType","forceLinearTransfer","internalFormat","transfer","getMipLevels","deallocateTexture","onRenderTargetDispose","deallocateRenderTarget","textureProperties","webglTextures","deleteTexture","renderTargetProperties","level","attachmentProperties","textureUnits","resetTextureUnits","allocateTextureUnit","textureUnit","getTextureCacheKey","setTexture2D","slot","updateVideoTexture","uploadTexture","setTexture2DArray","setTexture3D","setTextureCube","uploadCubeTexture","wrappingToGL","filterToGL","compareToGL","setTextureParameters","textureType","initTexture","forceUpload","textureCacheKey","sourceProperties","texturePrimaries","unpackConversion","verifyColorSpace","glInternalFormat","mipmap","mipmaps","useTexStorage","allocateMemory","dataReady","levels","isCompressed","isDataTexture","cubeImage","mipmapImage","setupFrameBufferTexture","attachment","textureTarget","useMultisampledRTT","getRenderTargetSamples","setupRenderBufferStorage","renderbuffer","isMultisample","depthTexture","setupDepthTexture","webglDepthTexture","setupDepthRenderbuffer","isCube","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","glTextureType","updateRenderTargetMipmap","updateMultisampleRenderTarget","mask","invalidationArray","depthStyle","ignoreDepthValues","WebGLUtils","convert","ArrayCamera","Group","_moveEvent","WebXRController","inputSource","hand","inputjoint","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","jointPose","joint","indexTip","thumbTip","distanceToPinch","threshold","_occlusion_vertex","_occlusion_fragment","WebXRDepthSensing","depthData","texProps","cameraXR","WebXRManager","session","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","depthSensing","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","currentSize","currentPixelRatio","cameraL","cameraR","_currentDepthNear","_currentDepthFar","controller","onSessionEvent","controllerIndex","onSessionEnd","onInputSourcesChange","space","layerInit","depthFormat","depthType","glDepthFormat","projectionlayerInit","cameraLPos","cameraRPos","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","updateCamera","updateUserCamera","onAnimationFrameCallback","views","cameraXRNeedsUpdate","glSubImage","enabledFeatures","_e1","_m1","WebGLMaterials","refreshTransformUniform","refreshFogUniforms","refreshMaterialUniforms","pixelRatio","refreshUniformsCommon","refreshUniformsToon","refreshUniformsPhong","refreshUniformsStandard","refreshUniformsPhysical","refreshUniformsMatcap","refreshUniformsDistance","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsSprites","envMapRotation","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","bind","webglProgram","prepareUniformsGroup","onUniformsGroupsDispose","updateBufferData","bindingPointIndex","allocateBindingPointIndex","uniformArray","hasUniformChanged","arrayOffset","getUniformSize","indexArray","indexString","cachedObject","chunkSize","chunkOffsetUniform","chunkOffset","WebGLRenderer","antialias","preserveDrawingBuffer","powerPreference","failIfMajorPerformanceCaveat","_alpha","uintClearColor","intClearColor","currentRenderList","currentRenderState","renderListStack","renderStateStack","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_currentClearColor","_currentClearAlpha","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_projScreenMatrix","_vector3","_emptyScene","getTargetPixelRatio","getContext","contextName","contextAttributes","onContextLost","onContextRestore","onContextCreationError","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","uniformsGroups","initGLContext","xr","updateStyle","boolean","method","bits","isIntegerFormat","targetFormat","targetType","isUnsignedType","onXRSessionStart","onXRSessionEnd","infoAutoReset","shadowMapEnabled","shadowMapAutoUpdate","shadowMapNeedsUpdate","shadowMapType","deallocateMaterial","releaseMaterialProgramReferences","setProgram","rangeFactor","drawStart","drawEnd","lineWidth","maxInstanceCount","prepareMaterial","getProgram","targetScene","material2","resolve","checkMaterialsReady","projectObject","camera2","renderScene","sortObjects","opaqueObjects","transmissiveObjects","transparentObjects","renderTransmissionPass","renderObjects","isWebGL2","currentToneMapping","renderTargetNeedsUpdate","currentSide","temp","overrideMaterial","lightsStateVersion","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","getUniformList","progUniforms","vertexAlphas","vertexTangents","needsProgramChange","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","markUniformsLightsNeedsUpdate","extraUniformsToUpload","defaultFramebuffer","useDefaultFramebuffer","isRenderTarget3D","__webglFramebuffer","layer","activeCubeFaceIndex","textureIndex","textureFormat","halfFloatSupportedByExt","levelScale","srcTexture","dstTexture","sourceBox","glTarget","unpackRowLen","unpackImageHeight","unpackSkipPixels","unpackSkipRows","unpackSkipImages","FogExp2","density","Fog","Scene","InterleavedBuffer","ib","_vector$6","InterleavedBufferAttribute","interleavedBuffer","SpriteMaterial","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_v1$2","_v2$1","LOD","hysteresis","levelDistance","_basePosition","_skinIndex","_skinWeight","_matrix4","_vertex","_sphere$4","_inverseMatrix$2","_ray$2","SkinnedMesh","bindMatrix","skinWeight","boneIndex","Bone","DataTexture","_offsetMatrix","_identityMatrix$1","Skeleton","bones","boneInverses","inverse","bone","boneMatrices","boneTexture","json","boneInverse","InstancedBufferAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_box3","_identity","_mesh$1","_sphere$3","InstancedMesh","dataIndex","raycastTimes","instanceId","sortOpaque","sortTransparent","MultiDrawRenderList","pool","item","ID_ATTR_NAME","_matrix$1","_invMatrixWorld","_identityMatrix","_projScreenMatrix$2","_box$1","_sphere$2","_vector$5","_renderList","_mesh","_batchIntersects","copyAttributeData","vertexCount","BatchedMesh","maxGeometryCount","maxVertexCount","maxIndexCount","matricesArray","matricesTexture","reference","attributeName","srcAttribute","dstAttribute","idArray","batchGeometry","func","geometryCount","active","indexCount","reservedRange","lastRange","reservedRanges","drawRanges","bounds","hasIndex","visibility","idAttribute","dstIndex","srcIndex","vertexStart","indexStart","posAttr","iv","multiDrawStarts","multiDrawCounts","perObjectFrustumCulled","culled","customSort","LineBasicMaterial","_start$1","_end$1","_inverseMatrix$1","_ray$1","_sphere$1","Line","lineDistances","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","_start","_end","LineSegments","LineLoop","PointsMaterial","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","VideoTexture","video","updateVideo","FramebufferTexture","CompressedTexture","CompressedArrayTexture","CompressedCubeTexture","CanvasTexture","Curve","optionalTarget","divisions","lengths","current","last","arcLengths","targetArcLength","comparison","lengthBefore","segmentLength","segmentFraction","t2","pt1","pt2","segments","closed","tangents","binormals","vec","mat","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","CubicPoly","c0","x3","tension","dt0","dt1","dt2","t3","px","py","pz","CatmullRomCurve3","curveType","intPoint","pow","CatmullRom","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","QuadraticBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezier","CubicBezierCurve","CubicBezierCurve3","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","Curves","CurvePath","curve","startPoint","endPoint","lineType","curveLengths","diff","lens","sums","curves","resolution","pts","Path","aCPx","aCPy","aCP1x","aCP1y","aCP2x","aCP2y","npts","firstPoint","lastPoint","LatheGeometry","phiStart","phiLength","initNormals","inverseSegments","curNormal","prevNormal","base","CapsuleGeometry","capSegments","radialSegments","CircleGeometry","thetaStart","thetaLength","segment","CylinderGeometry","radiusTop","radiusBottom","openEnded","halfHeight","generateTorso","generateCap","slope","indexRow","sinTheta","cosTheta","centerIndexStart","centerIndexEnd","ConeGeometry","PolyhedronGeometry","detail","vertexBuffer","uvBuffer","subdivide","applyRadius","generateUVs","getVertexByIndex","subdivideFace","cols","aj","bj","rows","pushVertex","azimuth","inclination","correctUVs","correctSeam","centroid","azi","correctUV","DodecahedronGeometry","_v0","_v1$1","_normal","_triangle","EdgesGeometry","thresholdAngle","thresholdDot","indexAttr","positionAttr","indexArr","vertKeys","hashes","edgeData","jNext","vecHash0","vecHash1","reverseHash","index0","Shape","holesPts","hole","Earcut","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","minX","minY","maxX","maxY","invSize","eliminateHoles","earcutLinked","clockwise","signedArea","insertNode","equals","removeNode","filterPoints","again","area","ear","pass","indexCurve","stop","prev","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minZ","zOrder","maxZ","locallyInside","isValidDiagonal","splitPolygon","queue","getLeftmost","compareX","eliminateHole","bridge","findHoleBridge","bridgeReverse","hx","hy","mx","my","tanMin","tan","sectorContainsSector","sortLinked","tail","numMerges","pSize","qSize","inSize","leftmost","intersectsPolygon","middleInside","q1","q2","o1","o2","o3","o4","onSegment","num","inside","Node","an","bp","ShapeUtils","contour","holes","faces","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","verticesArray","uvArray","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","WorldUVGenerator","extrudePts","extrudeByPath","splineTube","binormal","position2","shapePoints","hl","ahole","scalePt2","pt","vlen","flen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","bs","vert","buildLidFaces","buildSideFaces","f3","layeroffset","sidewalls","sl","slen1","slen2","f4","addVertex","nextIndex","addUV","vector2","toJSON$1","geometryShapes","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","IcosahedronGeometry","OctahedronGeometry","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","radiusStep","thetaSegmentLevel","ShapeGeometry","indexOffset","shapeVertices","shapeHoles","shapeHole","toJSON","SphereGeometry","thetaEnd","grid","verticesRow","uOffset","TetrahedronGeometry","TorusGeometry","tube","tubularSegments","arc","TorusKnotGeometry","P1","P2","B","T","N","calculatePositionOnCurve","cu","su","quOverP","cs","TubeGeometry","frames","P","generateBufferData","generateSegment","generateIndices","WireframeGeometry","edges","o","ol","isUniqueEdge","hash1","hash2","Geometries","ShadowMaterial","RawShaderMaterial","MeshStandardMaterial","MeshPhysicalMaterial","reflectivity","MeshPhongMaterial","MeshToonMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshMatcapMaterial","LineDashedMaterial","convertArray","forceClone","isTypedArray","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","subclip","sourceClip","startFrame","endFrame","fps","clip","tracks","track","valueSize","minStartTime","makeClipAdditive","targetClip","referenceFrame","referenceClip","numTracks","referenceTime","referenceTrack","referenceTrackType","targetTrack","referenceOffset","referenceValueSize","targetValueSize","lastIndex","referenceValue","startIndex","endIndex","interpolant","numTimes","valueStart","valueEnd","AnimationUtils","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","t1global","mid","CubicInterpolant","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","trackType","factoryMethod","timeOffset","timeScale","startTime","endTime","nKeys","valid","prevTime","currTime","smoothInterpolation","writeIndex","keep","timeNext","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","blendMode","jsonTracks","frameTime","parseKeyframeTrack","clipTracks","morphTargetSequence","noLoop","numMorphTargets","objectOrClipArray","clipArray","animationToMorphTargets","pattern","parts","animationMorphTargets","clips","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","file","LoadingManager","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","handlers","transform","regex","loader","DefaultLoadingManager","Loader","manager","reject","crossOrigin","resourcePath","requestHeader","loading","HttpError","response","FileLoader","req","mimeType","responseType","callbacks","reader","contentLength","total","lengthComputable","loaded","stream","readData","done","text","exec","label","decoder","err","AnimationLoader","CompressedTextureLoader","loadTexture","texDatas","ImageLoader","origUrl","onImageLoad","removeEventListeners","onImageError","cachedBlob","fileLoader","blob","CubeTextureLoader","urls","DataTextureLoader","texData","TextureLoader","Light","HemisphereLight","skyColor","groundColor","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","shadowMatrix","viewportIndex","SpotLightShadow","SpotLight","penumbra","decay","power","_lightPositionWorld","_lookTarget","PointLightShadow","PointLight","DirectionalLightShadow","DirectionalLight","AmbientLight","RectAreaLight","SphericalHarmonics3","coefficients","coeff","sh","shBasis","LightProbe","MaterialLoader","getTexture","hexColorSpace","normalScale","materialLib","LoaderUtils","InstancedBufferGeometry","BufferGeometryLoader","interleavedBufferMap","arrayBufferMap","getInterleavedBuffer","getArrayBuffer","arrayBuffer","typedArray","bufferAttribute","bufferAttributeConstr","ObjectLoader","metadata","hasImages","bufferGeometryLoader","loadImage","deserializeImage","imageArray","currentUrl","deserializedImage","parseConstant","TEXTURE_MAPPING","TEXTURE_WRAPPING","TEXTURE_FILTER","getGeometry","getMaterial","instanceMatrix","instanceColor","objectAnimations","ImageBitmapLoader","imageBitmap","fetchOptions","promise","res","_context","AudioContext","AudioLoader","bufferCopy","audioBuffer","handleError","_eyeRight","_eyeLeft","_projectionMatrix","StereoCamera","eyeSepHalf","eyeSepOnProjection","ymax","xmin","xmax","Clock","autoStart","now","newTime","_position$1","_quaternion$1","_scale$1","_orientation$1","AudioListener","Audio","audioNode","mediaElement","mediaStream","delay","filter","_position","_quaternion","_scale","_orientation","PositionalAudio","coneInnerAngle","coneOuterAngle","coneOuterGain","panner","AudioAnalyser","audio","fftSize","PropertyMixer","binding","mixFunction","mixFunctionAdditive","setIdentity","accuIndex","currentWeight","mix","weightAdditive","originalValueOffset","targetIndex","workOffset","_RESERVED_CHARS_RE","_reservedRe","_wordChar","_wordCharOrDot","_directoryRe","_nodeRe","_objectRe","_propertyRe","_trackRe","_supportedObjectNames","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","firstValidIndex","bindings","rootNode","root","matches","results","lastDot","objectName","nodeName","searchNodeSubtree","childNode","subTreeNode","targetArray","sourceArray","targetObject","propertyIndex","objectIndex","nodeProperty","versioning","bindingType","AnimationObjectGroup","indicesByUUID","paths","parsedPaths","nBindings","knownObject","nObjects","nCachedObjects","firstActiveIndex","lastCachedObject","bindingsForPath","lastCached","lastCachedIndex","firstActiveObject","firstActive","lastObject","indicesByPath","lastBindingsIndex","lastBindings","lastBindingsPath","AnimationAction","mixer","localRoot","nTracks","interpolants","interpolantSettings","repetitions","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","fadeInAction","weightInterpolant","action","startTimeScale","endTimeScale","timeScaleInterpolant","deltaTime","timeDirection","timeRunning","clipTime","propertyMixers","interpolantValue","loop","loopCount","pingPong","handle_stop","loopDelta","pending","atStart","atEnd","settings","weightNow","weightThen","_controlInterpolantsResultBuffer","AnimationMixer","prototypeAction","rootUuid","bindingsByRoot","bindingsByName","clipUuid","actionsForClip","actions","actionsByClip","knownActions","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","actionByRoot","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","lastActiveInterpolant","optionalRoot","clipObject","existingAction","newAction","nActions","timeInSeconds","actionsToRemove","Uniform","_id","UniformsGroup","uniformsSource","InstancedInterleavedBuffer","GLBufferAttribute","elementSize","_matrix","Raycaster","coords","ascSort","Spherical","other","Cylindrical","Matrix2","_vector$4","Box2","_startP","_startEnd","Line3","clampToLine","startEnd2","_vector$3","SpotLightHelper","positions","coneLength","coneWidth","_vector$2","_boneMatrix","_matrixWorldInv","SkeletonHelper","getBoneList","colors","boneList","PointLightHelper","sphereSize","_vector$1","_color1","_color2","HemisphereLightHelper","GridHelper","PolarGridHelper","sectors","rings","_v1","_v2","_v3","DirectionalLightHelper","_vector","_camera","CameraHelper","pointMap","addLine","addPoint","colorFrustum","colorCone","colorUp","colorTarget","colorCross","cone","cross","colorAttribute","setPoint","_box","BoxHelper","Box3Helper","PlaneHelper","positions2","_axis","_lineGeometry","_coneGeometry","ArrowHelper","headLength","headWidth","AxesHelper","xAxisColor","yAxisColor","zAxisColor","ShapePath","isCCW","toShapesNoHoles","inSubpaths","tmpPath","tmpShape","isPointInsidePolygon","inPolygon","polyLen","edgeLowPt","edgeHighPt","edgeDx","edgeDy","perpEdge","isClockWise","subPaths","solid","holesFirst","betterShapeHoles","newShapes","newShapeHoles","mainIdx","tmpPoints","ambiguous","toChange","sIdx","sLen","sho","hIdx","ho","hole_unassigned","s2Idx","tmpHoles","REVISION","H$1","pe","_","H","ge","M","we","ye","W","ve","V","xe","ke","Ee","Ce","_e","Se","Le","Y","Ae","ze","Ue","K","Oe","J","De","G","X","Ie","Pe","Te","Me","$e","Re","Z","Q","D","Fe","qe","He","Ne","We","Ve","Be","L","Ye","$","A","U","I","Ke","Je","Ge","Xe","Ze","Qe","E","C","je","et","tt","it","ee","nt","rt","R","ot","st","at","ct","lt","ut","ft","ht","F","ie","ne","mt","gt","wt","yt","vt","bt","xt","kt","Et","Ct","_t","St","re","S","oe","se","le","ue","Lt","O","At","getPropDesc","obj","prop","proto","protoDesc","isNonRelativeUrl","simpleCameraHelpers","cameraHelpers","randomHelpers","defaultVertex","defaultFragment","voronoiNoise","shaderUtils","ViewerTimeline","viewer","isEnd","isReset","isStop","_viewer","stepFrame","__decorateClass","uiInput","onChangeDispatchEvent","uiToggle","uiButton","serializable","uiFolderContainer","module","this","GLStatsJS","Stats","_CustomContextMenu","items","show","removeOnSelect","styles","CustomContextMenu","_Dropzone","el","inputEl","files","entries","fileMap","readerCallback","newEntries","Dropzone","_changeEvent","_startEvent","_endEvent","_plane","TILT_LIMIT","OrbitControls","domElement","spherical","onKeyDown","STATE","quat","quatInverse","lastPosition","lastQuaternion","lastTargetPosition","twoPI","lastUpdateTime","rotateLeft","getAutoRotationAngle","sphericalDelta","panOffset","pushDelta","zoomChanged","performCursorZoom","clampDistance","prevRadius","isDamping","newRadius","radiusDelta","dollyDirection","mouseBefore","mouse","prevZoom","mouseAfter","EPS","onContextMenu","onPointerDown","onPointerUp","onMouseWheel","onPointerMove","interceptControlDown","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","pointers","pointerPositions","controlActive","getZoomScale","rotateUp","panLeft","objectMatrix","panUp","pan","deltaX","deltaY","targetDistance","dollyOut","dollyScale","dollyIn","updateZoomParameters","rect","dist","handleMouseDownRotate","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","handleTouchStartRotate","getSecondPointerPosition","handleTouchStartPan","handleTouchStartDolly","handleTouchStartDollyPan","handleTouchStartDollyRotate","handleTouchMoveRotate","handleTouchMovePan","handleTouchMoveDolly","centerX","centerY","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","isTrackingPointer","addPointer","onTouchStart","onMouseDown","onTouchMove","onMouseMove","removePointer","pointerId","mouseAction","customWheelEvent","newEvent","interceptControlUp","trackPointer","OrbitControls3","uiVector","uiPanelContainer","_raycaster","_tempVector","_tempVector2","_tempQuaternion","_unit","_mouseDownEvent","_mouseUpEvent","_objectChangeEvent","TransformControls","_gizmo","TransformControlsGizmo","TransformControlsPlane","defineProperty","propName","defaultValue","propValue","worldPosition","worldPositionStart","worldQuaternion","worldQuaternionStart","cameraPosition","cameraQuaternion","pointStart","pointEnd","rotationAxis","rotationAngle","getPointer","onPointerHover","pointer","intersectObjectWithRay","planeIntersect","isMultiDummy","ROTATION_SPEED","_inPlaneRotation","translationSnap","rotationSnap","scaleSnap","includeInvisible","allIntersections","_tempEuler","_alignVector","_zeroVector","_lookAtMatrix","_tempQuaternion2","_identityQuaternion","_dirVector","_tempMatrix","_unitX","_unitY","_unitZ","gizmoMaterial","gizmoLineMaterial","matInvisible","matHelper","matRed","matGreen","matBlue","matRed2","matGreen2","matBlue2","matRedTransparent","matGreenTransparent","matBlueTransparent","matWhiteTransparent","matYellowTransparent","matGray","arrowGeometry","scaleHandleGeometry","lineGeometry","lineGeometry2","CircleGeometry2","TranslateHelperGeometry","gizmoTranslate","pickerTranslate","helperTranslate","gizmoRotate","helperRotate","pickerRotate","gizmoScale","pickerScale","helperScale","setupGizmo","gizmoMap","gizmo","tag","tempGeometry","handles","handle","isMultiDummy2","_vec1","_vec2","calculateOffset","clickPoint","rayStart","rayDir","e1","e2","e3","decomposeIntoBasis","_mL0","_mW0","_mP","_mPInv","_mW","_mL","_mL0Inv","_mdL","_rotMatrix","_scaleMatrix","_pointer","_worldPos","_camPos","_posNew","_intersection","_upV","_xDir","_yDir","_zDir","_PivotControls","worldPos","axisLabels","deg","OC","makeMat","opacity","makePickerMat","dirs","pMat","shaftGeom","shaft","coneGeom","pickerGeom","picker","sliderDefs","planeSize","planeGeom","d1n","d2n","pos","basis","rotatorDefs","torusGeom","torus","sphereGeom","vis","pairs","objectWorldPos","cam","deltaWorld","newHover","_event","rotSpeed","mPLG","mPLGInv","limits","snap","ox","oy","limX","limY","da","snapRad","offsetW","upscale","isUniform","mdW","PivotControls","_lookDirection","_spherical","FirstPersonControls2","heightDelta","actualMoveSpeed","actualLookSpeed","verticalLookRatio","_euler","_lockEvent","_unlockEvent","_PI_2","PointerLockControls2","_zee","_q0","_q2","DeviceOrientationControls2","device","beta","gamma","orient","mTime","uiSlider","offset2","targetDeltaX","targetDeltaY","targetDeltaZ","targetDelta","panOffset2","scaleOffset","upVec","OrbitControls2","sup","ret","_Box3B","ignoreInvisible","ignoreObject","vertexScreenSpace","Box3B","computeScreenSpaceBoundingBox","oo","box2","vertexScreenSpaced","overrideThreeCache","storage","threeCache","oldCache","dataTextureFromColor","dataTexture","dataTextureFromVec4","halfFloatToRgbe","channels","propKey","thisTarget","onChange","cUniforms","cPropKey","isThis","targetPrototype","propertyKey","descriptor","getUniform","uniforms1","propKey1","newVal","safeSetProperty","FnCaller","objectHasOwn","matDefine","thisMat","processVal","invProcessVal","cDefines","getTarget","matDefineBool","deleteOnFalse","bindToValue","onChangeParams","allowUndefined","getOrCall","oc","getTexelDecoding","mapName","computeMikkTSpaceTangents","MikkTSpace","negateSign","getAttributeArray","mergeGeometries","useGroups","isIndexed","attributesUsed","morphAttributesUsed","mergedGeometry","attributesCount","mergedIndex","mergedAttribute","mergeAttributes","morphAttributesToMerge","mergedMorphAttribute","TypedArray","gpuType","arrayLength","tupleOffset","deepCloneAttribute","deinterleaveAttribute","interleaveAttributes","getters","setters","iba","cons","deinterleaveGeometry","attrMap","attr","estimateBytesUsed","mem","mergeVertices","tolerance","doHash","hashToIndex","attributeNames","tmpAttributes","tmpMorphAttributes","newIndices","morphAttr","halfTolerance","exponent","hashMultiplier","hashAdditive","newarray","newMorphArrays","getterFunc","setterFunc","tmpAttribute","tmpMorphAttribute","toTrianglesDrawMode","drawMode","numberOfTriangles","newGeometry","computeMorphedAttributes","_tempB","_tempC","_morphB","_morphC","_calculateMorphedAttributeData","modifiedAttributeArray","modifiedPosition","modifiedNormal","morphedPositionAttribute","morphedNormalAttribute","mergeGroups","groupLength","currentGroup","toCreasedNormals","creaseAngle","creaseDot","verts","tempVec1","tempVec2","tempNorm","tempNorm2","hashVertex","resultGeometry","vertexMap","i3","normalArray","normAttr","otherNormals","lk","otherNorm","mergeBufferGeometries","mergeBufferAttributes","toIndexedGeometry","isInScene","sceneObj","inScene","ob","worldToLocalQuaternion","_q","localToWorldQuaternion","checkTexMapReference","maps","deep","deepAccessObject","getTextureDataType","halfFloatSupport","floatSupport","textureDataToImageData","imgData","outData","isFloat32","isUint16","textureToCanvas","maxWidth","flipY","img","texImageToCanvas","ctx","needsFlipY","tempCanvas","tempCtx","canvasFlipY","textureToDataUrl","quality","textureToBlob","textureDataType","depthPackingStrategies","makeMapping","threeConstMappings","whiteImageData","whiteTexture","_ObjectPicker","_a","selectionCondition","newSelection","idx","selectedObject","record","currentIntersects","currentElement","newElement","_record","uniqueIds","intersects2","intersect1","ObjectPicker","autoGPUInstanceMeshes","matOrGeom","meshes","getKey","keyMeshMap","mesh1","iMeshes","baseMesh","inst","ud","copyObject3DUserData","translationAttr","rotationAttr","scaleAttr","HorizontalBlurShader","VerticalBlurShader","HVBlurHelper","tempTarget","amountMultiplier","snapObject","camOffset","oldVisible","bbox","bboxSize","MaterialPreviewGenerator","hemisphericLight","envIntensity","LineSegmentsGeometry","lineSegments","instanceBuffer","instanceColorBuffer","LineMaterial","_start4","_end4","_ssOrigin","_ssOrigin3","_mvMatrix","_line","_closestPoint","_clipToWorldVector","_lineWidth","getWorldSpaceHalfWidth","raycastWorldUnits","instanceStart","instanceEnd","segmentCount","pointOnLine","raycastScreenSpace","projectionMatrix","deltaDist","param","zPos","isInClipSpace","isInside","LineSegments2","instanceDistanceBuffer","worldUnits","sphereMargin","distanceToSphere","boxMargin","distanceToBox","POS_X","POS_Y","POS_Z","NEG_X","NEG_Y","NEG_Z","axesColors","clock","targetPosition","targetQuaternion","turnRate","dummy","ViewHelper2","placement","getBackgroundSphere","getAxesLines","getAxesSpritePoints","getDomContainer","resetSprites","getIntersectionObject","fromCamera","updateSpritesOpacity","setRadius","orientation","prepareAnimationData","div","isPositive","getSpriteMaterial","padding","padding2","focusPoint","prepareQuaternions","updatePointer","domRect","orthoCamera","intersectionObjects","sprites","_CurvePath3","Serialization","CurvePath3","getFittingDistance","cameraZ","fovh","copier","_ThreeSerialization","cls","isType","props","priority","constructor","hasRootPath","meta2","dat","imageOnLoad","sources","objTextures","tempTextures","propList","ser","userData","serializeMaterialUserData","finalCopy","resource","template","texs","tex","renderManager","ThreeSerialization","copyUserData","ignoredKeysInRoot","convertArrayBufferToStringsInMeta","arrayBufferToBase64","convertStringsToArrayBuffersInMeta","dataUriMatch","base64ToArrayBuffer","getEmptyMeta","MetaImporter","extraResources","resources","metaFromResources","assetImporter","objLoader","acc","cur","key1","newTex","textures2","inpTexture","jsonMats","importer","usePreviewImages","pms","hasImage","source2","metaToResources","mergeResources","jsonToBlob","serializeTextureInExtras","mime","getPartialProps","props1","sProps","sProp","res2","setPartialProps","tar","tarkey","tar2","warnEnabled","errorStr1","shaderReplaceString","str","newStr","replaceAll","prepend","append","_str","warn","isStr","getPaddedArrayBuffer","paddingByte","paddedLength","getPaddedBufferSize","bufferSize","GLB_HEADER_BYTES","GLB_HEADER_MAGIC","GLB_VERSION","GLB_CHUNK_PREFIX_BYTES","GLB_CHUNK_TYPE_JSON","GLB_CHUNK_TYPE_BIN","makeGLBFile","binaryChunk","binaryChunkPrefix","buffer1","jsonChunk","jsonChunkPrefix","header","headerView","totalByteLength","glbBlob","__rest","invariant","safeMin","minDuration","maxDuration","minDamping","maxDamping","findSpring","bounce","velocity","mass","envelope","derivative","dampingRatio","undampedFreq","exponentialDecay","calcAngularFreq","initialGuess","approximateRoot","stiffness","rootIterations","durationKeys","physicsKeys","isSpringType","getSpringOptions","springOptions","derived","spring","restSpeed","restDelta","damping","isResolvedFromDuration","resolveSpring","zero","resolveVelocity","createSpring","initialVelocity","initialDelta","undampedAngularFreq","angularFreq","dampedAngularFreq","freqForT","currentVelocity","isBelowVelocityThreshold","isBelowDisplacementThreshold","progress","toFromDifference","sanitize","floatRegex","colorRegex","singleColorRegex","isString","number","createUnitType","percent","isColorString","testProp","splitColor","aName","bName","cName","hsla","alpha$1","clampRgbUnit","rgbUnit","rgba","red","green","blue","parseHex","colorToken","numberToken","test","_b","_c","_d","analyse","numColors","numbers","parse","createTransformer","tokenised","numValues","convertNumbersToZero","getAnimatableNone","parsed","complex","hueToRgb","hslaToRgba","mixLinearColor","fromExpo","toExpo","colorTypes","getColorType","mixColor","fromColorType","toColorType","fromColor","toColor","blended","isNum","combineFunctions","pipe","transformers","getMixer","mixComplex","mixArray","blendValue","fromThis","mixObject","numNumbers","numRGB","numHSL","originStats","targetStats","mixNumber","detectMixerFactory","createMixers","ease","customMixer","mixers","mixerFactory","numMixers","easingFunction","fastInterpolate","slowInterpolate","input","inputLength","lastInputIndex","mixerIndex","foundMixerIndex","progressInRange","interpolate","isClamp","interpolator","reverseEasing","easing","mirrorEasing","createExpoIn","createBackIn","createAnticipate","backEasing","DEFAULT_OVERSHOOT_STRENGTH","BOUNCE_FIRST_THRESHOLD","BOUNCE_SECOND_THRESHOLD","BOUNCE_THIRD_THRESHOLD","linear","easeIn","easeOut","easeInOut","circIn","circOut","circInOut","backIn","backOut","backInOut","anticipate","ca","cc","bounceOut","bounceIn","bounceInOut","defaultEasing","defaultOffset","_value","convertOffsetToTimes","keyframes","createInterpolator","timeConstant","modifyTarget","amplitude","ideal","types","detectAnimationFromOptions","config","defaultTimestep","getCurrentTime","onNextFrame","createRenderStep","runNextFrame","toRun","toRunNextFrame","numToRun","isProcessing","flushNextFrame","toKeepAlive","keepAlive","immediate","addToCurrentFrame","frameData","maxElapsed","useDefaultElapsed","stepsOrder","sync","process","startLoop","cancelSync","processStep","stepId","processFrame","timestamp","loopElapsed","elapsed","reverseElapsed","isForwardPlayback","hasRepeatDelayElapsed","framesync","passTimestamp","animate","autoplay","driver","repeatMax","repeatType","repeatDelay","onPlay","onStop","onComplete","onRepeat","onUpdate","driverControls","repeatCount","computedDuration","latest","isComplete","interpolateFromNumber","animator","repeat","complete","play","easeInOutSine","EasingFunctions","makeSetterFor","setDirty","dirty","isBool","animateTarget","forceCurrent","setter","fromVal","timeout","animateAsync","end2","lerpAngle","animateKeyframes","canComplete","running","sphericalFromCameraView","animateCameraToViewSpherical","final","animateCameraToViewLinear","lerpVal","lerpNumber","lerpVector","valA","endA","fromA","newValA","lerpTexture","val1","needsInit","anyTex","lerpParams","interpolateProps","time2","vRGBMToLinear","maxRange","cRGBMToLinear","vLinearToRGBM","maxRGB","cLinearToRGBM","isSafari","_CanvasSnapshot","displayPixelRatio","destCanvas","destCtx","doClone","clone","imgUrl","filename","suffix","fname","filePrefix","tileRows","tileCols","ext","CanvasSnapshot","viewerOptions","extractAnimationKey","extraGetters","onChange1","getterType","getterName","AnimationObject","generateValueConfig","generateUiConfig","data1","lastValues","offsetTime","offsets","newDuration","newDelay","newValues","newOffsets","redo","undo","oldValue","fromChild","pop","uiDropdown","defaultObjectProcessor","viewerF","mats","addModelProcess","autoCenter","centerGeometries","centerGeometriesKeepPosition","autoScale","autoScaleRadius","license","centerAllGeometries","keepPosition","geoms","undos","DataUrlLoader","blobToDataURL","onOpsChange","ev","TextSVGOptions","ops","fontFormatExtensionMap","buildTextSvg","svgBackground","yOffset","boxWidth","boxHeight","fontFamily","fontSize","fontWeight","fontStyle","lineHeight","letterSpacing","whiteSpace","maskText","innerShadow","bgFillColor","textColor","textAnchor","fonts","makeTextSvgAdvanced","fontPath","fontExt","parseFileExtension","svg","embedUrlRefs","getAssetData","svgUrl","svgTex","assetLoadOptions1","_AViewerPlugin","prefix","AViewerPlugin","AViewerPluginSync","AViewerPluginAsync","makeICameraCommonUiConfig","iCameraCommons","makeIObject3DUiConfig","isMesh","def","ThreeViewer","rad","objectActionsUiConfig","ui","dict","objectExtensionsUiConfig","incrementObjectCloneName","copyNum","newName","names","iObjectCommons","iGeometryCommons","superDispose","superClone","upgradeGeometry","superCenter","keepWorldPosition","_MaterialExtender","materialExtensions","materialExtension","objectMap","updateMaterialDefines","customMaterialExtensions","exts","materialBeforeRender","materialAfterRender","materialAddToMesh","materialRemovedFromMesh","materialUpdate","MaterialExtender","flag","valF","updater","udVersion","uiConfigMaterialExtension","getUiConfig","uuid1","makeSamplerUi","hidden","oldBitmap","iMaterialUI","downloadBlob","uploadFile","currentJson","threeMaterialPropList","threeMaterialInterpolateProps","_UnlitMaterial","iMaterialCommons","vElement","allowInvalidType","clearCurrentUserData","_internal","UnlitMaterial","MeshBasicMaterial2","superSetValues","_allowInvalidType","legacyColors","lastColorManagementEnabled","copyProps","superDispatchEvent","superOnBeforeCompile","superOnBeforeRender","args","superOnAfterRender","superCustomPropertyCacheKey","upgradeMaterial","materialTextureProperties","materialTexturePropertiesUserData","textureUpdate","newMaps1","newMaps","oldMaps","changed","added","removed","skipOverride","GBufferMatVert","GBufferMatFrag","_ShaderMaterial2","isRawShaderMaterial","_2","ShaderMaterial2","GBufferMaterial","multipleRT","isOverridden","setMap","flags","materialId","DepthNormalMaterial","createLineGBufferMaterial","lineDepthMaterial","lineMaterial","parsFrag","mainFrag","parsVert","mainVert","createLineDepthMaterial","upgradeObject3D","isCentered","compensateSharedGeometry","worldCenter","localCenter","worldMatrixInv","parentWorldMatrixInv","otherMeshPositions","appliedMeshes","visible","widgets","old","currentMaterial","imats","oldMats","currentGeometry","geom","superDispatch","pRoot","rest","cClone","ind","superCopy","lightTarget","selfUserData","superAdd","removeFromParent","object3DTextureProperties","sceneTextureProperties","select","CameraView","zoom","isWoldSpace","onChange3","uiNumber","createCameraPath","splineCurve","spline","getPosition","viewIndex","ip","targets","targetSpline","changeKey","projectionUpdated","_refresh","clearCanvas","distanceFromTarget","upgradeCamera","worldSpace","minDistance","_view","distanceMultiplier","distanceBounds","arr","dMin","dMax","eventOptions","notSupported","_PerspectiveCamera2","controlsMode","autoAspect","elem","controls","ctor","replace","op","refresh","onChange2","PerspectiveCamera2","PerspectiveCamera0","_OrthographicCamera2","frustumSize","OrthographicCamera2","OrthographicCamera0","ExtendedShaderMaterial","textureIds","ids","textureID","_PhysicalMaterial","fElement","PhysicalMaterial","MeshStandardMaterial2","_ObjectShaderMaterial","ObjectShaderMaterial","_UnlitLineMaterial","UnlitLineMaterial","LineBasicMaterial2","_LineMaterial2","uiColor","LineMaterial2","MeshLineMaterial","_LegacyPhongMaterial","LegacyPhongMaterial","Object3D2","Group2","Mesh2","InstancedMesh2","LineGeometry","Line2","MeshLine","MeshLineSegments","BufferGeometry2","LineGeometry2","pairsToPoints","segmentIndex","LineSegmentsGeometry2","WireframeGeometry2","WireframeGeometry3","TubeShapeGeometry","shapeSegments","shapeScale","primary","normal2","fixEdgeNormals","ps","lastI","splits","vCount","splits2","si","split","_EllipseCurve3D","EllipseCurve3D","iLightCommons","upgradeLight","AmbientLight2","that","_DirectionalLight2","change","DirectionalLight2","HemisphereLight2","_PointLight2","PointLight2","RectAreaLight2","_SpotLight2","SpotLight2","upgradeTexture","upgradeWebGLRenderer","renderWithModes","rud","backgroundRender","transparentRender","shadowMapRender","mainRenderPass","opaqueRender","transmissionRender","sceneRender","screenSpaceRendering","setThreeRendererMode","RootScene","objectProcessor","imported","model","addToRoot","newIndex","newIndex2","clear","fromSelf","ignoreWidgets","dist1","env","upgradedOnly","rootObject","centerOffset","uiImage","uiConfig","Pass","FullscreenTriangleGeometry","FullScreenQuad","RenderPass","writeBuffer","readBuffer","maskActive","depthRenderBuffer","oldAutoClear","oldClearAlpha","oldOverrideMaterial","CopyShader","ShaderPass","_ExtendedShaderPass","ExtendedShaderPass","GenericBlendTexturePass","blendFunc","extraFrag","maxIntensity","ExtendedRenderPass","msaa","ViewerRenderManager","composerTarget","needsSwap","useGBufferDepth","gbuffer","renderBufferProps","lastReadBuffer","renderFn","renderToScreen","curClearDepth","renderBufferProps2","curClear","ExtendedCopyPass","respectColorSpace","glsl","GBufferRenderPass","passId","renderToGBuffer","current0","_1","activeMipLevel","tr","ScreenPassShader","ScreenPass","makeScreenShader","baseShader","finalShader","sortPasses","pipeline","optional","dPass","updated","includesAll","afterIndex","beforeIndex","MaskPass","writeValue","clearValue","ClearMaskPass","EffectComposer","passIndex","effectiveWidth","effectiveHeight","EffectComposer2","updateSize","createRenderTargetKey","RenderTargetManager","sizeMultiplier","depthTextureType","depthTextureFormat","textureCount","trackTarget","depthTex","clazz","multiplier","Importer","onCtor","_AssetImporter","logging","simpleCache","itemStart","errorItems","itemEnd","itemError","importers","assetOrPath","onDownloadProgress","isInternal","asset","opts","pathOverride","forceImport","reimportDisposed","fileHandler","importedFile","arrs","allowedExtensions","baseFiles","altFiles","isData","rootPath","rootPathOptions","rootBlob","lc","modifier","normalizedURL","rootUrl","isRoot","iext","escapeRegExp","imime","stro","loaderCacheElement","AssetImporter","fullscreenQuadGeometry","fullscreenQuadMaterial","fullscreenQuad","decompress","_scene","readableTexture","KHR_mesh_quantization_ExtraAttrTypes","GLTFExporter","writer","GLTFLightExtension","GLTFMaterialsUnlitExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsClearcoatExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsSheenExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsBumpExtension","GLTFMeshGpuInstancing","onDone","gltfWriter","GLTFWriter","plugins","WEBGL_CONSTANTS","KHR_MESH_QUANTIZATION","THREE_TO_WEBGL","PATH_PROPERTIES","DEFAULT_SPECULAR_COLOR","equalArray","array1","stringToArrayBuffer","isIdentityMatrix","getMinMax","getCanvas","getToBlobPromise","extensionsUsed","extensionsRequired","extensionsUsedList","extensionsRequiredList","glbReader","base64data","objectDef","extensionName","isRelativeCopy","uids","mapDef","didTransform","transformDef","metalnessMap","roughnessMap","getEncodingConversion","metalness","roughness","composite","componentType","componentSize","byteStride","byteLength","dataView","bufferViewDef","minMax","bufferViewTarget","bufferView","accessorDef","cachedImages","imageDef","bufferViewIndex","dataURL","samplerDef","implTypes","textureDef","materialDef","metalRoughTexture","metalRoughMapDef","baseColorMapDef","emissive","emissiveMapDef","normalMapDef","occlusionMapDef","meshCacheKeyParts","meshCacheKey","meshDef","primitives","nameConversion","originalNormal","modifiedAttribute","accessor","targetNames","reverseDictionary","warned","gltfAttributeName","baseAttribute","relativeAttribute","isMultiMaterial","didForceIndices","primitive","attrType","attrNamePrefix","isOrtho","cameraDef","nodeMap","samplers","trackBinding","trackNode","trackProperty","inputItemSize","outputItemSize","animationDef","node","rootJoint","joints","inverseBindMatrices","temporaryBoneInverse","nodeDef","meshIndex","nodeIndex","sceneDef","objectsWithoutScene","lightDef","GLTFMaterialsUnlitExtension$1","GLTFMaterialsClearcoatExtension$1","extensionDef","clearcoatMapDef","clearcoatRoughnessMapDef","clearcoatNormalMapDef","GLTFMaterialsIridescenceExtension$1","iridescenceMapDef","iridescenceThicknessMapDef","GLTFMaterialsTransmissionExtension$1","transmissionMapDef","GLTFMaterialsVolumeExtension$1","thicknessMapDef","GLTFMaterialsIorExtension$1","GLTFMaterialsSpecularExtension$1","specularIntensityMapDef","specularColorMapDef","GLTFMaterialsSheenExtension$1","sheenRoughnessMapDef","sheenColorMapDef","GLTFMaterialsAnisotropyExtension$1","anisotropyMapDef","GLTFMaterialsEmissiveStrengthExtension$1","GLTFMaterialsBumpExtension$1","bumpMapDef","GLTFMeshGpuInstancing$1","mergedTracks","sourceTracks","sourceTrack","sourceTrackBinding","sourceTrackNode","targetCount","mergedTrack","sourceInterpolant","keyframeIndex","GLTFWriter2","ud2","defIndex","defaultDef","srcData","processed","uri","basePath","_GLTFLightExtrasExtension","GLTFLightExtrasExtension","_GLTFMaterialExtrasExtension","loadConfigResources","parser","scenes","resExt","assetVersion","matDef","setFlag","vals","GLTFMaterialExtrasExtension","_GLTFMaterialsAlphaMapExtension","GLTFMaterialsAlphaMapExtensionImport","GLTFMaterialsAlphaMapExtensionExport","GLTFMaterialsAlphaMapExtension","materialParams","alphaMapDef","_GLTFMaterialsBumpMapExtension","GLTFMaterialsBumpMapExtensionImport","GLTFMaterialsBumpMapExtensionExport","GLTFMaterialsBumpMapExtension","_GLTFMaterialsDisplacementMapExtension","GLTFMaterialsDisplacementMapExtensionImport","GLTFMaterialsDisplacementMapExtensionExport","GLTFMaterialsDisplacementMapExtension","displacementMapDef","_GLTFMaterialsLightMapExtension","GLTFMaterialsLightMapExtensionImport","GLTFMaterialsLightMapExtensionExport","GLTFMaterialsLightMapExtension","lightMapDef","_GLTFObject3DExtrasExtension","GLTFObject3DExtrasExtension","RGBEPNGLoader","isFloat16Data","created","imageUrlToImageData","aType","rgbeToHalfFloat","float16Data","_GLTFViewerConfigExtension","resultScenes","scene1","resultScene","viewerConfig1","viewerConfig","currentResources","texIndex","matIndex","buff","imgIndex","encodingVersion","viewerData","b64","GLTFViewerConfigExtension","GLTFLoader","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFLightsExtension","GLTFMeshoptCompression","relativeUrl","_onError","gltf","dracoLoader","ktx2Loader","meshoptDecoder","textDecoder","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","GLTFBinaryExtension","GLTFParser","plugin","GLTFDracoMeshCompressionExtension","GLTFTextureTransformExtension","GLTFMeshQuantizationExtension","GLTFRegistry","nodeDefs","nodeLength","lightIndex","dependency","lightNode","assignExtrasToUserData","metallicRoughness","emissiveStrength","colorFactor","colorArray","handler","isSupported","byteOffset","attributesDef","nodeObject","instancedMeshes","BINARY_EXTENSION_HEADER_LENGTH","BINARY_EXTENSION_CHUNK_TYPES","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","WEBGL_COMPONENT_TYPES","GLTFCubicSplineInterpolant","stride2","stride3","td","m0","m1","GLTFCubicSplineQuaternionInterpolant","WEBGL_FILTERS","WEBGL_WRAPPINGS","WEBGL_TYPE_SIZES","INTERPOLATION","ALPHA_MODES","createDefaultMaterial","addUnknownExtensionsToUserData","knownExtensions","gltfDef","addMorphTargets","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","accessors","morphPositions","updateMorphTargets","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","attributesKey","getNormalizedComponentScale","getImageURIMimeType","isFirefox","firefoxVersion","dependencies","skinDefs","meshDefs","skinIndex","skinLength","ref","updateMappings","original","mappings","defs","bufferIndex","bufferDef","accessorIndex","pendingBufferViews","bufferViews","elementBytes","itemBytes","ibSlice","ibCacheKey","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","sourceIndex","sourceDef","sampler","preferUri","skipCache","URL","sourceURI","isObjectURL","sourceBlob","flip","texture2","gltfReference","useDerivativeTangents","useVertexColors","useFlatShading","pointsMaterial","hasExtrasExtension","materialType","kmuExtension","alphaMode","emissiveFactor","originalName","sanitizedName","createDracoPrimitive","addPrimitiveAttributes","geometryPromise","cameraIndex","skinDef","jointNodes","jointNode","animationIndex","animationName","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","inputAccessors","outputAccessors","inputAccessor","outputAccessor","createdTracks","nodePending","childPending","childrenDef","skeletonPending","meshPromise","sceneIndex","nodeIds","reduceAssociations","reducedAssociations","targetName","outputArray","scaled","interpolantType","computeBounds","boxScale","maxDisplacement","assignAttributeAccessor","glbEncryptionProcessor","aesGcmEncrypt","glbEncryptionPreparser","encryption","prefixBytes","binaryExtension","data2","aesGcmDecrypt","_SimpleJSONLoader","SimpleJSONLoader","_JSONMaterialLoader","json2","JSONMaterialLoader","MTLLoader2","delimiter_pattern","materialsInfo","ss","materialCreator","MaterialCreator","baseUrl","converted","mn","covmat","save","lprop","materialName","resolveURL","setMapForType","mapType","texParams","resolved","hasOpacity","matParams","_object_pattern","_material_library_pattern","_material_use_pattern","_map_use_pattern","_face_vertex_data_separator_pattern","_ab","_cb","ParserState","fromDeclaration","previousMaterial","libraries","previous","cloned","lastMultiMaterial","mi","declared","ua","ub","uc","na","nb","nc","vLen","ia","ic","nLen","uvLen","vi","uvi","OBJLoader2","lineFirstChar","vertexData","faceVertices","vertexParts","lineParts","lineVertices","lineUVs","li","llen","pointData","mtl_file","reason","isLine","isPoints","hasVertexColors","createdMaterials","miLen","sourceMaterial","materialHash","materialLine","materialPoints","ch2","wk","msg","ed","u8","u16","i32","fleb","fdeb","clim","freb","eb","fl","revfl","fd","revfd","rev","hMap","cd","mb","co","rvb","sv","r_1","flt","fdt","flm","flrm","fdm","fdrm","bits16","shft","slc","FlateErrorCode","ec","inflt","buf","dl","noBuf","resize","noSt","cbuf","bl","nbuf","lm","dm","lbt","dbt","tbts","hLit","hcLen","tl","ldt","clt","clb","clbmsk","clm","lms","dms","lpos","sym","add","dsym","shift","dend","wbits","wbits16","hTree","maxSym","mbt","ln","lft","cst","i2_1","i2_2","i2_3","cl","cli","cln","clen","wfblk","out","wblk","syms","lf","dlt","mlb","ddt","mdb","lclt","nlc","lcdt","ndc","lcfreq","lct","mlcb","nlcc","ftlen","dtlen","ll","llm","lcts","clct","deo","dflt","lvl","plvl","pre","post","lst","opt","msk_1","head","bs1_1","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","maxd","nl","mmd","md","ti","pti","lin","din","crct","crc","cr","adler","dopt","newDat","mrg","wcln","fnStr","ks","st_1","spInd","ch","cbfs","wrkr","fns","td_1","bInflt","inflateSync","pbf","gopt","bDflt","deflateSync","gze","gzh","gzhl","wbytes","guze","gzs","gzl","zle","zlh","zule","zls","cbify","astrm","strm","astrmify","flush","b4","b8","flg","zs","lv","StrmOpt","Deflate","chunk","endLen","newBuf","AsyncDeflate","deflate","Inflate","bts","AsyncInflate","inflate","Gzip","raw","AsyncGzip","gzip","gzipSync","Gunzip","AsyncGunzip","gunzip","gunzipSync","Zlib","AsyncZlib","zlib","zlibSync","Unzlib","AsyncUnzlib","unzlib","unzlibSync","Decompress","AsyncDecompress","decompressSync","fltn","tds","dutf8","DecodeUTF8","EncodeUTF8","strToU8","latin1","ar_1","ar","ai","strFromU8","dbf","slzh","zh","fnl","es","z64e","sc","off","exfl","ex","wzh","exl","exf","wzf","ZipPassThrough","ZipDeflate","AsyncZipDeflate","Zip","fl_1","com","hl_1","chks_1","pAll_1","_i","chks_2","chk","tr_1","ind_1","uf_1","nxt","cl_1","dd","zip","tot","slft","term","tAll","cbd","cbf","cdl","badd","loc","_loop_1","ms","compression","cbl","zipSync","UnzipPassThrough","UnzipInflate","AsyncUnzipInflate","Unzip","toAdd","is","_loop_2","sig","this_1","cmp_1","chks_3","sc_1","su_1","fn_1","d_1","file_1","ctr","chks_4","state_1","unzip","fltr","_loop_3","c_1","no","infl","unzipSync","c_2","findSpan","calcBasisFunctions","span","saved","rv","calcBSplinePoint","Nj","wNj","calcBasisFunctionDerivatives","zeroArr","ders","ndu","rk","pk","j1","j2","calcBSplineDerivatives","nd","du","CK","nders","Pw","calcKoverI","nom","calcRationalCurveDerivatives","Pders","Aders","wders","calcNURBSDerivatives","NURBSCurve","degree","knots","controlPoints","startKnot","endKnot","hpoint","NURBSUtils.calcBSplinePoint","NURBSUtils.calcNURBSDerivatives","fbxTree","connections","sceneGraph","FBXLoader","FBXBuffer","isFbxFormatBinary","BinaryParser","FBXText","convertArrayBufferToString","isFbxFormatASCII","getFbxVersion","TextParser","textureLoader","FBXTreeParser","deformers","geometryMap","GeometryParser","connectionMap","rawConnection","fromID","toID","relationship","parentRelationship","childRelationship","blobs","videoNodes","nodeID","videoNode","arrayBufferContent","base64Content","content","fileName","textureMap","textureNodes","textureNode","wrapModeU","wrapModeV","valueU","valueV","currentPath","materialMap","materialNodes","materialNode","ID","DeformerNodes","deformerNode","relationships","deformerNodes","rawBones","boneNode","rawBone","rawMorphTargets","morphTargetNode","rawMorphTarget","modelMap","modelNodes","modelNode","connection","generateTransform","AnimationParser","subBone","cameraAttribute","nearClippingPlane","farClippingPlane","lightAttribute","geo","transformData","getEulerOrder","lookAtTarget","bindMatrices","geoID","geoConnParent","BindPoseNode","poseNodes","poseNode","ambientColor","geoNodes","geoNode","preTransform","geoInfo","prevMaterialIndex","currentIndex","lastGroup","polygonIndex","faceLength","displayedWeightsWarning","facePositionIndexes","faceNormals","faceColors","faceUVs","faceWeights","faceWeightIndices","vertexIndex","polygonVertexIndex","endOfFace","weightIndices","getData","wIndex","Weight","weightIndex","comparedWeight","comparedWeightIndex","comparedWeightArray","normalVector","bitangent","normalTangent","normalBitangent","triangulationInput","parentGeo","parentGeoNode","rawTarget","morphGeoNode","vertexIndices","morphPositionsSparse","morphIndex","morphGeoInfo","morphBuffers","NormalNode","mappingType","referenceType","indexBuffer","UVNode","ColorNode","MaterialNode","materialIndexBuffer","materialIndices","pointsValues","animationClips","rawClips","rawClip","curveNodesMap","layersMap","rawCurveNodes","rawCurveNode","curveNode","rawCurves","animationCurve","convertFBXTimeToSeconds","animationCurveID","animationCurveRelationship","rawLayers","layerCurveNodes","modelID","rawModel","deformerID","morpherID","rawStacks","rawTracks","initialPosition","initialScale","positionTrack","rotationTrack","scaleTrack","morphTrack","modelName","initialValue","preRotation","postRotation","eulerOrder","quaternionValues","morphNum","lastValue","prevValue","xIndex","yIndex","zIndex","xValue","yValue","zValue","curvex","curvey","curvez","initialValueRad","currentValueRad","valuesSpan","absoluteSpan","numSubIntervals","E1","E2","Q1","Q2","initialTime","timeSpan","FBXTree","matchComment","matchEmpty","matchBeginning","matchProperty","nodeAttrs","attrs","currentNode","contentLine","connProps","parseNumberArray","innerPropName","innerPropType1","innerPropType2","innerPropFlag","innerPropValue","BinaryReader","allNodes","endOffset","numProperties","nameLen","propertyList","attrName","subNode","compressedLength","fflate.unzlibSync","reader2","littleEndian","nullByte","CORRECT","cursor","read","versionRegExp","dataArray","infoObject","slice","tempEuler","tempVec","lTranslationM","lPreRotationM","lRotationM","lPostRotationM","lScalingM","lScalingPivotM","lScalingOffsetM","lRotationOffsetM","lRotationPivotM","lParentGX","lParentLX","lGlobalT","inheritType","lLRM","lParentGRM","lParentTM","lParentGRSM","lParentGSM","lLSM","lGlobalRS","lParentLSM_inv","lParentGSM_noLocal","lRotationPivotM_inv","lScalingPivotM_inv","lTransform","lLocalTWithAllPivotAndOffsetInfo","lGlobalTranslation","enums","FBXLoader2","ZipLoader","fileBuffer","supportedEmbeddedFiles","_GLTFLoader2","newp","getDependency","deserializeUserData","createUniqueName","auto","tempPathDrc","tempPathKtx2","needsDrc","drc","ktx2","tempFiles","bundled","preparser","useMeshLines","refMap","roots","convertToFatLine","extraExtensions","GLTFLoader2","line2","gltfExtensions","_taskCache","DRACOLoader","workerLimit","attributeIDs","attributeTypes","vertexColorSpace","taskConfig","taskKey","cachedTask","worker","taskID","taskCost","geometryPending","_worker","geometryData","inputColorSpace","useJS","librariesPending","jsContent","DRACOWorkerStr","body","_DRACOLoader2","encoder","jsString","DRACOLoader2","EXRLoader","logBase","reverseLutFromBitmap","bitmap","lut","hufClearDecTable","hdec","getBitsReturn","getBits","nBits","uInt8Array","inOffset","parseUint8Array","hufTableBuffer","hufCanonicalCodeTable","hcode","hufUnpackEncTable","ni","im","iM","zerun","hufLength","hufCode","hufBuildDecTable","hdecod","plOffset","getCharReturn","getChar","getCodeReturn","getCode","po","rlc","outBuffer","outBufferOffset","outBufferEndOffset","UInt16","Int16","wdec14Return","wdec14","ls","hi","as","wdec16","bb","aa","wav2Decode","nx","ny","w14","ey","oy1","oy2","ox1","ox2","i00","i01","i10","i11","p01","p10","p11","hufDecode","encodingTable","decodingTable","outOffset","inOffsetEnd","hufUncompress","inDataView","nCompressed","nRaw","initialInOffset","parseUint32","freq","applyLut","nData","predictor","interleaveScalar","decodeRunLength","lossyDctDecode","cscSet","rowPtrs","channelData","acBuffer","dcBuffer","numComp","numFullBlocksX","numBlocksX","numBlocksY","leftoverX","leftoverY","currAcComp","currDcComp","dctData","halfZigBlock","rowBlock","rowOffsets","comp","blocky","blockx","unRleAC","unZigZag","dctInverse","csc709Inverse","convertToHalf","halfRow","decodeFloat16","acValue","dctComp","row","rowPtr","column","toLinear","float","uncompressRAW","uncompressRLE","compressed","rawBuffer","tmpBuffer","uncompressZIP","uncompressPIZ","outBufferEnd","pizChannelData","minNonZero","parseUint16","maxNonZero","parseUint8","maxValue","tmpOffset","cp","uncompressPXR","tmpBufferEnd","writePtr","ptr","pixel","uncompressDWA","dwaHeader","parseInt64","EXRHeader","channelRules","ruleSize","parseNullTerminatedString","csc","rule","rleBuffer","zlibInfo","chan","rleOffset","rowOffsetBytes","byte","uintBuffer","stringValue","parseFixedLengthString","parseRational","parseInt32","parseTimecode","Int32","Uint32","Uint8","int","parseFloat32","decodeFloat32","binary","fraction","Uint16","parseFloat16","parseChlist","startOffset","pixelType","pLinear","xSampling","ySampling","parseChromaticities","redX","redY","greenX","greenY","blueX","blueY","whiteX","whiteY","parseCompression","compressionCodes","parseBox2i","xMin","yMin","xMax","yMax","parseLineOrder","lineOrders","lineOrder","parseV2f","parseV3f","parseValue","parseHeader","spec","keepReading","attributeType","attributeSize","attributeValue","setupDecoder","outputType","EXRDecoder","fillAlpha","bufferDataView","scanlineBlockIdx","line_y","scan_y","true_y","lineOffset","outLineOffset","channelID","lOff","cOff","outIndex","onLoadCallback","Rhino3dmLoader","objectPending","_mat","renderEnvironment","pbr","instanceDefinitionObjects","instanceDefinitions","instanceReferences","matId","rMaterial","_object","iDef","objId","idoId","iRef","xf","iRefObject","font","jsLoader","binaryLoader","binaryContent","Rhino3DMWorkerStr","_Rhino3dmLoader2","castShadow","receiveShadow","layerIndex","materialSource","colorSource","instances","instances2","instanced","toHide","getUrlQueryParam","Rhino3dmLoader2","_SVGTextureLoader","SVGTextureLoader","VideoLoader","_onProgress","videoEl","onVideoLoad","onVideoError","VideoTextureLoader","videoTexture","vid","_GLTFExporter2","processor","gltfOptions","onDone1","extras","inputs","GLTFExporter2","SimpleJSONExporter","jsonSpaces","SimpleTextExporter","textEncoder","ZIP_COMPRESSION","EXRExporter","arg1","arg2","arg3","supportedRTT","buildInfoRTT","dataBuffer","getPixelData","rawContentBuffer","reorganizeDataBuffer","compressData","fillData","supportedDT","buildInfoDT","compressionSizes","WIDTH","HEIGHT","TYPE","FORMAT","COMPRESSION","EXPORTER_TYPE","OUT_TYPE","COMPRESSION_SIZE","COLOR_SPACE","rtt","inBuffer","dec","cOffset","getValue","getFloat32","getFloat16","setValue","setFloat16","setFloat32","dv","decodeLinear","compress","compressNONE","compressZIP","block","fflate.zlibSync","fillHeader","setUint32","setString","setUint8","setUint64","TableSize","HeaderSize","EXRExporter2","assetExportHook","hooks","savedMaps","replaceExternalTextures","objectList","meshLines","fomMap","geomMap","matCloneMap","savedTextures","obj1","processGLTFAnimations","geomOverride","replaceExternalGeometry","processMeshLines","processObjectMaterials","textures1","revertExternalTextures","revertMeshLines","fom","extMaps","g1","rootRefs","line1","isArr","materialsArr","setMaterialRef","mat2","mat3","AssetExporter","exporters","exporter","excluded","matToJson","zippa","expBlob","zipped","_options","MaterialManager","legacyBumpScaleFixSetup","register","oldMaterial","disposeRuntimeMaterials","typeSlug","useSourceMaterial","materialTemplate","createFromTemplate","ignoreSource","minify","download","serialized","nameRegexOrUuid","currentMats","applied","mType","newMat","RGBELoader","rgbe_error","rgbe_error_code","fgets","lineLimit","consume","RGBE_ReadHeader","magic_token_re","gamma_re","exposure_re","format_re","dimensions_re","RGBE_ReadPixels_RLE","scanline_width","data_rgba","ptr_end","rgbeStart","scanline_buffer","num_scanlines","isEncodedRun","byteValue","RGBEByteToRGBFloat","sourceOffset","destArray","destOffset","RGBEByteToRGBHalf","byteArray","rgbe_header_info","image_rgba_data","numElements","floatArray","halfArray","legacySeparateMapSamplerUVFix","objs","PolyhavenMaterialGLTFLoader","_AssetManager","cacheOptions","autoSetEnvironment","autoSetBackground","imps","imp","processRawStartHook","deps","models","others","gltfExtension","ext1","exporter2","ind1","ind2","AssetManager","newMaterials","newCamera","newLight","_Object3DManager","inRoot","oldMaterials","oldGeometry","removedTextures","addedTextures","timeline","existing","isNewMaterial","isNewGeometry","isNewTexture","nameOrUuid","Object3DManager","RenderManager","renderScale","targetOptions","replaceId","pass1","destination","copyPass","oldUniforms","oldClear","oldTransparent","oldViewport","oldScissor","oldScissorTest","oldTarget","oldBlending","oldOpacity","oldBlendAlpha","oldBlendSrc","oldBlendDst","oldBlendEquation","lastTarget","hdrFormats","hdr","processNewTarget","disposeTarget","unregister","uiMonitor","rgbm","doTransmissionFix","_PopmotionPlugin","ff","options1","animateFunc","from1","anim","lastVal","currentPos","totalTravel","viewSize","delay2","accOnUpdate","oUpdaters","anims","parallel","delay1","PopmotionPlugin","InteractionPromptPlugin","sphericalPosition","canvasBounds","cursorX","cursorY","_CameraViewPlugin","wrap","throwOnStop","incl","normalizeDuration","interactionPrompt","popmotion","selected","selectedArray","viewDuration","pauseTime","time1","selectedTime","CameraViewPlugin","DropzonePlugin","dialog","nativeEvent","assets","Uncharted2ToneMappingShader","TonemapShader","TonemapShaderPatch","_PipelinePassPlugin","wrapThisFunction2","PipelinePassPlugin","GBufferUnpack","GBufferPlugin","isPrimaryGBuffer","renderFlagsBuffer","renderDepthTexture","useMultiple","recreateTarget","rm","preprocessMaterial","AScreenPassExtensionPlugin","shaderPatch","Uncharted2Tonemapping","TonemapPlugin","toneMappingExposure","updateBit","VERSION","getPluginTypes","prot","debug","computedStyle","rmClass","promises","setBackground","setEnvironment","useExporterPlugin","blobPromise","syncPlugins","asyncPlugins","isResized","dirtyPlugins","ptype","oldType","devicePixelRatio","containerSize","containerRect","containerHeight","containerWidth","containerAspect","dpr","renderWidth","renderHeight","pluginFilter","resources2","sortedListeners","mount","unmount","thisPlugin","um","lis","windowDialogWrapper","CullFaceFrontBack","BasicShadowMap","NearestMipMapNearestFilter","NearestMipMapLinearFilter","LinearMipMapNearestFilter","ZeroStencilOp","ReplaceStencilOp","IncrementStencilOp","DecrementStencilOp","IncrementWrapStencilOp","DecrementWrapStencilOp","InvertStencilOp","NeverStencilFunc","LessStencilFunc","EqualStencilFunc","LessEqualStencilFunc","GreaterStencilFunc","NotEqualStencilFunc","GreaterEqualStencilFunc","DynamicDrawUsage","StreamDrawUsage","StaticReadUsage","DynamicReadUsage","StreamReadUsage","StaticCopyUsage","DynamicCopyUsage","StreamCopyUsage","Wireframe","UVsDebug","processFace","vnum","WorkerPool","workerId","workerCreator","Ot","Ft","$t","Sn","In","Si","Ii","Ti","Ei","Pi","_activeLoaders","_zstd","KTX2Loader","transcoderBinary","transcodeResult","dfdFlags","parseColorSpace","KHR_DF_FLAG_ALPHA_PREMULTIPLIED","VK_FORMAT_UNDEFINED","createRawTexture","texturePending","UNCOMPRESSED_FORMATS","FORMAT_MAP","VK_FORMAT_R32G32B32A32_SFLOAT","VK_FORMAT_R16G16B16A16_SFLOAT","VK_FORMAT_R8G8B8A8_UNORM","VK_FORMAT_R8G8B8A8_SRGB","VK_FORMAT_R32G32_SFLOAT","VK_FORMAT_R16G16_SFLOAT","VK_FORMAT_R8G8_UNORM","VK_FORMAT_R8G8_SRGB","VK_FORMAT_R32_SFLOAT","VK_FORMAT_R16_SFLOAT","VK_FORMAT_R8_SRGB","VK_FORMAT_R8_UNORM","VK_FORMAT_ASTC_6x6_SRGB_BLOCK","VK_FORMAT_ASTC_6x6_UNORM_BLOCK","TYPE_MAP","vkFormat","zstd","KHR_SUPERCOMPRESSION_ZSTD","ZSTDDecoder","levelIndex","levelWidth","levelHeight","levelDepth","levelData","KHR_SUPERCOMPRESSION_NONE","dfd","KHR_DF_PRIMARIES_BT709","KHR_DF_TRANSFER_SRGB","KHR_DF_PRIMARIES_DISPLAYP3","KHR_DF_PRIMARIES_UNSPECIFIED","KTXLoader","loadMipmaps","ktx","KhronosTextureContainer","HEADER_LEN","COMPRESSED_2D","facesExpected","identifier","dataSize","headerDataView","dataOffset","mipmapCount","imageSize","USDAParser","stack","assignment","lhs","rhs","USDZLoader","parseAssets","isCrateFile","fflate.strFromU8","fileHeader","crateHeader","findUSD","firstFileName","isCrate","fflate.unzipSync","findMeshGeometry","findGeometry","buildGeometry","toFlatBufferAttribute","findMeshMaterial","findMaterial","setTextureParams","data_value","buildMaterial","surface","findTexture","buildTexture","buildObject","buildHierarchy","PLYLoader","headerLength","patternHeader","headerText","make_ply_element_property","propertValues","propertyNameMapping","lineValues","parseASCIINumber","parseASCIIElement","tokens","customProperty","mapElementAttributes","elementNames","findAttrName","parseASCII","patternBody","ArrayStream","elementDesc","attributeMap","handleElement","postProcess","elementName","cacheEntry","elementProperty","vertex_indices","texcoord","binaryReadElement","valueReader","setPropertyBinaryReaders","little_endian","getBinaryReader","dataview","parseBinary","currentElementCount","extractHeaderText","bytes","cont","startLine","hasCRNL","STLLoader","isBinary","face_size","n_faces","matchDataViewAt","query","hasColors","defaultR","defaultG","defaultB","normalX","normalY","normalZ","packedColor","vertexstart","componentIdx","patternSolid","patternFace","patternName","faceCounter","patternFloat","patternVertex","patternNormal","groupNames","startVertex","endVertex","vertexCountPerFace","normalCountPerFace","ensureString","ensureBinary","array_buffer","binData","GPUComputationRenderer","sizeX","sizeY","dataType","passThruUniforms","passThruShader","createShaderMaterial","getPassThroughFragmentShader","variableName","computeFragmentShader","initialValueTexture","variable","depVar","found","currentTextureIndex","nextTextureIndex","variables","renderTargets","addResolutionDefine","materialShader","getPassThroughVertexShader","sizeXTexture","sizeYTexture","currentShadowAutoUpdate","_face","_uva","_uvb","_uvc","MeshSurfaceSampler","indexAttribute","weightAttribute","totalFaces","faceWeight","distribution","cumulativeTotal","randomFunction","targetNormal","targetColor","targetUV","Visible","Deleted","_line3","ConvexHull","VertexList","VertexNode","tNear","tFar","vN","vD","absorbingFace","nextVertex","newFaces","maxDistance","maxFace","minVertices","maxVertices","extremes","Face","activeFaces","eyeVertex","eyeFace","eyePoint","crossEdge","horizon","edge","twinEdge","oppositeFace","horizonEdge","firstSideEdge","previousSideEdge","sideEdge","e0","HalfEdge","BaseImporterPlugin","BaseGroundPlugin","orbit","ACameraControlsPlugin","_AAssetManagerProcessStatePlugin","createDiv","AAssetManagerProcessStatePlugin","AddBlendTexturePass","SSAAPlugin","rendersPerFrame","ProgressivePlugin","frameCount","main","sample","maxFrameCount","recreate","ProgressiveBlendPass","postRender","ssaa","DepthBufferUnpack","DepthBufferPlugin","depthPacking","MeshDepthMaterialOverride","NormalBufferPlugin","MeshNormalMaterialOverride","FrameFadePlugin","FrameFadeBlendPass","lastFrame","ssaoPass","ssaoPatch","SSAOPlugin","newExtension","SSAOPluginPass","disabled","_material","saoData","saoBiasEpsilon","RenderTargetPreviewPlugin","targetBlock","canvasRect","outputColorSpace","createStyles","originalColorSpace","targetDef","target1","GeometryUVPreviewPlugin","link","_ViewerUiConfigPlugin","ViewerUiConfigPlugin","_SceneUiConfigPlugin","SceneUiConfigPlugin","FullScreenPlugin","LoadingScreenPlugin","spinner1","sceneObjects","processState","html","updateVisibility","escapeHtml","SelectionWidget","_AHelperWidget","attach","generateUiFolder","AHelperWidget","ACameraHelperWidget","ALightHelperWidget","_BoneHelper","BoneHelper","BoxSelectionWidget","matLine","_CameraHelper2","generateVertices","colorAttribute2","setXYZ","CameraHelper2","position1","_DirectionalLightHelper2","DirectionalLightHelper2","_LineHelper","getPointsForCurve","existingCubes","point1","cube","parr","handleData","curve1","curveIndex","LineHelper","points1","_PointLightHelper2","PointLightHelper2","_SkeletonHelper2","parentHas","helper","SkeletonHelper2","_SpotLightHelper2","SpotLightHelper2","getRootIfWidget","_PickingPlugin","selection","pickUi","autoFocus","frameFade","widget","assetMat","oldMat","matC","focusCamera","trackUndo","materials1","matType","PickingPlugin","MultiSelectHelper","median","dummyStartInv","newWorld","parentInv","undoManager","startStates","endStates","TransformControlsPlugin","picking","TransformControls2","command","isAns","PivotControlsPlugin","PivotControls2","_pos","PivotEditPlugin","newObject","objectChanged","markerWidget","undoFn","newPos","pivotPos","tcp","pcp","newPivotPos","EditorViewWidgetPlugin","_DeviceOrientationControlsPlugin","_domElement","DeviceOrientationControlsPlugin","_PointerLockControlsPlugin","PointerLockControlsPlugin","_ThreeFirstPersonControlsPlugin","ThreeFirstPersonControlsPlugin","_UndoManagerPlugin","limit","JSUndoManager","recordUndoCommand","targ","uid","onUndoRedo","resAction","forceOnChange","setValueUndoCommand","proxy","createBindingsProxy","UndoManagerPlugin","Rhino3dmLoadPlugin","_USDZLoadPlugin","USDZLoadPlugin","_PLYLoadPlugin","PLYLoadPlugin","_STLLoadPlugin","STLLoadPlugin","_KTXLoadPlugin","KTXLoadPlugin","_KTX2LoadPlugin","KTX2Loader2","glTFTextureBasisUExtensionExport","KTX2LoadPlugin","cloneFn","buffer2","KHR_TEXTURE_BASISU","sourceBuffer","_GLTFMeshOptDecodePlugin","SimpleEventDispatcher","initialize","GLTFMeshOptDecodePlugin","_AssetExporterPlugin","AssetExporterPlugin","CanvasSnapshotPlugin","progressive","waitForProgressive","lastMaxFrames","_CanvasSnipperPlugin","CanvasSnipperPlugin","_FileTransferPlugin","FileTransferPlugin","vignette","VignettePlugin","ChromaticAberration","ChromaticAberrationPlugin","FilmicGrain","FilmicGrainPlugin","_GLTFAnimationPlugin","PointerDragHelper","_ev","clipData","resetOnEnd","wasPlaying","isAllAnimations","listen","loops","scrollAnimate","pageScrollAnimate","dragAnimate","animTime1","absMax","ts","animDelta","clipDuration","isActive","replay","scrollMax","GLTFAnimationPlugin","_TransformAnimationPlugin","oq","os","ep","eq","TransformAnimationPlugin","_AnimationObjectPlugin","visibleBtns","btn","btns","ao","activeIndex","obs","ao1","getAo","localTime","offsetTimes","closestIndex","curr","access","observers","uiConfigs","keyPath","cTime","cao","shownActiveIndex","btnObserver","AnimationObjectPlugin","ClearcoatTintPlugin","tfUd","material1","tf","clearCoatTintGLTFExtension","GLTFMaterialsClearcoatTintExtensionImport","glTFMaterialsClearcoatTintExtensionExport","NoiseBumpMaterialPluginPars","NoiseBumpMaterialPluginPatch","NoiseBumpMaterialPlugin","noiseBumpMaterialGLTFExtension","GLTFMaterialsNoiseBumpMaterialImport","glTFMaterialsNoiseBumpMaterialExport","CustomBumpMapPluginShader","CustomBumpMapPlugin","enableCustomBump","possible","customBumpMapGLTFExtension","GLTFMaterialsCustomBumpMapImport","glTFMaterialsCustomBumpMapExport","customBumpMapDef","ParallaxMappingPluginReliefShader","ParallaxMappingPlugin","FragmentClippingExtensionPluginPars","FragmentClippingExtensionPluginPatch","FragmentClippingExtensionPlugin","PlaneThree","FragmentClippingMode","clipParams","fragmentClippingGLTFExtension","GLTFMaterialsFragmentClippingExtensionImport","glTFMaterialsFragmentClippingExtensionExport","VirtualCamerasPlugin","vCam","addTargetPreview","defaultData","_CascadedShadowsPlugin","cascades","breaks","amount","CSMFrustum","shadowCam","nearVerts","farVerts","point2","squaredBBWidth","linearDepth","margin","farValue","frustums","shadowMapSize","lightMargin","lightPos","centers","texelWidth","same","CascadedShadowsPlugin","maxFar","isOrthographic","absZ","cascade","cameraMatrix","_MaterialConfiguratorBasePlugin","variations","matUuidOrIndex","setSelectedIndex","fromMaterial","preview","viewerSetDirty","imageBitmapToBase64","makeColorSvgCircle","looping","variation","sortedTimeline","selectedItemI","previousTime","isSeeking","notSelected","variationKey","cloneMaterial","MaterialConfiguratorBasePlugin","_SwitchNodeBasePlugin","child1","cv","refreshUi","SwitchNodeBasePlugin","updateAttribute","updateIndices","updateUi","childrenUi","oldUi","dividerIndex","removeUi","AGeometryGenerator","TorusGeometryGenerator","defaultParams","CircleGeometryGenerator","BoxGeometryGenerator","SphereGeometryGenerator","PlaneGeometryGenerator","CylinderGeometryGenerator","curveUiConfigs","radiusConfig","origOnChange","prev2","uic","createCurveTypeDropdown","newCurve","onTypeChange","configs","oldSettings","propsC1","k2","createCurvePropertyUi","folder","TubeGeometryGenerator","tubeGeom","normalAttr","uvAttr","filtered","createShapeFromPreset","shapeType","sides","pr","reverseShapeWinding","ShapeGeometryGenerator","shapeGeom","allUi","TubeShapeGeometryGenerator","presetShape","tubeShapeGeom","_LineGeometryGenerator","closePath","curveFolder","propUi","LineGeometryGenerator","_GeometryGeneratorPlugin","gen","generator","geometry1","toTitleCase","GeometryGeneratorPlugin","ShapeTubeExtrudePlugin","circleCurve","shapeScaleX","shapeScaleY","materialSplits","horizontalSplits","oldUuid","oldObj","minPoint","hdriGroundProj","HDRiGroundPlugin","promptOnBackgroundMismatch","bg","cubeMat","unif","voidMain","_Object3DWidgetsPlugin","inSceneRoot","ignored","helpers","widgetsToRemove","Object3DWidgetsPlugin","Object3DGeneratorPlugin","addToScene","cmd","generators","ContactShadowGroundPlugin","blurTarget","_SimplifyModifierPlugin","disposeOnReplace","simplified","oldBB","oldSize","diffPerc","doAll","SimplifyModifierPlugin","MeshOptSimplifyModifierPlugin","srcIndexArray","srcPositionArray","dstIndexArray","ensureUniqueNames","variantNames","uniqueNames","knownNames","uniqueName","mappingsArrayToTable","table","variant","compatibleObject","khrMaterialsVariantsGLTF","GLTFMaterialsVariantsExtensionImport","variantsDef","variants","association","extensionsDef","ensureLoadVariants","variantMaterials","variantName","variantMaterial","compatibleMaterial","GLTFExporterMaterialsVariantsExtensionExport","variantNameTable","mappingTable","variantMaterialInstance","variantIndex","mappingsDef","originalMaterialIndex","_input","gltfExporterMaterialsVariantsExtensionExport","_GLTFKHRMaterialVariantsPlugin","khrMaterialVariantsGLTFExtension","doTraverse","apply","GLTFKHRMaterialVariantsPlugin","TailwindCSSCDNPlugin","_DynamicImportPlugin","pathOrModule","mod","pluginType","pluginC","DynamicImportPlugin","sampleThreepipeViteHmrPlugin","server","modules","invalidatedModules","pathExport","basicObjectConstraints","invert","_isTarget","originalEuler","targetEuler","targetRotation","newRotation","targetScale","uniformSum","newScale","uniformScale","_props","targetMatrix","originalPos","originalQuat","originalScale","targetPos","targetQuat","followCurve","getPos","worldTarget","worldDirection","originalRotation","rotationChanged","lookAtPos","upAxis","segmentLengths","totalLength","currentDistance","segmentT","ObjectConstraintsPlugin","constraint","constraintOrType","ObjectConstraint","targetObj","constraintIndex","animObjectPlugin","isTarget","tp","oldProps","type1","type2","literalStrings","_TypeSystem","sid","typeStr","allowSerializable","typ","custom","srcClass","tarClass","union","srcV","TypeSystem","ItemRef","ReferenceManager","itemData","isLoaded","itemObject","_ReferenceManager","refOwner","refSet","refs","valRaw","getComponentTypes","Object3DComponent","setupComponent","getComponentStateProperties","uiChildren","propsMeta","stateProp","defaultValueType","propType","getStateProperty","setStateProperty","assignVal","uiC","generateComponentPropertyUi","ComponentCache","lastState","refreshAllStateProperties","oldValueRaw","teardownComponent","_ComponentCache","stateProps","exis","valType","refDefNew","newRefId","canBeNull","classTypes","newConfig","literalTypes","_Object3DComponent","oldState","EntityComponentPlugin","_SampleBodyComponent","impulse","SampleBodyComponent","_EntityComponentPlugin","dropdown","comps","offUpdate","stateOrType","typeTarget","compSet","typeSet","ECS","_testFinish","_testStart","autoCenterObject3D","autoScaleObject3D"],"mappings":"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,KAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4DAE7BC,KAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAE3BC,KAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEhCC,KAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAE1BC,KAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAExBC,KAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAEnBC,KAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAE3BC,KAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,SAElBC,KAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAEvBC,KAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAElBC,KAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAEpBC,KAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAEvBC,KAA4B;AAAA;AAAA,SAE5BC,KAAuB;AAAA;AAAA,SAEvBC,KAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yDAE5BC,KAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAExBC,KAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAE7BC,KAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAEnBC,KAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAEjBC,KAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAEZC,KAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEtB,MAAMC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEbC,KAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAEXC,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqNV;AAAA;AAAA,IACU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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CpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GAEpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GAEpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,EAAe1wK,EAAK,EAAE,CAAE,GACpC5V,EAAK,EAAE,IAAKsmL,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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","x_google_ignoreList":[0,1,10,12,16,30,37,38,42,43,44,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,121,122,128,142,143,144,145,154,155,161,162,173,179,180,181,182,186,188,189,197,202,223,224,225,226,227,228,229,230,231,232,233,234,235,236]}